Author: Hakan Ardo <[email protected]>
Branch: jit-usable_retrace_3
Changeset: r60061:960797b5b0fc
Date: 2013-01-13 18:53 +0100
http://bitbucket.org/pypy/pypy/changeset/960797b5b0fc/

Log:    break statement

diff --git a/pypy/jit/metainterp/test/test_random_loops.py 
b/pypy/jit/metainterp/test/test_random_loops.py
--- a/pypy/jit/metainterp/test/test_random_loops.py
+++ b/pypy/jit/metainterp/test/test_random_loops.py
@@ -32,7 +32,7 @@
         offsets = self.offsets(bytecode)
         def get_printable_location(pc):
             return bytecode[pc]
-        myjitdriver = JitDriver(greens = ['pc'], reds = ['a', 'b', 'c', 'd', 
'e', 'value', 'prev'],
+        myjitdriver = JitDriver(greens = ['pc'], reds = ['a', 'b', 'c', 'd', 
'e', 'value', 'prev', 'loop_stack'],
                                 get_printable_location=get_printable_location)
         def interpreter(_a, _b, _c, _d, _e):
             pc = 0
@@ -42,8 +42,10 @@
             c = IntBox(_c)
             d = IntBox(_d)
             e = IntBox(_e)
+            loop_stack = []
             while pc < len(bytecode):
-                myjitdriver.jit_merge_point(pc=pc, a=a, b=b, c=c, d=d, e=e, 
value=value, prev=prev)
+                myjitdriver.jit_merge_point(pc=pc, a=a, b=b, c=c, d=d, e=e, 
value=value, prev=prev, 
+                                            loop_stack=loop_stack)
                 op = bytecode[pc]
                 current = value
 
@@ -80,18 +82,27 @@
                 elif op == '=':
                     value = prev.eq(value)
                 elif op == '{':
-                    pass
+                    loop_stack.append(pc)
                 elif op == '}':
                     if value.value():
                         pc -= offsets[pc]
-                        myjitdriver.can_enter_jit(pc=pc, a=a, b=b, c=c, d=d, 
e=e, value=value, prev=prev)
+                        myjitdriver.can_enter_jit(pc=pc, a=a, b=b, c=c, d=d, 
e=e, value=value, prev=prev,
+                                                  loop_stack=loop_stack)
+                    else:
+                        loop_stack.pop()
+                elif op == 'x':
+                    pc = loop_stack.pop()
+                    pc += offsets[pc]
                 elif op == '(':
                     if not value.value():
                         value = IntBox(1)
                         pc += offsets[pc]
-                        myjitdriver.can_enter_jit(pc=pc, a=a, b=b, c=c, d=d, 
e=e, value=value, prev=prev)
+                        myjitdriver.can_enter_jit(pc=pc, a=a, b=b, c=c, d=d, 
e=e, value=value, prev=prev,
+                                                  loop_stack=loop_stack)
                 elif op == ')':
                     value = IntBox(0)
+                elif op in ' \n':
+                    pass
                 else:
                     raise UnknonwOpCode
 
@@ -99,14 +110,15 @@
                 pc += 1
             return a.value(), b.value(), c.value(), d.value(), e.value()
         
+        obj = interpreter(*args)
+        expected = {'a': obj[0], 'b': obj[1], 'c': obj[2], 'd': obj[3], 'e': 
obj[4]}
+        for var, val in kwargs.items():
+            assert expected[var] == val
+
         obj = self.meta_interp(interpreter, args)._obj
         res = {'a': obj.item0, 'b': obj.item1, 'c': obj.item2, 'd': obj.item3, 
'e': obj.item4}
-        obj = interpreter(*args)
-        expected = {'a': obj[0], 'b': obj[1], 'c': obj[2], 'd': obj[3], 'e': 
obj[4]}
         assert res == expected
 
-        for var, val in kwargs.items():
-            assert res[var] == val
         return res
 
     def offsets(self, bytecode):
@@ -136,5 +148,21 @@
     def test_conditional(self):
         self.check('0A0C9B{b4<(a1+A)(c1+C)b1-Bb}', c=6, a=3)
 
+    def test_break(self):
+        self.check('0A9B{ab+Ab1-Bb0=(x)1}', a=45)
+
+    def test_nested(self):
+        self.check('''0A
+                      9B{
+                        9C{
+                          ab+A
+                          ac+A
+                          c1-C
+                          c0= (x)
+                        1}
+                        b1-B
+                        b0= (x)
+                      1}''', a=810)
+
 class TestLLtype(BaseTests, LLJitMixin):
     pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to