lvm.js

changeset 116
b78e86780939
parent 115
1555cb5a97b3
child 117
8f1045a7f1d6
equal deleted inserted replaced
115:1555cb5a97b3 116:b78e86780939
17 var OP_DIV = 15; 17 var OP_DIV = 15;
18 var OP_MOD = 16; 18 var OP_MOD = 16;
19 var OP_POW = 17; 19 var OP_POW = 17;
20 var OP_UNM = 18; 20 var OP_UNM = 18;
21 var OP_NOT = 19; 21 var OP_NOT = 19;
22 //VAR OP_LEN = 20; 22 var OP_LEN = 20;
23 var OP_CONCAT = 21; 23 var OP_CONCAT = 21;
24 var OP_JMP = 22; 24 var OP_JMP = 22;
25 var OP_EQ = 23; 25 var OP_EQ = 23;
26 var OP_LT = 24; 26 var OP_LT = 24;
27 var OP_LE = 25; 27 var OP_LE = 25;
158 && (result[0].type != "boolean" || result[0].value == true) 158 && (result[0].type != "boolean" || result[0].value == true)
159 ); 159 );
160 } 160 }
161 } 161 }
162 return false; 162 return false;
163 },
164 len: function ()
165 {
166 switch(this.type)
167 {
168 case "string":
169 case "table":
170 return this.value.length;
171 default:
172 throw "attempt to get length of a "+this.type+" value";
173 }
163 } 174 }
164 }; 175 };
165 176
166 function LBinaryChunk(vm, chunk, start, sourceName) 177 function LBinaryChunk(vm, chunk, start, sourceName)
167 { 178 {
650 break; 661 break;
651 case OP_NOT: 662 case OP_NOT:
652 var RB = frame.reg[INS_B(instruction)]; 663 var RB = frame.reg[INS_B(instruction)];
653 frame.reg[INS_A(instruction)] = new LValue(this, "boolean", !RB.truth()); 664 frame.reg[INS_A(instruction)] = new LValue(this, "boolean", !RB.truth());
654 break; 665 break;
666 case OP_LEN:
667 var RB = frame.reg[INS_B(instruction)];
668 frame.reg[INS_A(instruction)] = new LValue(this, "number", RB.len());
669 break;
655 case OP_EQ: 670 case OP_EQ:
656 var A = INS_A(instruction); 671 var A = INS_A(instruction);
657 var RB = RK(frame, INS_B(instruction)); 672 var RB = RK(frame, INS_B(instruction));
658 var RC = RK(frame, INS_C(instruction)); 673 var RC = RK(frame, INS_C(instruction));
659 if(RB.equals(RC) != (A!=0)) 674 if(RB.equals(RC) != (A!=0))

mercurial