[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