shithub: libmujs

Download patch

ref: 6d690be9690fc2fb705da5e7c7eb71318b5cc2ce
parent: f77a6e7e8e367ed8a6360ac7a44cac28ff5ed3ee
author: Tor Andersson <tor@ccxvii.net>
date: Tue Jan 14 14:06:44 EST 2014

Normal for statement.

--- a/jscompile.c
+++ b/jscompile.c
@@ -332,6 +332,7 @@
 		if (var->b) {
 			cexp(J, F, var->b);
 			emitstring(J, F, OP_SETVAR, var->a->string);
+			emit(J, F, OP_POP);
 		}
 		list = list->b;
 	}
@@ -578,6 +579,13 @@
 		}
 		break;
 
+	case STM_DO:
+		loop = here(J, F);
+		cstm(J, F, stm->a);
+		cexp(J, F, stm->b);
+		jumpto(J, F, OP_JTRUE, loop);
+		break;
+
 	case STM_WHILE:
 		loop = here(J, F);
 		cexp(J, F, stm->a);
@@ -587,16 +595,30 @@
 		label(J, F, end);
 		break;
 
-	case STM_DO:
+	case STM_FOR:
+		cexp(J, F, stm->a);
+		emit(J, F, OP_POP);
+		goto for_body;
+
+	case STM_FOR_VAR:
+		cvarinit(J, F, stm->a);
+		goto for_body;
+
+	for_body:
 		loop = here(J, F);
-		cstm(J, F, stm->a);
 		cexp(J, F, stm->b);
-		jumpto(J, F, OP_JTRUE, loop);
+		end = jump(J, F, OP_JFALSE);
+		cstm(J, F, stm->d);
+		cexp(J, F, stm->c);
+		emit(J, F, OP_POP);
+		jumpto(J, F, OP_JUMP, loop);
+		label(J, F, end);
 		break;
-
-	// for
 	// for-in
 
+	// break
+	// continue
+
 	case STM_RETURN:
 		if (stm->a)
 			cexp(J, F, stm->a);
@@ -613,13 +635,14 @@
 		break;
 
 	// switch
-	// throw, try
-	// label
 
 	case STM_THROW:
 		cexp(J, F, stm->a);
 		emit(J, F, OP_THROW);
 		break;
+
+	// try
+	// label
 
 	case STM_DEBUGGER:
 		emit(J, F, OP_DEBUGGER);
--- a/jsrun.c
+++ b/jsrun.c
@@ -237,8 +237,8 @@
 		case OP_NEWOBJECT: js_pushobject(J, js_newobject(J)); break;
 		case OP_NEWARRAY: js_pushobject(J, js_newobject(J)); break;
 
-		// FUNDEC
-		// VARDEC
+		case OP_FUNDEC: js_pop(J, 1); break;
+		case OP_VARDEC: pc++; break;
 
 		case OP_GETVAR:
 			ref = js_getproperty(J, E, ST[*pc++]);