Author: Armin Rigo <[email protected]>
Branch: jit-counter
Changeset: r67743:c5a737d0b87a
Date: 2013-10-30 18:17 +0100
http://bitbucket.org/pypy/pypy/changeset/c5a737d0b87a/

Log:    still in-progress

diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2208,7 +2208,10 @@
             raise NotImplementedError(opname[opnum])
 
     def get_procedure_token(self, greenkey, with_compiled_targets=False):
-        cell = self.jitdriver_sd.warmstate.jit_cell_at_key(greenkey)
+        JitCell = self.jitdriver_sd.warmstate.JitCell
+        cell = JitCell.get_jit_cell_at_key(greenkey)
+        if cell is None:
+            return None
         token = cell.get_procedure_token()
         if with_compiled_targets:
             if not token:
diff --git a/rpython/jit/metainterp/test/support.py 
b/rpython/jit/metainterp/test/support.py
--- a/rpython/jit/metainterp/test/support.py
+++ b/rpython/jit/metainterp/test/support.py
@@ -28,8 +28,8 @@
 
     class FakeWarmRunnerState(object):
         def attach_procedure_to_interp(self, greenkey, procedure_token):
-            cell = self.jit_cell_at_key(greenkey)
-            cell.set_procedure_token(procedure_token)
+            assert greenkey == []
+            self._cell.set_procedure_token(procedure_token)
 
         def helper_func(self, FUNCPTR, func):
             from rpython.rtyper.annlowlevel import llhelper
@@ -38,9 +38,11 @@
         def get_location_str(self, args):
             return 'location'
 
-        def jit_cell_at_key(self, greenkey):
-            assert greenkey == []
-            return self._cell
+        class JitCell:
+            @staticmethod
+            def get_jit_cell_at_key(greenkey):
+                assert greenkey == []
+                return FakeWarmRunnerState._cell
         _cell = FakeJitCell()
 
         trace_limit = sys.maxint
diff --git a/rpython/jit/metainterp/warmspot.py 
b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -512,12 +512,6 @@
         jd._maybe_compile_and_run_fn = maybe_compile_and_run
 
     def make_driverhook_graphs(self):
-        from rpython.rlib.jit import BaseJitCell
-        bk = self.rtyper.annotator.bookkeeper
-        classdef = bk.getuniqueclassdef(BaseJitCell)
-        s_BaseJitCell_or_None = annmodel.SomeInstance(classdef,
-                                                      can_be_None=True)
-        s_BaseJitCell_not_None = annmodel.SomeInstance(classdef)
         s_Str = annmodel.SomeString()
         #
         annhelper = MixLevelHelperAnnotator(self.translator.rtyper)
diff --git a/rpython/jit/metainterp/warmstate.py 
b/rpython/jit/metainterp/warmstate.py
--- a/rpython/jit/metainterp/warmstate.py
+++ b/rpython/jit/metainterp/warmstate.py
@@ -236,7 +236,7 @@
                 self.warmrunnerdesc.memory_manager.max_unroll_loops = value
 
     def disable_noninlinable_function(self, greenkey):
-        cell = self.jit_cell_at_key(greenkey)
+        cell = self.JitCell.ensure_jit_cell_at_key(greenkey)
         cell.dont_trace_here = chr(20)
         debug_start("jit-disableinlining")
         loc = self.get_location_str(greenkey)
@@ -244,7 +244,7 @@
         debug_stop("jit-disableinlining")
 
     def attach_procedure_to_interp(self, greenkey, procedure_token):
-        cell = self.jit_cell_at_key(greenkey)
+        cell = self.JitCell.ensure_jit_cell_at_key(greenkey)
         old_token = cell.get_procedure_token()
         cell.set_procedure_token(procedure_token)
         if old_token is not None:
@@ -332,7 +332,9 @@
             """
             # Look for the cell corresponding to the current greenargs.
             # Search for the JitCell that is of the correct subclass of
-            # BaseJitCell, and that stores a key that compares equal
+            # BaseJitCell, and that stores a key that compares equal.
+            # These few lines inline some logic that is also on the
+            # JitCell class, to avoid computing the hash several times.
             greenargs = args[:num_green_args]
             index = JitCell.get_index(*greenargs)
             cell = jitcounter.lookup_chain(index)
@@ -410,6 +412,7 @@
         jitdriver_sd = self.jitdriver_sd
         green_args_spec = unrolling_iterable([('g%d' % i, TYPE)
                      for i, TYPE in enumerate(jitdriver_sd._green_args_spec)])
+        unwrap_greenkey = self.make_unwrap_greenkey()
         #
         class JitCell(BaseJitCell):
             def __init__(self, *greenargs):
@@ -437,6 +440,34 @@
                     x = intmask((x ^ y) * 1405695061)  # prime number, 2**30~31
                     i = i + 1
                 return jitcounter.get_index(x)
+
+            @staticmethod
+            def get_jitcell(*greenargs):
+                index = JitCell.get_index(*greenargs)
+                cell = jitcounter.lookup_chain(index)
+                while cell is not None:
+                    if (isinstance(cell, JitCell) and
+                            cell.comparekey(*greenargs)):
+                        return cell
+                return None
+
+            @staticmethod
+            def get_jit_cell_at_key(greenkey):
+                greenargs = unwrap_greenkey(greenkey)
+                return JitCell.get_jitcell(*greenargs)
+
+            @staticmethod
+            def ensure_jit_cell_at_key(greenkey):
+                greenargs = unwrap_greenkey(greenkey)
+                index = JitCell.get_index(*greenargs)
+                cell = jitcounter.lookup_chain(index)
+                while cell is not None:
+                    if (isinstance(cell, JitCell) and
+                            cell.comparekey(*greenargs)):
+                        return cell
+                newcell = JitCell(*greenargs)
+                jitcounter.install_new_cell(index, newcell)
+                return newcell
         #
         self.JitCell = JitCell
         return JitCell
@@ -449,14 +480,14 @@
         #
         warmrunnerdesc = self.warmrunnerdesc
         unwrap_greenkey = self.make_unwrap_greenkey()
-        jit_getter = self.make_jitcell_getter()
+        JitCell = self.make_jitcell_subclass()
         jd = self.jitdriver_sd
         cpu = self.cpu
 
         def can_inline_greenargs(*greenargs):
             if can_never_inline(*greenargs):
                 return False
-            cell = jit_getter(False, *greenargs)
+            cell = JitCell.get_jitcell(*greenargs)
             if cell is not None and ord(cell.dont_trace_here) != 0:
                 return False
             return True
@@ -481,7 +512,7 @@
         redargtypes = ''.join([kind[0] for kind in jd.red_args_types])
 
         def get_assembler_token(greenkey):
-            cell = self.jit_cell_at_key(greenkey)
+            cell = self.ensure_jit_cell_at_key(greenkey)
             procedure_token = cell.get_procedure_token()
             if procedure_token is None:
                 from rpython.jit.metainterp.compile import compile_tmp_callback
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to