553 { |
554 { |
554 frame.pc += INS_sBx(instruction); |
555 frame.pc += INS_sBx(instruction); |
555 frame.reg[A+3].value = RA.value; |
556 frame.reg[A+3].value = RA.value; |
556 } |
557 } |
557 break; |
558 break; |
|
559 case OP_TFORLOOP: |
|
560 var A = INS_A(instruction); |
|
561 var C = INS_C(instruction); |
|
562 var f = frame.reg[A].precall(); // Iterator function |
|
563 var rets = this.call(f, [frame.reg[A+1], frame.reg[A+2]]); |
|
564 frame.reg.length = A+3; |
|
565 for(var i = 0; i<C; i++) |
|
566 frame.reg[A+3+i] = rets[i]; |
|
567 if(frame.reg[A+3].type != "nil") |
|
568 frame.reg[A+2] = frame.reg[A+3]; |
|
569 else |
|
570 frame.pc++; // Skip JMP to start |
|
571 continue; |
558 case OP_TEST: |
572 case OP_TEST: |
559 var RA = frame.reg[INS_A(instruction)]; |
573 var RA = frame.reg[INS_A(instruction)]; |
560 var RA_bool = RA.type == "nil" || (RA.type == "boolean" && RA.value == false); |
574 var RA_bool = RA.type == "nil" || (RA.type == "boolean" && RA.value == false); |
561 if(RA_bool == (INS_C(instruction)!=0)) |
575 if(RA_bool == (INS_C(instruction)!=0)) |
562 frame.pc++; |
576 frame.pc++; |