[pypy-commit] pypy cleanup-llgraph-backend: pass dynamic call tests

fijal noreply at buildbot.pypy.org
Wed Oct 17 10:50:17 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: cleanup-llgraph-backend
Changeset: r58152:43443eb2153b
Date: 2012-10-17 10:22 +0200
http://bitbucket.org/pypy/pypy/changeset/43443eb2153b/

Log:	pass dynamic call tests

diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -3,8 +3,7 @@
 
 from pypy.jit.backend import model
 from pypy.jit.backend.llgraph import support
-from pypy.jit.metainterp.history import Const, getkind, AbstractDescr, INT,\
-     REF, FLOAT
+from pypy.jit.metainterp.history import Const, getkind, AbstractDescr, VOID
 from pypy.jit.metainterp.resoperation import rop
 
 from pypy.rpython.llinterp import LLInterpreter
@@ -124,15 +123,41 @@
         return ffisupport.calldescr_dynamic_for_tests(self, atypes, rtype,
                                                       abiname)
 
+    def calldescrof_dynamic(self, cif_description, extrainfo):
+        # XXX WTF, this is happy nonsense
+        from pypy.jit.backend.llsupport.ffisupport import get_ffi_type_kind
+        from pypy.jit.backend.llsupport.ffisupport import UnsupportedKind
+        ARGS = []
+        try:
+            for itp in range(cif_description.nargs):
+                arg = cif_description.atypes[itp]
+                kind = get_ffi_type_kind(self, arg)
+                if kind != VOID:
+                    ARGS.append(support.kind2TYPE[kind[0]])
+            RESULT = support.kind2TYPE[get_ffi_type_kind(self, cif_description.rtype)[0]]
+        except UnsupportedKind:
+            return None
+        key = ('call_dynamic', RESULT, tuple(ARGS),
+               extrainfo, cif_description.abi)
+        try:
+            return self.descrs[key]
+        except KeyError:
+            descr = CallDescr(RESULT, ARGS)
+            self.descrs[key] = descr
+            return descr
+
     # ------------------------------------------------------------
 
     def call(self, func, calldescr, args):
+        TP = llmemory.cast_int_to_adr(func).ptr._obj._TYPE
+        RESULT = TP.RESULT
         func = llmemory.cast_int_to_adr(func).ptr._obj._callable
         res = func(*args)
-        return support.cast_result(calldescr.RESULT, res)
+        return support.cast_result(RESULT, res)
 
     def do_call(self, func, calldescr, args_i, args_r, args_f):
-        args = support.cast_call_args(calldescr.ARGS, args_i, args_r, args_f)
+        TP = llmemory.cast_int_to_adr(func).ptr._obj._TYPE
+        args = support.cast_call_args(TP.ARGS, args_i, args_r, args_f)
         return self.call(func, calldescr, args)
 
     bh_call_i = do_call
@@ -264,7 +289,8 @@
         raise Jump(descr, args)
 
     def execute_call(self, descr, *args):
-        return self.cpu.call(args[0], descr, args[1:])
+        call_args = support.cast_call_args_in_order(args[0], args[1:])
+        return self.cpu.call(args[0], descr, call_args)
 
     def execute_getfield_gc(self, descr, p):
         p = lltype.cast_opaque_ptr(lltype.Ptr(descr.S), p)
diff --git a/pypy/jit/backend/llgraph/support.py b/pypy/jit/backend/llgraph/support.py
--- a/pypy/jit/backend/llgraph/support.py
+++ b/pypy/jit/backend/llgraph/support.py
@@ -9,6 +9,14 @@
 
 IS_32_BIT = r_ulonglong is not r_uint
 
+kind2TYPE = {
+    'i': lltype.Signed,
+    'f': lltype.Float,
+    'L': lltype.SignedLongLong,
+    'S': lltype.SingleFloat,
+    'v': lltype.Void,
+    }
+
 def cast_to_int(x):
     TP = lltype.typeOf(x)
     if isinstance(TP, lltype.Ptr):
@@ -122,3 +130,17 @@
     assert list(argsiter_r) == []
     assert list(argsiter_f) == []
     return args
+
+def cast_call_args_in_order(func, args):
+    ARGS = llmemory.cast_int_to_adr(func).ptr._obj._TYPE.ARGS
+    call_args = []
+    for ARG, arg in zip(ARGS, args):
+        kind = getkind(ARG)
+        if kind == 'int':
+            n = cast_from_int(ARG, arg)
+        elif kind == 'ref':
+            n = cast_from_ptr(ARG, arg)
+        else:
+            n = cast_from_floatstorage(ARG, arg)
+        call_args.append(n)
+    return call_args


More information about the pypy-commit mailing list