Author: Stephan <[email protected]>
Branch:
Changeset: r71:41578daab3b5
Date: 2011-05-18 15:37 +0200
http://bitbucket.org/pypy/lang-js/changeset/41578daab3b5/
Log: fixed continue in while loop
diff --git a/js/jscode.py b/js/jscode.py
--- a/js/jscode.py
+++ b/js/jscode.py
@@ -61,11 +61,6 @@
self.startlooplabel.append(num)
return num
- def emit_startloop_label(self):
- num = self.emit_label()
- self.startlooplabel.append(num)
- return num
-
def prealocate_label(self):
num = self.label_count
self.label_count += 1
@@ -100,6 +95,12 @@
raise ThrowException(W_String("Continue outside loop"))
self.emit('JUMP', self.updatelooplabel[-1])
+ def continue_at_label(self, label):
+ self.updatelooplabel.append(label)
+
+ def done_continue(self):
+ self.updatelooplabel.pop()
+
def emit(self, operation, *args):
opcode = getattr(opcodes, operation)(*args)
self.opcodes.append(opcode)
diff --git a/js/operations.py b/js/operations.py
--- a/js/operations.py
+++ b/js/operations.py
@@ -821,12 +821,14 @@
class While(WhileBase):
def emit(self, bytecode):
startlabel = bytecode.emit_startloop_label()
+ bytecode.continue_at_label(startlabel)
self.condition.emit(bytecode)
endlabel = bytecode.prealocate_endloop_label()
bytecode.emit('JUMP_IF_FALSE', endlabel)
self.body.emit(bytecode)
bytecode.emit('JUMP', startlabel)
bytecode.emit_endloop_label(endlabel)
+ bytecode.done_continue()
class ForVarIn(Statement):
def __init__(self, pos, vardecl, lobject, body):
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
@@ -725,3 +725,52 @@
yield assertv, 'var i = {x:0}; i.x&=1;', 0
yield assertv, 'var i = {x:1}; i.x&=0;', 0
yield assertv, 'var i = {x:1}; i.x&=1;', 1
+
+def test_loop_continue():
+ yield assertv, """
+ i = 0;
+ n = 0;
+ while (i < 3) {
+ i++;
+ if (i == 1)
+ continue;
+ n += i;
+ }
+ n;
+ """, 5
+ yield assertv, """
+ i = 0;
+ n = 0;
+ while (i < 3) {
+ i++;
+ if (i == 1)
+ continue;
+ for(j = 0; j < 10; j++) {
+ if (j == 5)
+ continue;
+ n += j;
+ }
+ }
+ n;
+ """, 80
+ yield assertv, """
+ i = 0;
+ n = 0;
+ while (i < 3) {
+ i++;
+ if (i == 1)
+ continue;
+ for(j = 0; j < 10; j++) {
+ if (j == 5)
+ continue;
+ k = 0;
+ while(k < 10) {
+ k++;
+ if (k % 2 == 0)
+ continue;
+ n += j;
+ }
+ }
+ }
+ n;
+ """, 400
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit