Author: Stephan <step...@stzal.com>
Branch: 
Changeset: r327:70d628d7642b
Date: 2012-12-25 14:47 +0100
http://bitbucket.org/pypy/lang-js/changeset/70d628d7642b/

Log:    fixed cleanup after break in for/in loop

diff --git a/js/jscode.py b/js/jscode.py
--- a/js/jscode.py
+++ b/js/jscode.py
@@ -42,6 +42,7 @@
         self.has_labels = True
         self.startlooplabel = []
         self.endlooplabel = []
+        self.pop_after_break = []
         self.updatelooplabel = []
         self._estimated_stack_size = -1
         self._symbols = symbol_map
@@ -97,9 +98,10 @@
         self.label_count += 1
         return num
 
-    def prealocate_endloop_label(self):
+    def prealocate_endloop_label(self, pop_after_break=False):
         num = self.prealocate_label()
         self.endlooplabel.append(num)
+        self.pop_after_break.append(pop_after_break)
         return num
 
     def prealocate_updateloop_label(self):
@@ -110,6 +112,7 @@
     def emit_endloop_label(self, label):
         self.endlooplabel.pop()
         self.startlooplabel.pop()
+        self.pop_after_break.pop()
         self.emit_label(label)
 
     def emit_updateloop_label(self, label):
@@ -119,6 +122,8 @@
     def emit_break(self):
         if not self.endlooplabel:
             raise JsThrowException(W_String(u"Break outside loop"))
+        if self.pop_after_break[-1] is True:
+            self.emit('POP')
         self.emit('JUMP', self.endlooplabel[-1])
 
     def emit_continue(self):
diff --git a/js/operations.py b/js/operations.py
--- a/js/operations.py
+++ b/js/operations.py
@@ -982,7 +982,7 @@
         # load the "last" iterations result
         bytecode.emit('LOAD_UNDEFINED')
         precond = bytecode.emit_startloop_label()
-        finish = bytecode.prealocate_endloop_label()
+        finish = bytecode.prealocate_endloop_label(True)
 
         bytecode.emit('JUMP_IF_ITERATOR_EMPTY', finish)
 
diff --git a/js/test/test_interp.py b/js/test/test_interp.py
--- a/js/test/test_interp.py
+++ b/js/test/test_interp.py
@@ -1101,3 +1101,7 @@
 
 def test_repeated_for_loop():
     assertv("var a = 0; for(var x = 0; x < 10; x++){for(var y = 0; y < 10; 
y++) {a += y}}; a;", 450)
+
+
+def test_repeated_for_in():
+    assertv("var a = [1,2,3]; var b = 0; for(var x = 0; x < 10; x++){for(var y 
in a) {b += y}}; b;", '0012012012012012012012012012012')
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to