[pypy-svn] r60505 - in pypy/branch/oo-jit/pypy/jit/rainbow: . test

antocuni at codespeak.net antocuni at codespeak.net
Tue Dec 16 10:58:31 CET 2008


Author: antocuni
Date: Tue Dec 16 10:58:30 2008
New Revision: 60505

Modified:
   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_promotion.py
Log:
make isinstance working for objects whose class has been promoted



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	Tue Dec 16 10:58:30 2008
@@ -1787,6 +1787,10 @@
             # serialize_op, since it works just fine
             raise NotImplementedError
         assert color == 'red', 'unknown color %s' % color
+        INSTANCE = op.args[0].concretetype
+        TYPES = INSTANCE._all_subclasses()
+        for T in TYPES:
+            self.register_typedesc_for_type(T)
         v1, cType = op.args
         arg1 = self.serialize_oparg('red', v1)
         index = self.structtypedesc_position(cType.value)
@@ -1946,14 +1950,17 @@
             self.register_redvar(op.result)
 
 
+    def register_typedesc_for_type(self, T):
+        descindex = self.structtypedesc_position(T)
+        desc = self.structtypedescs[descindex]
+        ooclass = ootype.runtimeClass(T)
+        self.interpreter.class2typedesc[ooclass] = desc
+        return desc
+
     def fill_methodcodes(self, INSTANCE, methname, graph2tsgraph):
-        class2typedesc = self.interpreter.class2typedesc
         TYPES = INSTANCE._all_subclasses()
         for T in TYPES:
-            descindex = self.structtypedesc_position(T)
-            desc = self.structtypedescs[descindex]
-            ooclass = ootype.runtimeClass(T)
-            class2typedesc[ooclass] = desc
+            desc = self.register_typedesc_for_type(T)
             if methname in desc.methodcodes:
                 break # we already filled the codes for this type
             _, meth = T._lookup(methname)

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	Tue Dec 16 10:58:30 2008
@@ -1113,8 +1113,11 @@
                                             typedesc)
         # else it's a vstruct
         content = objbox.content
-        assert isinstance(content, rcontainer.VirtualStruct)
-        objtypedesc = content.typedesc
+        if isinstance(content, rcontainer.PartialDataStruct):
+            objtypedesc = self.typedesc_from_partial_struct(content)
+        else:
+            assert isinstance(content, rcontainer.VirtualStruct)
+            objtypedesc = content.typedesc
         result = objtypedesc.issubtype(typedesc)
         return rvalue.ll_fromvalue(self.jitstate, result)
 
@@ -1133,20 +1136,24 @@
         if known_class:
             self.frame.pc = target
 
+    def typedesc_from_partial_struct(self, vstruct):
+        from pypy.rpython.ootypesystem.rclass import CLASSTYPE
+        classbox = vstruct.op_getfield(self.jitstate, self.class_fielddesc)
+        assert classbox.is_constant()
+        gv_meta = classbox.getgenvar(self.jitstate)
+        meta = gv_meta.revealconst(CLASSTYPE)
+        cls = meta.class_ # to be removed after the merging of the less-meta-instances branch
+        typedesc = self.class2typedesc[cls]
+        return typedesc
+
     @arguments("green_varargs", "red_varargs", "string")
     def opimpl_const_oosend(self, greenargs, redargs, methname):
-        from pypy.rpython.ootypesystem.rclass import CLASSTYPE
         selfbox = redargs[0]
         assert isinstance(selfbox, rvalue.AbstractPtrRedBox)
         vstruct = selfbox.content
         assert vstruct is not None
         if isinstance(vstruct, rcontainer.PartialDataStruct):
-            classbox = vstruct.op_getfield(self.jitstate, self.class_fielddesc)
-            assert classbox.is_constant()
-            gv_meta = classbox.getgenvar(self.jitstate)
-            meta = gv_meta.revealconst(CLASSTYPE)
-            cls = meta.class_ # to be removed after the merging of the less-meta-instances branch
-            typedesc = self.class2typedesc[cls]
+            typedesc = self.typedesc_from_partial_struct(vstruct)
         else:
             assert isinstance(vstruct, rcontainer.VirtualStruct)
             typedesc = vstruct.typedesc

Modified: pypy/branch/oo-jit/pypy/jit/rainbow/test/test_promotion.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/rainbow/test/test_promotion.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/rainbow/test/test_promotion.py	Tue Dec 16 10:58:30 2008
@@ -531,6 +531,26 @@
         res = self.interpret(ll_function, [True], [], policy=StopAtXPolicy(make_obj))
         self.check_flexswitches(2)
 
+    def test_isinstance_after_promotion(self):
+        class A:
+            pass
+        class B(A):
+            pass
+
+        def make_obj(flag):
+            return flag and A() or B()
+
+        def ll_function(flag):
+            hint(None, global_merge_point=True)
+            obj = make_obj(flag)
+            promoted_obj = hint(obj, promote_class=True)
+            return isinstance(promoted_obj, B)
+
+        res = self.interpret(ll_function, [False], [], policy=StopAtXPolicy(make_obj))
+        assert res
+        self.check_flexswitches(2)
+        
+
 class TestLLType(BaseTestPromotion):
     type_system = "lltype"
     to_rstr = staticmethod(LLSupport.to_rstr)



More information about the Pypy-commit mailing list