[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