[pypy-svn] r62772 - in pypy/trunk/pypy/jit: backend/llgraph backend/x86 metainterp

arigo at codespeak.net arigo at codespeak.net
Mon Mar 9 18:48:35 CET 2009


Author: arigo
Date: Mon Mar  9 18:48:34 2009
New Revision: 62772

Modified:
   pypy/trunk/pypy/jit/backend/llgraph/runner.py
   pypy/trunk/pypy/jit/backend/x86/runner.py
   pypy/trunk/pypy/jit/metainterp/codewriter.py
Log:
Clean-up: don't push the sanity-checking during codewriter.py to the backend.


Modified: pypy/trunk/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/trunk/pypy/jit/backend/llgraph/runner.py	Mon Mar  9 18:48:34 2009
@@ -216,7 +216,7 @@
         return size*2 + bit
 
     @staticmethod
-    def calldescrof(ARGS, RESULT, ignored=None):
+    def calldescrof(ARGS, RESULT):
         if RESULT is lltype.Void:
             return sys.maxint
         token = history.getkind(RESULT)

Modified: pypy/trunk/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/runner.py	Mon Mar  9 18:48:34 2009
@@ -16,7 +16,6 @@
 from pypy.jit.metainterp.resoperation import rop, opname
 from pypy.jit.backend.x86.executor import execute
 from pypy.jit.backend.x86.support import gc_malloc_fnaddr
-from pypy.objspace.flow.model import Constant
 
 GC_MALLOC = lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed))
 
@@ -591,13 +590,7 @@
         return size_of_field, ofs
 
     @staticmethod
-    def calldescrof(argtypes, resulttype, funcobj=None):
-        if isinstance(funcobj, Constant):
-            ARGS = lltype.typeOf(funcobj.value).TO.ARGS
-            lgt = len([arg for arg in ARGS if arg is not lltype.Void])
-            assert lgt == len(argtypes)
-        else:
-            assert funcobj is None
+    def calldescrof(argtypes, resulttype):
         if resulttype is lltype.Void:
             size = 0
         else:

Modified: pypy/trunk/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/codewriter.py	Mon Mar  9 18:48:34 2009
@@ -114,6 +114,18 @@
                                   IndirectCallset(self, graphs)
         return result
 
+    def getcalldescr(self, v_func, args, result):
+        non_void_args = [x for x in args if x.concretetype is not lltype.Void]
+        NON_VOID_ARGS = [x.concretetype for x in non_void_args]
+        RESULT = result.concretetype
+        # check the number and type of arguments
+        ARGS = v_func.concretetype.TO.ARGS
+        assert NON_VOID_ARGS == [T for T in ARGS if T is not lltype.Void]
+        assert RESULT == v_func.concretetype.TO.RESULT
+        # ok
+        calldescr = self.cpu.calldescrof(NON_VOID_ARGS, RESULT)
+        return calldescr, non_void_args
+
 
     if 0:        # disabled
       def fixed_list_descr_for_tp(self, TP):
@@ -668,13 +680,12 @@
 
     def handle_residual_call(self, op):
         self.minimize_variables()
-        args = [x for x in op.args if x.concretetype is not lltype.Void]
-        argtypes = [v.concretetype for v in args]
-        resulttype = op.result.concretetype
-        calldescr = self.cpu.calldescrof(argtypes[1:], resulttype, op.args[0])
+        calldescr, non_void_args = self.codewriter.getcalldescr(op.args[0],
+                                                                op.args[1:],
+                                                                op.result)
         self.emit('residual_call')
         self.emit(calldescr)
-        self.emit_varargs(args)
+        self.emit_varargs([op.args[0]] + non_void_args)
         self.register_var(op.result)
 
     def handle_builtin_call(self, op):
@@ -717,10 +728,12 @@
             opname = 'residual_call_pure'  # XXX not for possibly-raising calls
         else:
             opname = 'residual_call'
-        calldescr = self.cpu.calldescrof(argtypes, resulttype, None)
+
+        calldescr, non_void_args = self.codewriter.getcalldescr(c_func, args,
+                                                                op.result)
         self.emit(opname)
         self.emit(calldescr)
-        self.emit_varargs([c_func] + args)
+        self.emit_varargs([c_func] + non_void_args)
         self.register_var(op.result)
 
     def handle_list_call(self, op, oopspec_name, args, TP):



More information about the Pypy-commit mailing list