lvm.js

changeset 127
9a4c549c7828
parent 125
39b6ba804009
child 128
29c56996fa03
equal deleted inserted replaced
126:07ec490c7a6f 127:9a4c549c7828
26 var OP_LT = 24; 26 var OP_LT = 24;
27 var OP_LE = 25; 27 var OP_LE = 25;
28 var OP_TEST = 26; 28 var OP_TEST = 26;
29 var OP_TESTSET = 27; 29 var OP_TESTSET = 27;
30 var OP_CALL = 28; 30 var OP_CALL = 28;
31 //var OP_TAILCALL = 29; 31 var OP_TAILCALL = 29;
32 var OP_RETURN = 30; 32 var OP_RETURN = 30;
33 var OP_FORLOOP = 31; 33 var OP_FORLOOP = 31;
34 var OP_FORPREP = 32; 34 var OP_FORPREP = 32;
35 var OP_TFORLOOP = 33; 35 var OP_TFORLOOP = 33;
36 var OP_SETLIST = 34; 36 var OP_SETLIST = 34;
495 if(i<available) 495 if(i<available)
496 frame.reg[A+i] = prevframe.reg[base+i+1]; 496 frame.reg[A+i] = prevframe.reg[base+i+1];
497 else 497 else
498 frame.reg[A+i] = new LValue(this, "nil", null); 498 frame.reg[A+i] = new LValue(this, "nil", null);
499 } 499 }
500 break;
501 case OP_TAILCALL:
502 var f = frame.reg[INS_A(instruction)].precall();
503 var A = INS_A(instruction), B = INS_B(instruction);
504 var undefined, args;
505 if(B != 1)
506 args = frame.reg.slice(A+1, B==0?undefined:(A+B));
507 else
508 args = [];
509 if(args.length > f.numParameters)
510 args.length = f.numParameters;
511 for(var i=args.length;i<f.maxStackSize;i++)
512 args[i] = new LValue(this, "nil", null);
513 // Patch frame for new function
514 frame.f = f; frame.pc = 0; frame.reg = args;
500 break; 515 break;
501 case OP_CALL: 516 case OP_CALL:
502 var f = frame.reg[INS_A(instruction)].precall(); // return JS or LValue 517 var f = frame.reg[INS_A(instruction)].precall(); // return JS or LValue
503 var A = INS_A(instruction), B = INS_B(instruction), C = INS_C(instruction); 518 var A = INS_A(instruction), B = INS_B(instruction), C = INS_C(instruction);
504 var undefined; 519 var undefined;

mercurial