Author: Stephan <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit