[pypy-svn] r74888 - in pypy/branch/blackhole-improvement/pypy/jit: backend/llgraph backend/llsupport metainterp

arigo at codespeak.net arigo at codespeak.net
Sat May 29 13:53:59 CEST 2010


Author: arigo
Date: Sat May 29 13:53:57 2010
New Revision: 74888

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/descr.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
Log:
Fix the previous failure.


Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	Sat May 29 13:53:57 2010
@@ -23,11 +23,16 @@
 
 class Descr(history.AbstractDescr):
 
-    def __init__(self, ofs, typeinfo, extrainfo=None, name=None):
+    def __init__(self, ofs, typeinfo, extrainfo=None, name=None,
+                 arg_types=None):
         self.ofs = ofs
         self.typeinfo = typeinfo
         self.extrainfo = extrainfo
         self.name = name
+        self.arg_types = arg_types
+
+    def get_arg_types(self):
+        return self.arg_types
 
     def get_return_type(self):
         return self.typeinfo
@@ -98,12 +103,13 @@
         assert self.translate_support_code
         return False
 
-    def getdescr(self, ofs, typeinfo='?', extrainfo=None, name=None):
-        key = (ofs, typeinfo, extrainfo, name)
+    def getdescr(self, ofs, typeinfo='?', extrainfo=None, name=None,
+                 arg_types=None):
+        key = (ofs, typeinfo, extrainfo, name, arg_types)
         try:
             return self._descrs[key]
         except KeyError:
-            descr = Descr(ofs, typeinfo, extrainfo, name)
+            descr = Descr(ofs, typeinfo, extrainfo, name, arg_types)
             self._descrs[key] = descr
             return descr
 
@@ -271,8 +277,14 @@
         return self.getdescr(ofs, token[0], name=fieldname)
 
     def calldescrof(self, FUNC, ARGS, RESULT, extrainfo=None):
+        arg_types = []
+        for ARG in ARGS:
+            token = history.getkind(ARG)
+            if token != 'void':
+                arg_types.append(token[0])
         token = history.getkind(RESULT)
-        return self.getdescr(0, token[0], extrainfo=extrainfo)
+        return self.getdescr(0, token[0], extrainfo=extrainfo,
+                             arg_types=''.join(arg_types))
 
     def grab_exc_value(self):
         return llimpl.grab_exc_value()

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/descr.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/descr.py	Sat May 29 13:53:57 2010
@@ -190,6 +190,9 @@
     def get_extra_info(self):
         return self.extrainfo
 
+    def get_arg_types(self):
+        return self.arg_classes
+
     def get_return_type(self):
         return self._return_type
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py	Sat May 29 13:53:57 2010
@@ -127,6 +127,12 @@
     def _clone_if_mutable(self):
         return self
 
+    def get_arg_types(self):
+        """ Implement in call descr.
+        Must return a string of INT, REF and FLOAT ('i', 'r', 'f').
+        """
+        raise NotImplementedError
+
     def get_return_type(self):
         """ Implement in call descr.
         Must return INT, REF, FLOAT, or 'v' for void.

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Sat May 29 13:53:57 2010
@@ -985,7 +985,38 @@
 
     def do_residual_call(self, funcbox, descr, argboxes,
                          assembler_call_token=None):
-        allboxes = [funcbox] + argboxes
+        # First build allboxes: it may need some reordering from the
+        # list provided in argboxes, depending on the order in which
+        # the arguments are expected by the function
+        allboxes = [None] * (len(argboxes)+1)
+        allboxes[0] = funcbox
+        src_i = src_r = src_f = 0
+        i = 1
+        for kind in descr.get_arg_types():
+            if kind == history.INT:
+                while True:
+                    box = argboxes[src_i]
+                    src_i += 1
+                    if box.type == history.INT:
+                        break
+            elif kind == history.REF:
+                while True:
+                    box = argboxes[src_r]
+                    src_r += 1
+                    if box.type == history.REF:
+                        break
+            elif kind == history.FLOAT:
+                while True:
+                    box = argboxes[src_f]
+                    src_f += 1
+                    if box.type == history.FLOAT:
+                        break
+            else:
+                raise AssertionError
+            allboxes[i] = box
+            i += 1
+        assert i == len(allboxes)
+        #
         effectinfo = descr.get_extra_info()
         if (effectinfo is None or
                 effectinfo.extraeffect ==
@@ -995,11 +1026,12 @@
             self.metainterp.vable_and_vrefs_before_residual_call()
             resbox = self.metainterp.execute_and_record_varargs(
                 rop.CALL_MAY_FORCE, allboxes, descr=descr)
+            self.metainterp.vrefs_after_residual_call()
             if assembler_call_token is not None:
                 self.metainterp.direct_assembler_call(assembler_call_token)
             if resbox is not None:
                 self.make_result_of_lastop(resbox)
-            self.metainterp.vable_and_vrefs_after_residual_call()
+            self.metainterp.vable_after_residual_call()
             self.generate_guard(rop.GUARD_NOT_FORCED, None)
             self.metainterp.handle_possible_exception()
             return resbox
@@ -1768,7 +1800,7 @@
                                                   force_token_box],
                                 None, descr=vinfo.vable_token_descr)
 
-    def vable_and_vrefs_after_residual_call(self):
+    def vrefs_after_residual_call(self):
         vrefinfo = self.staticdata.virtualref_info
         for i in range(0, len(self.virtualref_boxes), 2):
             virtualbox = self.virtualref_boxes[i]
@@ -1780,7 +1812,8 @@
                 # generating a VIRTUAL_REF_FINISH on it and replacing
                 # it by ConstPtr(NULL).
                 self.stop_tracking_virtualref(i)
-        #
+
+    def vable_after_residual_call(self):
         vinfo = self.staticdata.virtualizable_info
         if vinfo is not None:
             virtualizable_box = self.virtualizable_boxes[-1]



More information about the Pypy-commit mailing list