Optimize get new stack for calls.

This commit is contained in:
Enyby
2018-09-20 20:14:02 +03:00
committed by GitHub
parent 24a8559ceb
commit 88a557033b

View File

@@ -127,18 +127,20 @@ public class LuaClosure extends LuaFunction {
return "function: " + p.toString(); return "function: " + p.toString();
} }
private LuaValue[] getNewStack() {
int max = p.maxstacksize;
LuaValue[] stack = new LuaValue[max];
System.arraycopy(NILS, 0, stack, 0, max);
return stack;
}
public final LuaValue call() { public final LuaValue call() {
LuaValue[] stack = new LuaValue[p.maxstacksize]; LuaValue[] stack = getNewStack();
for (int i = 0; i < p.numparams; ++i )
stack[i] = NIL;
return execute(stack,NONE).arg1(); return execute(stack,NONE).arg1();
} }
public final LuaValue call(LuaValue arg) { public final LuaValue call(LuaValue arg) {
LuaValue[] stack = new LuaValue[p.maxstacksize]; LuaValue[] stack = getNewStack();
System.arraycopy(NILS, 0, stack, 0, p.maxstacksize);
for (int i = 1; i < p.numparams; ++i )
stack[i] = NIL;
switch ( p.numparams ) { switch ( p.numparams ) {
default: stack[0]=arg; return execute(stack,NONE).arg1(); default: stack[0]=arg; return execute(stack,NONE).arg1();
case 0: return execute(stack,arg).arg1(); case 0: return execute(stack,arg).arg1();
@@ -146,9 +148,7 @@ public class LuaClosure extends LuaFunction {
} }
public final LuaValue call(LuaValue arg1, LuaValue arg2) { public final LuaValue call(LuaValue arg1, LuaValue arg2) {
LuaValue[] stack = new LuaValue[p.maxstacksize]; LuaValue[] stack = getNewStack();
for (int i = 2; i < p.numparams; ++i )
stack[i] = NIL;
switch ( p.numparams ) { switch ( p.numparams ) {
default: stack[0]=arg1; stack[1]=arg2; return execute(stack,NONE).arg1(); default: stack[0]=arg1; stack[1]=arg2; return execute(stack,NONE).arg1();
case 1: stack[0]=arg1; return execute(stack,arg2).arg1(); case 1: stack[0]=arg1; return execute(stack,arg2).arg1();
@@ -157,9 +157,7 @@ public class LuaClosure extends LuaFunction {
} }
public final LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) { public final LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) {
LuaValue[] stack = new LuaValue[p.maxstacksize]; LuaValue[] stack = getNewStack();
for (int i = 3; i < p.numparams; ++i )
stack[i] = NIL;
switch ( p.numparams ) { switch ( p.numparams ) {
default: stack[0]=arg1; stack[1]=arg2; stack[2]=arg3; return execute(stack,NONE).arg1(); default: stack[0]=arg1; stack[1]=arg2; stack[2]=arg3; return execute(stack,NONE).arg1();
case 2: stack[0]=arg1; stack[1]=arg2; return execute(stack,arg3).arg1(); case 2: stack[0]=arg1; stack[1]=arg2; return execute(stack,arg3).arg1();
@@ -173,7 +171,7 @@ public class LuaClosure extends LuaFunction {
} }
public final Varargs onInvoke(Varargs varargs) { public final Varargs onInvoke(Varargs varargs) {
LuaValue[] stack = new LuaValue[p.maxstacksize]; LuaValue[] stack = getNewStack();
for ( int i=0; i<p.numparams; i++ ) for ( int i=0; i<p.numparams; i++ )
stack[i] = varargs.arg(i+1); stack[i] = varargs.arg(i+1);
return execute(stack,p.is_vararg!=0? varargs.subargs(p.numparams+1): NONE); return execute(stack,p.is_vararg!=0? varargs.subargs(p.numparams+1): NONE);