[pypy-svn] r54082 - in pypy/branch/jit-hotpath/pypy/jit/rainbow: . test

antocuni at codespeak.net antocuni at codespeak.net
Thu Apr 24 14:31:05 CEST 2008


Author: antocuni
Date: Thu Apr 24 14:31:03 2008
New Revision: 54082

Modified:
   pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_interpreter.py
Log:
implement handle_green_oosend



Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py	Thu Apr 24 14:31:03 2008
@@ -56,32 +56,28 @@
         colororder = None
     return colororder
 
-class CallDesc:
+class BaseCallDesc(object):
+
     __metaclass__ = cachedtype
 
-    def __init__(self, RGenOp, exceptiondesc, FUNCTYPE, colororder=None):
-        self.exceptiondesc = exceptiondesc
-        self.sigtoken = RGenOp.sigToken(get_functype(FUNCTYPE))
-        self.result_kind = RGenOp.kindToken(get_functype(FUNCTYPE).RESULT)
-        self.colororder = colororder
-        # xxx what if the result is virtualizable?
-        self.redboxbuilder = rvalue.ll_redboxbuilder(get_functype(FUNCTYPE).RESULT)
-        whatever_return_value = get_functype(FUNCTYPE).RESULT._defl()
-        numargs = len(get_functype(FUNCTYPE).ARGS)
-        voidargcount = 0
-        for ARG in get_functype(FUNCTYPE).ARGS:
-            if ARG == lltype.Void:
-                voidargcount += 1
-        argiter = unrolling_iterable(get_functype(FUNCTYPE).ARGS)
-        RETURN = get_functype(FUNCTYPE).RESULT
-        if RETURN is lltype.Void:
+    def _define_return_value(self, RGenOp, FUNCTYPE):
+        RESULT = get_functype(FUNCTYPE).RESULT
+        if RESULT is lltype.Void:
             self.gv_whatever_return_value = None
         else:
+            whatever_return_value = RESULT._defl()
             self.gv_whatever_return_value = RGenOp.constPrebuiltGlobal(
                 whatever_return_value)
 
-        def perform_call(rgenop, gv_fnptr, args_gv):
-            fnptr = gv_fnptr.revealconst(FUNCTYPE)
+    def _define_do_perform_call(self, ARGS, RESULT):
+        numargs = len(ARGS)
+        voidargcount = 0
+        for ARG in ARGS:
+            if ARG == lltype.Void:
+                voidargcount += 1
+        argiter = unrolling_iterable(ARGS)
+    
+        def do_perform_call(rgenop, fn_or_meth, args_gv):
             assert len(args_gv) + voidargcount == numargs
             args = ()
             j = 0
@@ -93,13 +89,14 @@
                     arg = genconst.revealconst(ARG)
                     args += (arg, )
                     j += 1
-            result = maybe_on_top_of_llinterp(self.exceptiondesc, fnptr)(*args)
-            if RETURN is lltype.Void:
+            result = maybe_on_top_of_llinterp(self.exceptiondesc, fn_or_meth)(*args)
+            if RESULT is lltype.Void:
                 return None
             else:
                 return rgenop.genconst(result)
 
-        self.perform_call = perform_call
+        self.do_perform_call = do_perform_call
+        return do_perform_call
 
     def _freeze_(self):
         return True
@@ -119,6 +116,26 @@
         if gv_result is not None:
             interpreter.green_result(gv_result)
 
+
+class CallDesc(BaseCallDesc):
+
+    def __init__(self, RGenOp, exceptiondesc, FUNCTYPE, colororder=None):
+        self.exceptiondesc = exceptiondesc
+        self.sigtoken = RGenOp.sigToken(get_functype(FUNCTYPE))
+        self.result_kind = RGenOp.kindToken(get_functype(FUNCTYPE).RESULT)
+        self.colororder = colororder
+        # xxx what if the result is virtualizable?
+        self.redboxbuilder = rvalue.ll_redboxbuilder(get_functype(FUNCTYPE).RESULT)
+
+        T = get_functype(FUNCTYPE)
+        do_perform_call = self._define_do_perform_call(T.ARGS, T.RESULT)
+        self._define_return_value(RGenOp, FUNCTYPE)
+
+        def perform_call(rgenop, gv_fnptr, greenargs):
+            fnptr = gv_fnptr.revealconst(FUNCTYPE)
+            return do_perform_call(rgenop, fnptr, greenargs)
+        self.perform_call = perform_call
+        
     def perform_call_mixed(self, rgenop, gv_fnptr, greens_gv, reds_gv):
         if self.colororder is None:
             args_gv = greens_gv + reds_gv
@@ -166,14 +183,26 @@
         self.calldesc = CallDesc(codewriter.RGenOp, codewriter.exceptiondesc,
                                  lltype.typeOf(fnptr), colororder)
 
-class MethodDesc(object):
+class MethodDesc(BaseCallDesc):
 
-    def __init__(self, RGenOp, SELFTYPE, methname):
+    def __init__(self, RGenOp, exceptiondesc, SELFTYPE, methname):
+        self.exceptiondesc = exceptiondesc
+        self.SELFTYPE = SELFTYPE
+        self.methname = methname
+        
         _, meth = SELFTYPE._lookup(methname)
         METH = ootype.typeOf(meth)
         self.methtoken = RGenOp.methToken(SELFTYPE, methname)
         self.redboxbuilder = rvalue.ll_redboxbuilder(METH.RESULT)
+        self.colororder = None
+        ARGS = (SELFTYPE,) + METH.ARGS
+        do_perform_call = self._define_do_perform_call(ARGS, METH.RESULT)
+        self._define_return_value(RGenOp, METH)
 
+        def perform_call(rgenop, gv_fnptr, args_gv):
+            assert gv_fnptr is None
+            return do_perform_call(rgenop, meth, args_gv)
+        self.perform_call = perform_call
 
 class BytecodeWriter(object):
 
@@ -852,7 +881,7 @@
         if key in self.methdesc_positions:
             return self.methdesc_positions[tok]
         result = len(self.methdescs)
-        desc = MethodDesc(self.RGenOp, TYPE, name)
+        desc = MethodDesc(self.RGenOp, self.exceptiondesc, TYPE, name)
         self.methdescs.append(desc)
         self.methdesc_positions[key] = result
         return result
@@ -1691,7 +1720,19 @@
         return handler(op, withexc)
 
     def handle_green_oosend(self, op, withexc):
-        assert False, 'TODO'
+        SELFTYPE, name, opargs = self.decompose_oosend(op)
+        has_result = self.has_result(op)
+        pos = self.methdesc_position(SELFTYPE, name)
+        emitted_args = []
+        for v in op.args[1:]:
+            if v.concretetype != lltype.Void:
+                emitted_args.append(self.serialize_oparg("green", v))
+        self.emit("green_oosend")
+        self.emit(pos)
+        self.emit(len(emitted_args))
+        self.emit(*emitted_args)
+        if op.result.concretetype != ootype.Void:
+            self.register_greenvar(op.result)
 
     def handle_oopspec_oosend(self, op, withexc):
         SELFTYPE, name, opargs = self.decompose_oosend(op)

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py	Thu Apr 24 14:31:03 2008
@@ -1093,6 +1093,11 @@
         self.run(self.jitstate, bytecode, greenargs, redargs,
                  start_bytecode_loop=False)
 
+    @arguments("methdesc", "green_varargs")
+    def opimpl_green_oosend(self, methdesc, greenargs):
+        # we pass None as fnptr, since it's not needed/used
+        methdesc.green_call(self, None, greenargs)
+
     @arguments("red_varargs", "methdesc", "bool")
     def opimpl_builtin_oosend(self, redargs, methdesc, has_result):
         result = rtimeshift.gen_external_oosend(self.jitstate, redargs,

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_interpreter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_interpreter.py	Thu Apr 24 14:31:03 2008
@@ -1004,7 +1004,6 @@
         self.check_insns({})
 
     def test_green_deepfrozen_oosend(self):
-        py.test.skip('in progress')
         d = {1: 2, 2: 4, 3: 9}
         def f(k):
             d1 = hint(d, deepfreeze=True)


More information about the pypy-svn mailing list