[pypy-svn] r70711 - in pypy/branch/direct-assembler-call/pypy/jit/metainterp: . test

fijal at codespeak.net fijal at codespeak.net
Tue Jan 19 16:32:22 CET 2010


Author: fijal
Date: Tue Jan 19 16:32:22 2010
New Revision: 70711

Modified:
   pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
   pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py
   pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmstate.py
Log:
Surprisingly, this seems to be enough to cover all cases for direct
assembler call helper.


Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py	Tue Jan 19 16:32:22 2010
@@ -713,7 +713,27 @@
         self.check_history(call_assembler=1)        
 
     def test_directly_call_assembler_fail_guard(self):
-        pass
+        driver = JitDriver(greens = ['codeno'], reds = ['i', 'k'],
+                           get_printable_location = lambda codeno : str(codeno),
+                           can_inline = lambda codeno : False)
+
+        def portal(codeno, k):
+            i = 0
+            while i < 10:
+                driver.can_enter_jit(codeno=codeno, i=i, k=k)
+                driver.jit_merge_point(codeno=codeno, i=i, k=k)
+                if codeno == 2:
+                    k += portal(1, k)
+                elif k > 40:
+                    if i % 2:
+                        k += 1
+                    else:
+                        k += 2
+                k += 1
+                i += 1
+            return k
+
+        self.meta_interp(portal, [2, 0], inline=True)
 
 class TestLLtype(RecursiveTests, LLJitMixin):
     pass

Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py	Tue Jan 19 16:32:22 2010
@@ -563,31 +563,35 @@
 
         def assembler_call_helper(failindex):
             fail_descr = self.cpu.get_fail_descr_from_number(failindex)
-            try:
-                while True:
+            while True:
+                try:
                     loop_token = fail_descr.handle_fail(self.metainterp_sd)
-                    xxx
-            except self.ContinueRunningNormally, e:
-                xxx
-            except self.DoneWithThisFrameVoid:
-                assert result_kind == 'void'
-                return
-            except self.DoneWithThisFrameInt, e:
-                assert result_kind == 'int'
-                return lltype.cast_primitive(RESULT, e.result)
-            except self.DoneWithThisFrameRef, e:
-                assert result_kind == 'ref'
-                return ts.cast_from_ref(RESULT, e.result)
-            except self.DoneWithThisFrameFloat, e:
-                assert result_kind == 'float'
-                return e.result
-            except self.ExitFrameWithExceptionRef, e:
-                value = ts.cast_to_baseclass(e.value)
-                if not we_are_translated():
-                    raise LLException(ts.get_typeptr(value), value)
-                else:
-                    value = cast_base_ptr_to_instance(Exception, value)
-                    raise Exception, value
+                    fail_descr = self.cpu.execute_token(loop_token)
+                except self.ContinueRunningNormally, e:
+                    args = ()
+                    for _, name, _ in portalfunc_ARGS:
+                        v = getattr(e, name)
+                        args = args + (v,)
+                    self.state.set_future_values(*args)
+                except self.DoneWithThisFrameVoid:
+                    assert result_kind == 'void'
+                    return
+                except self.DoneWithThisFrameInt, e:
+                    assert result_kind == 'int'
+                    return lltype.cast_primitive(RESULT, e.result)
+                except self.DoneWithThisFrameRef, e:
+                    assert result_kind == 'ref'
+                    return ts.cast_from_ref(RESULT, e.result)
+                except self.DoneWithThisFrameFloat, e:
+                    assert result_kind == 'float'
+                    return e.result
+                except self.ExitFrameWithExceptionRef, e:
+                    value = ts.cast_to_baseclass(e.value)
+                    if not we_are_translated():
+                        raise LLException(ts.get_typeptr(value), value)
+                    else:
+                        value = cast_base_ptr_to_instance(Exception, value)
+                        raise Exception, value
 
         self.cpu.assembler_helper_ptr = self.helper_func(
             self.PTR_ASSEMBLER_HELPER_FUNCTYPE,

Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmstate.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmstate.py	Tue Jan 19 16:32:22 2010
@@ -194,7 +194,7 @@
         ContinueRunningNormally = self.warmrunnerdesc.ContinueRunningNormally
         num_green_args = self.warmrunnerdesc.num_green_args
         get_jitcell = self.make_jitcell_getter()
-        set_future_values = self.make_set_future_values()
+        self.set_future_values = self.make_set_future_values()
         self.make_jitdriver_callbacks()
         confirm_enter_jit = self.confirm_enter_jit
 
@@ -245,7 +245,7 @@
                     return
                 # machine code was already compiled for these greenargs
                 # get the assembler and fill in the boxes
-                set_future_values(*args[num_green_args:])
+                self.set_future_values(*args[num_green_args:])
                 loop_token = cell.entry_loop_token
 
             # ---------- execute assembler ----------



More information about the Pypy-commit mailing list