Give LValue precall() and call() methods, give functions a vm property.

Fri, 28 May 2010 02:18:53 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Fri, 28 May 2010 02:18:53 +0100
changeset 49
052bd6e8daf6
parent 48
31787f1bd76c
child 50
4612c85cdc01

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);

mercurial