Improve upvalue processing
This commit is contained in:
@@ -321,22 +321,34 @@ public class JavaGen {
|
||||
* R(A+2)): if R(A+3) ~= nil then R(A+2)=R(A+3)
|
||||
* else pc++
|
||||
*/
|
||||
builder.createUpvalues(pc, a+3, c);
|
||||
// v = stack[a].invoke(varargsOf(stack[a+1],stack[a+2]));
|
||||
// if ( (o=v.arg1()).isnil() )
|
||||
// ++pc;
|
||||
builder.loadLocal(pc, a);
|
||||
builder.loadLocal(pc, a+1);
|
||||
builder.loadLocal(pc, a+2);
|
||||
builder.invoke(2); // varresult on stack
|
||||
for ( int i=0; i<c; i++ ) {
|
||||
if ( i+1 < c )
|
||||
builder.dup();
|
||||
builder.arg( i+1 );
|
||||
builder.storeLocal(pc, a+3+i);
|
||||
}
|
||||
builder.loadLocal(pc, a+3);
|
||||
builder.dup();
|
||||
builder.storeVarresult();
|
||||
builder.arg( 1 );
|
||||
builder.isNil();
|
||||
builder.addBranch(pc, JavaBuilder.BRANCH_IFNE, pc+2);
|
||||
builder.loadLocal(pc, a+3);
|
||||
|
||||
// a[2] = a[3] = v[1]
|
||||
builder.createUpvalues(pc, a+3, c);
|
||||
builder.loadVarresult();
|
||||
builder.dup();
|
||||
builder.arg( 1 );
|
||||
builder.dup();
|
||||
builder.storeLocal(pc, a+2);
|
||||
builder.storeLocal(pc, a+3);
|
||||
|
||||
// a[a+2+i] = v[2+i], i=2..c
|
||||
for ( int i=2; i<=c; i++ ) {
|
||||
if ( i<c ) builder.dup();
|
||||
builder.arg( i );
|
||||
builder.storeLocal(pc, a+2+c);
|
||||
}
|
||||
break;
|
||||
|
||||
case Lua.OP_SETLIST: /* A B C R(A)[(C-1)*FPF+i]:= R(A+i), 1 <= i <= B */
|
||||
|
||||
@@ -166,6 +166,13 @@ public class Slots {
|
||||
|
||||
case Lua.OP_JMP: /* sBx pc+=sBx */
|
||||
branchdest[index+1+sbx] = true;
|
||||
ins = p.code[index+0+sbx];
|
||||
if ( Lua.GET_OPCODE(ins) == Lua.OP_TFORLOOP ) {
|
||||
a = Lua.GETARG_A(ins);
|
||||
c = Lua.GETARG_C(ins);
|
||||
for ( int i=1; i<=c; i++ )
|
||||
s[a+2+i] |= BIT_INVALID;
|
||||
}
|
||||
break;
|
||||
|
||||
case Lua.OP_EQ: /* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */
|
||||
@@ -239,8 +246,8 @@ public class Slots {
|
||||
|
||||
case Lua.OP_SETLIST: /* A B C R(A)[(C-1)*FPF+i]:= R(A+i), 1 <= i <= B */
|
||||
s[a] |= BIT_REFER;
|
||||
for ( int aa=1; aa<=b; aa++ )
|
||||
s[aa] |= BIT_REFER;
|
||||
for ( int i=1; i<=b; i++ )
|
||||
s[a+i] |= BIT_REFER;
|
||||
break;
|
||||
|
||||
case Lua.OP_CLOSE: /* A close all variables in the stack up to (>=) R(A)*/
|
||||
@@ -315,8 +322,8 @@ public class Slots {
|
||||
int o = Lua.GET_OPCODE(i);
|
||||
int sbx = Lua.GETARG_sBx(i);
|
||||
if ( o == Lua.OP_JMP && (pc0 + 1 + sbx == pc1) ) {
|
||||
for ( int j=0; j<c; j++ ) {
|
||||
checkPromoteLoopUpvalue( pc0+1, pc1+1, a+3+j );
|
||||
for ( int j=1; j<=c; j++ ) {
|
||||
checkPromoteLoopUpvalue( pc0+1, pc1+1, a+2+j );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user