lvm.js

changeset 102
7bf985fd9e03
parent 101
f1247747f025
child 103
5a0db53fc898
equal deleted inserted replaced
101:f1247747f025 102:7bf985fd9e03
23 var OP_TESTSET = 27; 23 var OP_TESTSET = 27;
24 var OP_CALL = 28; 24 var OP_CALL = 28;
25 var OP_RETURN = 30; 25 var OP_RETURN = 30;
26 var OP_FORLOOP = 31; 26 var OP_FORLOOP = 31;
27 var OP_FORPREP = 32; 27 var OP_FORPREP = 32;
28 var OP_TFORLOOP = 33;
28 var OP_CLOSURE = 36; 29 var OP_CLOSURE = 36;
29 30
30 var debugMode = false; 31 var debugMode = false;
31 32
32 function LValue(vm, type, value) 33 function LValue(vm, type, value)
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++;

mercurial