[pypy-svn] r68666 - in pypy/branch/warmspot-jitinfo/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Tue Oct 20 18:44:10 CEST 2009


Author: arigo
Date: Tue Oct 20 18:44:09 2009
New Revision: 68666

Modified:
   pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/test/test_warmstate.py
   pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/warmstate.py
Log:
Port the rest of the code in WarmEnterState and write tests.


Modified: pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/test/test_warmstate.py
==============================================================================
--- pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/test/test_warmstate.py	(original)
+++ pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/test/test_warmstate.py	Tue Oct 20 18:44:09 2009
@@ -62,13 +62,13 @@
     class FakeJitCell:
         pass
     state = WarmEnterState(FakeWarmRunnerDesc())
-    get_jitcell = state.make_jitcell_getter_default(FakeJitCell)
-    cell1 = get_jitcell((42, 42.5))
+    get_jitcell = state._make_jitcell_getter_default(FakeJitCell)
+    cell1 = get_jitcell(42, 42.5)
     assert isinstance(cell1, FakeJitCell)
-    cell2 = get_jitcell((42, 42.5))
+    cell2 = get_jitcell(42, 42.5)
     assert cell1 is cell2
-    cell3 = get_jitcell((41, 42.5))
-    cell4 = get_jitcell((42, 0.25))
+    cell3 = get_jitcell(41, 42.5)
+    cell4 = get_jitcell(42, 0.25)
     assert cell1 is not cell3 is not cell4 is not cell1
 
 def test_make_jitcell_getter():
@@ -77,9 +77,10 @@
         get_jitcell_at_ptr = None
     state = WarmEnterState(FakeWarmRunnerDesc())
     get_jitcell = state.make_jitcell_getter()
-    cell1 = get_jitcell((1.75,))
-    cell2 = get_jitcell((1.75,))
+    cell1 = get_jitcell(1.75)
+    cell2 = get_jitcell(1.75)
     assert cell1 is cell2
+    assert get_jitcell is state.make_jitcell_getter()
 
 def test_make_jitcell_getter_custom():
     class FakeJitCell:
@@ -102,15 +103,15 @@
         set_jitcell_at_ptr = llhelper(SETTER, setter)
     #
     state = WarmEnterState(FakeWarmRunnerDesc())
-    get_jitcell = state.make_jitcell_getter_custom(FakeJitCell)
-    cell1 = get_jitcell((5, 42.5))
+    get_jitcell = state._make_jitcell_getter_custom(FakeJitCell)
+    cell1 = get_jitcell(5, 42.5)
     assert isinstance(cell1, FakeJitCell)
     assert cell1.x == 5
     assert cell1.y == 42.5
-    cell2 = get_jitcell((5, 42.5))
+    cell2 = get_jitcell(5, 42.5)
     assert cell2 is cell1
-    cell3 = get_jitcell((41, 42.5))
-    cell4 = get_jitcell((42, 0.25))
+    cell3 = get_jitcell(41, 42.5)
+    cell4 = get_jitcell(42, 0.25)
     assert cell1 is not cell3 is not cell4 is not cell1
 
 def test_make_set_future_values():
@@ -133,3 +134,70 @@
         0: ("int", 5),
         1: ("float", 42.5),
     }
+    assert set_future_values is state.make_set_future_values()
+
+def test_make_unwrap_greenkey():
+    class FakeWarmRunnerDesc:
+        green_args_spec = [lltype.Signed, lltype.Float]
+    state = WarmEnterState(FakeWarmRunnerDesc())
+    unwrap_greenkey = state.make_unwrap_greenkey()
+    greenargs = unwrap_greenkey([BoxInt(42), BoxFloat(42.5)])
+    assert greenargs == (42, 42.5)
+    assert type(greenargs[0]) is int
+
+def test_attach_unoptimized_bridge_from_interp():
+    class FakeWarmRunnerDesc:
+        green_args_spec = [lltype.Signed, lltype.Float]
+        get_jitcell_at_ptr = None
+    state = WarmEnterState(FakeWarmRunnerDesc())
+    get_jitcell = state.make_jitcell_getter()
+    state.attach_unoptimized_bridge_from_interp([BoxInt(5), BoxFloat(2.25)],
+                                                "entry loop token")
+    cell1 = get_jitcell(5, 2.25)
+    assert cell1.counter < 0
+    assert cell1.entry_loop_token == "entry loop token"
+
+def test_make_jitdriver_callbacks_1():
+    class FakeWarmRunnerDesc:
+        can_inline_ptr = None
+        get_printable_location_ptr = None
+    state = WarmEnterState(FakeWarmRunnerDesc())
+    state.make_jitdriver_callbacks()
+    res = state.can_inline_callable([BoxInt(5), BoxFloat(42.5)])
+    assert res is True
+    res = state.get_location_str([BoxInt(5), BoxFloat(42.5)])
+    assert res == '(no jitdriver.get_printable_location!)'
+
+def test_make_jitdriver_callbacks_2():
+    def can_inline(x, y):
+        assert x == 5
+        assert y == 42.5
+        return False
+    CAN_INLINE = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Float],
+                                            lltype.Bool))
+    class FakeWarmRunnerDesc:
+        rtyper = None
+        green_args_spec = [lltype.Signed, lltype.Float]
+        can_inline_ptr = llhelper(CAN_INLINE, can_inline)
+        get_printable_location_ptr = None
+    state = WarmEnterState(FakeWarmRunnerDesc())
+    state.make_jitdriver_callbacks()
+    res = state.can_inline_callable([BoxInt(5), BoxFloat(42.5)])
+    assert res is False
+
+def test_make_jitdriver_callbacks_3():
+    def get_location(x, y):
+        assert x == 5
+        assert y == 42.5
+        return "hi there"    # abuse the return type, but nobody checks it
+    GET_LOCATION = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Float],
+                                              lltype.Ptr(rstr.STR)))
+    class FakeWarmRunnerDesc:
+        rtyper = None
+        green_args_spec = [lltype.Signed, lltype.Float]
+        can_inline_ptr = None
+        get_printable_location_ptr = llhelper(GET_LOCATION, get_location)
+    state = WarmEnterState(FakeWarmRunnerDesc())
+    state.make_jitdriver_callbacks()
+    res = state.get_location_str([BoxInt(5), BoxFloat(42.5)])
+    assert res == "hi there"

Modified: pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/warmstate.py	(original)
+++ pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/warmstate.py	Tue Oct 20 18:44:09 2009
@@ -1,6 +1,7 @@
 import sys
 from pypy.rpython.lltypesystem import lltype, llmemory, rstr
 from pypy.rpython.ootypesystem import ootype
+from pypy.rpython.annlowlevel import hlstr
 from pypy.rlib.objectmodel import specialize, we_are_translated, r_dict
 from pypy.rlib.rarithmetic import intmask
 from pypy.rlib.nonconst import NonConstant
@@ -152,16 +153,33 @@
         if self.profiler is not None:
             self.profiler.set_printing(value >= DEBUG_PROFILE)
 
+    def must_compile_from_failure(self, key):
+        key.counter += 1
+        return key.counter >= self.trace_eagerness
+
+    def reset_counter_from_failure(self, key):
+        key.counter = 0
+
+    def attach_unoptimized_bridge_from_interp(self, greenkey,
+                                              entry_loop_token):
+        cell = self.jit_cell_at_key(greenkey)
+        cell.counter = -1
+        cell.entry_loop_token = entry_loop_token
+
     # ----------
 
     def make_entry_point(self):
         "NOT_RPYTHON"
-        metainterp_sd = warmrunnerdesc.metainterp_sd
+        if hasattr(self, 'maybe_compile_and_run'):
+            return self.maybe_compile_and_run
+
+        metainterp_sd = self.warmrunnerdesc.metainterp_sd
         globaldata = metainterp_sd.globaldata
         vinfo = metainterp_sd.virtualizable_info
         ContinueRunningNormally = self.warmrunnerdesc.ContinueRunningNormally
         get_jitcell = self.make_jitcell_getter()
         set_future_values = self.make_set_future_values()
+        self.make_jitdriver_callbacks()
 
         def maybe_compile_and_run(*args):
             """Entry point to the JIT.  Called at the point with the
@@ -181,7 +199,7 @@
 
             # look for the cell corresponding to the current greenargs
             greenargs = args[:self.num_green_args]
-            cell = get_jitcell(greenargs)
+            cell = get_jitcell(*greenargs)
 
             if cell.counter >= 0:
                 # update the profiling counter
@@ -213,22 +231,58 @@
                 loop_token = fail_descr.handle_fail(metainterp_sd)
 
         maybe_compile_and_run._dont_inline_ = True
+        self.maybe_compile_and_run = maybe_compile_and_run
         return maybe_compile_and_run
 
     # ----------
 
+    def make_unwrap_greenkey(self):
+        "NOT_RPYTHON"
+        if hasattr(self, 'unwrap_greenkey'):
+            return self.unwrap_greenkey
+        #
+        warmrunnerdesc = self.warmrunnerdesc
+        green_args_spec = unrolling_iterable(warmrunnerdesc.green_args_spec)
+        #
+        def unwrap_greenkey(greenkey):
+            greenargs = ()
+            i = 0
+            for TYPE in green_args_spec:
+                value = unwrap(TYPE, greenkey[i])
+                greenargs += (value,)
+                i = i + 1
+            return greenargs
+        #
+        unwrap_greenkey._always_inline_ = True
+        self.unwrap_greenkey = unwrap_greenkey
+        return unwrap_greenkey
+
+    # ----------
+
     def make_jitcell_getter(self):
         "NOT_RPYTHON"
+        if hasattr(self, 'jit_getter'):
+            return self.jit_getter
         #
         class JitCell(object):
             counter = 0
         #
         if self.warmrunnerdesc.get_jitcell_at_ptr is None:
-            return self.make_jitcell_getter_default(JitCell)
+            jit_getter = self._make_jitcell_getter_default(JitCell)
         else:
-            return self.make_jitcell_getter_custom(JitCell)
+            jit_getter = self._make_jitcell_getter_custom(JitCell)
+        #
+        unwrap_greenkey = self.make_unwrap_greenkey()
+        #
+        def jit_cell_at_key(greenkey):
+            greenargs = unwrap_greenkey(greenkey)
+            return jit_getter(*greenargs)
+        self.jit_cell_at_key = jit_cell_at_key
+        self.jit_getter = jit_getter
+        #
+        return jit_getter
 
-    def make_jitcell_getter_default(self, JitCell):
+    def _make_jitcell_getter_default(self, JitCell):
         "NOT_RPYTHON"
         warmrunnerdesc = self.warmrunnerdesc
         green_args_spec = unrolling_iterable(warmrunnerdesc.green_args_spec)
@@ -253,7 +307,7 @@
         #
         jitcell_dict = r_dict(comparekey, hashkey)
         #
-        def get_jitcell(greenargs):
+        def get_jitcell(*greenargs):
             try:
                 cell = jitcell_dict[greenargs]
             except KeyError:
@@ -262,14 +316,14 @@
             return cell
         return get_jitcell
 
-    def make_jitcell_getter_custom(self, JitCell):
+    def _make_jitcell_getter_custom(self, JitCell):
         "NOT_RPYTHON"
         rtyper = self.warmrunnerdesc.rtyper
         get_jitcell_at_ptr = self.warmrunnerdesc.get_jitcell_at_ptr
         set_jitcell_at_ptr = self.warmrunnerdesc.set_jitcell_at_ptr
         cpu = self.warmrunnerdesc.cpu
         #
-        def get_jitcell(greenargs):
+        def get_jitcell(*greenargs):
             fn = support.maybe_on_top_of_llinterp(rtyper, get_jitcell_at_ptr)
             try:
                 cellref = fn(*greenargs)
@@ -293,6 +347,9 @@
 
     def make_set_future_values(self):
         "NOT_RPYTHON"
+        if hasattr(self, 'set_future_values'):
+            return self.set_future_values
+
         warmrunnerdesc = self.warmrunnerdesc
         cpu = warmrunnerdesc.cpu
         vinfo = warmrunnerdesc.metainterp_sd.virtualizable_info
@@ -331,4 +388,42 @@
         else:
             set_future_values_from_vinfo = None
         #
+        self.set_future_values = set_future_values
         return set_future_values
+
+    # ----------
+
+    def make_jitdriver_callbacks(self):
+        if hasattr(self, 'get_location_str'):
+            return
+        #
+        can_inline_ptr = self.warmrunnerdesc.can_inline_ptr
+        if can_inline_ptr is None:
+            def can_inline_callable(greenkey):
+                return True
+        else:
+            rtyper = self.warmrunnerdesc.rtyper
+            unwrap_greenkey = self.make_unwrap_greenkey()
+            #
+            def can_inline_callable(greenkey):
+                greenargs = unwrap_greenkey(greenkey)
+                fn = support.maybe_on_top_of_llinterp(rtyper, can_inline_ptr)
+                return fn(*greenargs)
+        self.can_inline_callable = can_inline_callable
+        #
+        get_location_ptr = self.warmrunnerdesc.get_printable_location_ptr
+        if get_location_ptr is None:
+            def get_location_str(greenkey):
+                return '(no jitdriver.get_printable_location!)'
+        else:
+            rtyper = self.warmrunnerdesc.rtyper
+            unwrap_greenkey = self.make_unwrap_greenkey()
+            #
+            def get_location_str(greenkey):
+                greenargs = unwrap_greenkey(greenkey)
+                fn = support.maybe_on_top_of_llinterp(rtyper, get_location_ptr)
+                res = fn(*greenargs)
+                if not we_are_translated() and not isinstance(res, str):
+                    res = hlstr(res)
+                return res
+        self.get_location_str = get_location_str



More information about the Pypy-commit mailing list