[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