shithub: libmujs

Download patch

ref: d3d073195c861b52964670b69db407429a93dd89
parent: 58b26070febbce31b02072100376d0fba818c04b
author: Tor Andersson <tor@ccxvii.net>
date: Mon Jan 13 09:08:23 EST 2014

Set 'this' object for all types of function calls.

--- a/jscompile.c
+++ b/jscompile.c
@@ -214,6 +214,31 @@
 	emit(J, F, OP_STORE);
 }
 
+static void ccall(JF, js_Ast *fun, js_Ast *args)
+{
+	int n;
+	switch (fun->type) {
+	case EXP_INDEX:
+		cexp(J, F, fun->a);
+		emit(J, F, OP_DUP);
+		cexp(J, F, fun->b);
+		emit(J, F, OP_LOADINDEX);
+		break;
+	case EXP_MEMBER:
+		cexp(J, F, fun->a);
+		emit(J, F, OP_DUP);
+		emitname(J, F, OP_LOADMEMBER, fun->b->string);
+		break;
+	default:
+		emit(J, F, OP_THIS);
+		cexp(J, F, fun);
+		break;
+	}
+	n = cargs(J, F, args);
+	emit(J, F, OP_CALL);
+	emit(J, F, n);
+}
+
 static void cexp(JF, js_Ast *exp)
 {
 	int then, end;
@@ -230,12 +255,12 @@
 	case EXP_THIS: emit(J, F, OP_THIS); break;
 
 	case EXP_OBJECT:
-		emit(J, F, OP_OBJECT);
+		emit(J, F, OP_NEWOBJECT);
 		cobject(J, F, exp->a);
 		break;
 
 	case EXP_ARRAY:
-		emit(J, F, OP_ARRAY);
+		emit(J, F, OP_NEWARRAY);
 		carray(J, F, exp->a);
 		break;
 
@@ -251,19 +276,7 @@
 		break;
 
 	case EXP_CALL:
-		if (exp->a->type == EXP_MEMBER) {
-			cexp(J, F, exp->a->a);
-			emit(J, F, OP_DUP);
-			emitname(J, F, OP_LOADMEMBER, exp->a->b->string);
-			n = cargs(J, F, exp->b);
-			emit(J, F, OP_TCALL);
-			emit(J, F, n);
-		} else {
-			cexp(J, F, exp->a);
-			n = cargs(J, F, exp->b);
-			emit(J, F, OP_CALL);
-			emit(J, F, n);
-		}
+		ccall(J, F, exp->a, exp->b);
 		break;
 
 	case EXP_NEW:
--- a/jscompile.h
+++ b/jscompile.h
@@ -14,9 +14,9 @@
 	OP_FALSE,
 	OP_THIS,
 
-	OP_ARRAY,
+	OP_NEWARRAY,
 	OP_ARRAYPUT,
-	OP_OBJECT,
+	OP_NEWOBJECT,
 	OP_OBJECTPUT,
 
 	OP_FUNDEC,	/* <closure> -(name)- */
@@ -33,9 +33,8 @@
 	OP_LOAD,	/* <addr> -- <addr> <value> */
 	OP_STORE,	/* <addr> <value> -- <value> */
 
-	OP_CALL,	/* <fun> <args...> -(numargs)- <return value> */
-	OP_TCALL,	/* <obj> <fun> <args...> -(numargs)- <return value> */
-	OP_NEW,
+	OP_CALL,	/* <thisvalue> <closure> <args...> -(numargs)- <returnvalue> */
+	OP_NEW,		/* <closure> <args...> -(numargs)- <returnvalue> */
 
 	OP_DELETE,	/* <addr> -- <success> */
 	OP_PREINC,	/* <addr> -- <value+1> */
--- a/jsdump.c
+++ b/jsdump.c
@@ -632,7 +632,6 @@
 			jsC_dumpvalue(J, fun->klist[*p++]);
 			break;
 		case OP_CALL:
-		case OP_TCALL:
 		case OP_NEW:
 			printf(" %d", *p++);
 			break;