Improve upvalue processing

This commit is contained in:
James Roseborough
2010-04-23 04:21:16 +00:00
parent 8926a94348
commit 8ea8ccb776
2 changed files with 32 additions and 13 deletions

View File

@@ -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 */

View File

@@ -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 );
}
}
}