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