[pypy-svn] r55844 - in pypy/branch/oo-jit/pypy/jit: codegen codegen/llgraph rainbow rainbow/test timeshifter

antocuni at codespeak.net antocuni at codespeak.net
Sat Jun 14 15:53:07 CEST 2008


Author: antocuni
Date: Sat Jun 14 15:53:05 2008
New Revision: 55844

Modified:
   pypy/branch/oo-jit/pypy/jit/codegen/llgraph/rgenop.py
   pypy/branch/oo-jit/pypy/jit/codegen/model.py
   pypy/branch/oo-jit/pypy/jit/rainbow/codewriter.py
   pypy/branch/oo-jit/pypy/jit/rainbow/interpreter.py
   pypy/branch/oo-jit/pypy/jit/rainbow/test/test_interpreter.py
   pypy/branch/oo-jit/pypy/jit/timeshifter/rcontainer.py
   pypy/branch/oo-jit/pypy/jit/timeshifter/rtimeshift.py
Log:
implement red_instanceof



Modified: pypy/branch/oo-jit/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/llgraph/rgenop.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/llgraph/rgenop.py	Sat Jun 14 15:53:05 2008
@@ -295,6 +295,12 @@
                      "genop_ooisnull: bad currently_writing")
         return LLVar(llimpl.genop(self.b, 'ooisnull', [gv_obj], gv_Bool.v))
 
+    def genop_instanceof(self, gv_obj, (gv_TYPE, gv_OBJTYPE)):
+        ll_assert(self.rgenop.currently_writing is self,
+                     "genop_instanceof: bad currently_writing")
+        vars_gv = [gv_obj.v, gv_TYPE.v]
+        return LLVar(llimpl.genop(self.b, 'instanceof', vars_gv, gv_Bool.v))
+
     def genop_cast_int_to_ptr(self, gv_PTRTYPE, gv_int):
         ll_assert(self.rgenop.currently_writing is self,
                      "genop_cast_int_to_ptr: bad currently_writing")

Modified: pypy/branch/oo-jit/pypy/jit/codegen/model.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/model.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/model.py	Sat Jun 14 15:53:05 2008
@@ -323,7 +323,8 @@
     #@staticmethod
     #@specialize.memo()
     #def allocToken(T):
-    #    """Return a token describing the size of the fixed-size type T."""
+    #    """Return a token describing the size of the fixed-size type T.
+    #    For ootype backends, it's also passed to genop_instanceof."""
     #    raise NotImplementedError
 
     #@staticmethod

Modified: pypy/branch/oo-jit/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/rainbow/codewriter.py	Sat Jun 14 15:53:05 2008
@@ -879,7 +879,7 @@
     def methdesc_position(self, TYPE, name):
         key = (TYPE, name)
         if key in self.methdesc_positions:
-            return self.methdesc_positions[tok]
+            return self.methdesc_positions[key]
         result = len(self.methdescs)
         desc = MethodDesc(self.RGenOp, self.exceptiondesc, TYPE, name)
         self.methdescs.append(desc)
@@ -1703,6 +1703,20 @@
     def serialize_op_oodowncast(self, op):
         return self.serialize_op_cast_pointer(op)
 
+    def serialize_op_instanceof(self, op):
+        color = self.opcolor(op)
+        if color == 'green':
+            # delegate to the default implementation in
+            # serialize_op, since it works just fine
+            raise NotImplementedError
+        assert color == 'red', 'unknown color %s' % color
+        v1, cType = op.args
+        arg1 = self.serialize_oparg('red', v1)
+        index = self.structtypedesc_position(cType.value)
+        self.emit('red_instanceof')
+        self.emit(arg1, index)
+        self.register_redvar(op.result)
+
     def serialize_op_new(self, op):
         TYPE = op.args[0].value
         if TYPE.oopspec_name is not None:

Modified: pypy/branch/oo-jit/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/rainbow/interpreter.py	Sat Jun 14 15:53:05 2008
@@ -1084,6 +1084,16 @@
         return rtimeshift.genptreq(self.jitstate, ptrbox1,
                                    ptrbox2, False)
 
+    @arguments("red", "structtypedesc", returns="red")
+    def opimpl_red_instanceof(self, objbox, typedesc):
+        if objbox.content is None:
+            return rtimeshift.geninstanceof(self.jitstate, objbox,
+                                            typedesc)
+        # else it's a vstruct
+        objtypedesc = objbox.content.typedesc
+        result = objtypedesc.issubtype(typedesc)
+        return rvalue.ll_fromvalue(self.jitstate, result)
+
     @arguments("red", "jumptarget")
     def opimpl_goto_if_vstruct(self, objbox, target):
         if objbox.content is not None:

Modified: pypy/branch/oo-jit/pypy/jit/rainbow/test/test_interpreter.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/rainbow/test/test_interpreter.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/rainbow/test/test_interpreter.py	Sat Jun 14 15:53:05 2008
@@ -2018,6 +2018,33 @@
         res = self.interpret(main2, [5, 6], policy=StopAtXPolicy(g))
         assert res == 11
 
+    def test_red_isinstance(self):
+        class A:
+            pass
+        class B(A):
+            pass
+        def fn(flag):
+            obj = flag and B() or A()
+            return isinstance(obj, B)
+        res = self.interpret(fn, [True])
+        assert res
+        self.check_insns({})
+
+    def test_red_isinstance_degenerated(self):
+        class A:
+            pass
+        class B(A):
+            pass
+        def g(obj):
+            return obj
+        def fn(flag):
+            obj = flag and B() or A()
+            g(obj) # force container
+            return isinstance(obj, B)
+        res = self.interpret(fn, [True], [], policy=StopAtXPolicy(g))
+        assert res
+        #self.check_insns({})
+
 
     def test_manymanyvars(self):
 

Modified: pypy/branch/oo-jit/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/timeshifter/rcontainer.py	Sat Jun 14 15:53:05 2008
@@ -259,11 +259,16 @@
     StructFieldDesc = None # patched later with InstanceFieldDesc
     PtrRedBox = rvalue.InstanceRedBox
 
-    _attrs_ = ['methodcodes']
+    _attrs_ = ['methodcodes', 'supertypedesc']
+    supertypedesc = None
 
     def __init__(self, RGenOp, TYPE):
         AbstractStructTypeDesc.__init__(self, RGenOp, TYPE)
         self.methodcodes = {} # method name --> jitcode
+        if isinstance(TYPE, ootype.Instance):
+            SUPER = TYPE._superclass
+            if SUPER is not None:
+                self.supertypedesc = InstanceTypeDesc(RGenOp, SUPER)
 
     def Ptr(self, TYPE):
         return TYPE
@@ -298,6 +303,14 @@
         except AttributeError:
             return TYPE._short_name()
 
+    def issubtype(self, other):
+        desc = self
+        while desc is not None:
+            if desc is other:
+                return True
+            desc = desc.supertypedesc
+        return False
+
 def create_varsize(jitstate, contdesc, sizebox):
     gv_size = sizebox.getgenvar(jitstate)
     alloctoken = contdesc.varsizealloctoken

Modified: pypy/branch/oo-jit/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/timeshifter/rtimeshift.py	Sat Jun 14 15:53:05 2008
@@ -594,6 +594,14 @@
 ##def ll_gvar_from_constant(jitstate, ll_value):
 ##    return jitstate.curbuilder.rgenop.genconst(ll_value)
 
+def geninstanceof(jitstate, objbox, typedesc):
+    builder = jitstate.curbuilder
+    gv_objbox = objbox.getgenvar(jitstate)
+    gv_res = builder.genop_instanceof(gv_objbox, typedesc.alloctoken)
+    boolbox = rvalue.BoolRedBox(gv_res)
+    #boolbox.iftrue.append(booleffect.PtrIsNonZeroEffect(argbox, reverse)) # ???
+    return boolbox
+
 def gen_residual_oosend(jitstate, argboxes, methdesc):
     builder = jitstate.curbuilder
     selfbox = argboxes[0]



More information about the Pypy-commit mailing list