Fri, 28 May 2010 02:18:53 +0100
Give LValue precall() and call() methods, give functions a vm property.
lvm.js | file | annotate | diff | comparison | revisions |
--- a/lvm.js Mon May 24 15:22:45 2010 +0100 +++ b/lvm.js Fri May 28 02:18:53 2010 +0100 @@ -30,6 +30,17 @@ LValue.prototype = { call: function (args) { + var f = this.precall(); + if(typeof(f) == "function") + var ret = f.apply(this.vm, args?args.map(function (a) { return a.value; }):[]); + else + var ret = this.vm.call(f); + if(typeof(ret) == "undefined") + ret = []; + return ret; + }, + precall: function () + { if(this.type == "function") return this.value; else @@ -63,9 +74,11 @@ return new LValue("string", string); } -function LValueFromFunction(func) +function LValueFromFunction(vm, func) { - return new LValue("function", func); + var val = new LValue("function", func); + val.vm = vm; + return val; } function LValueFromValue(value) @@ -355,7 +368,7 @@ frame.reg[INS_A(instruction)].setIndex(key, value); break; case OP_CALL: - var f = frame.reg[INS_A(instruction)].call(); // return JS or LValue + var f = frame.reg[INS_A(instruction)].precall(); // return JS or LValue var A = INS_A(instruction), B = INS_B(instruction), undefined; var args = frame.reg.slice(A+1, B==0?undefined:(A+B)); for(var i=args.length+1;i<f.maxStackSize;i++) @@ -469,7 +482,7 @@ default_environment.setIndex(LValueFromString("print"), LValueFromFunction(print)); -var f = new LFunction(this, c, default_environment); +var f = new LFunction(testvm, c, default_environment); try{ var ret = testvm.call(f);