[pypy-svn] r32086 - in pypy/branch/more-gckinds/pypy/rpython: . lltypesystem
mwh at codespeak.net
mwh at codespeak.net
Fri Sep 8 17:01:49 CEST 2006
Author: mwh
Date: Fri Sep 8 17:01:47 2006
New Revision: 32086
Modified:
pypy/branch/more-gckinds/pypy/rpython/llinterp.py
pypy/branch/more-gckinds/pypy/rpython/lltypesystem/lloperation.py
pypy/branch/more-gckinds/pypy/rpython/lltypesystem/opimpl.py
pypy/branch/more-gckinds/pypy/rpython/rptr.py
Log:
get that test in test_rptr.py working.
opimpl.op_getinteriorfield is a little bit strange...
Modified: pypy/branch/more-gckinds/pypy/rpython/llinterp.py
==============================================================================
--- pypy/branch/more-gckinds/pypy/rpython/llinterp.py (original)
+++ pypy/branch/more-gckinds/pypy/rpython/llinterp.py Fri Sep 8 17:01:47 2006
@@ -486,6 +486,18 @@
op_bare_setfield = op_setfield
+ def op_setinteriorfield(self, obj, *fieldnamesval):
+ prefields, finalfield, fieldvalue = fieldnamesval[:-2], fieldnamesval[-2], fieldnamesval[-1]
+ for o in prefields:
+ if isinstance(o, str):
+ obj = getattr(obj, o)
+ else:
+ obj = obj[o]
+ if isinstance(finalfield, str):
+ setattr(obj, finalfield, fieldvalue)
+ else:
+ obj[finalfield] = fieldvalue
+
def op_getarrayitem(self, array, index):
return array[index]
Modified: pypy/branch/more-gckinds/pypy/rpython/lltypesystem/lloperation.py
==============================================================================
--- pypy/branch/more-gckinds/pypy/rpython/lltypesystem/lloperation.py (original)
+++ pypy/branch/more-gckinds/pypy/rpython/lltypesystem/lloperation.py Fri Sep 8 17:01:47 2006
@@ -300,8 +300,10 @@
'getarrayitem': LLOp(sideeffects=False),
'getarraysize': LLOp(canfold=True),
'getsubstruct': LLOp(canfold=True),
+ 'getinteriorfield': LLOp(canfold=True), # XXX not sure about the foldability...
'getarraysubstruct': LLOp(canfold=True),
'setfield': LLOp(),
+ 'setinteriorfield': LLOp(),
'bare_setfield': LLOp(),
'setarrayitem': LLOp(),
'cast_pointer': LLOp(canfold=True),
Modified: pypy/branch/more-gckinds/pypy/rpython/lltypesystem/opimpl.py
==============================================================================
--- pypy/branch/more-gckinds/pypy/rpython/lltypesystem/opimpl.py (original)
+++ pypy/branch/more-gckinds/pypy/rpython/lltypesystem/opimpl.py Fri Sep 8 17:01:47 2006
@@ -126,6 +126,20 @@
lltype.ContainerType)
return getattr(obj, field)
+def op_getinteriorfield(obj, *offsets):
+ checkptr(obj)
+ ob = obj
+ for o in offsets:
+ if isinstance(o, str):
+ ob = getattr(ob, o)
+ else:
+ #1/0
+ ob = ob[o]
+ if isinstance(ob, lltype._interior_ptr):
+ return obj
+ else:
+ return ob
+
def op_getarraysubstruct(array, index):
checkptr(array)
result = array[index]
Modified: pypy/branch/more-gckinds/pypy/rpython/rptr.py
==============================================================================
--- pypy/branch/more-gckinds/pypy/rpython/rptr.py (original)
+++ pypy/branch/more-gckinds/pypy/rpython/rptr.py Fri Sep 8 17:01:47 2006
@@ -36,7 +36,10 @@
return hop.inputarg(hop.r_result, arg=0)
FIELD_TYPE = getattr(self.lowleveltype.TO, attr)
if isinstance(FIELD_TYPE, ContainerType):
- newopname = 'getsubstruct'
+ if self.lowleveltype.TO._gckind == 'gc' and FIELD_TYPE._gckind == 'raw':
+ newopname = 'getinteriorfield'
+ else:
+ newopname = 'getsubstruct'
else:
newopname = 'getfield'
vlist = hop.inputargs(self, Void)
@@ -192,19 +195,19 @@
offset, = ptrtype.offsets
assert isinstance(offset, str)
self.lowleveltype = Ptr(ptrtype.PARENTTYPE)
- self.coffset = flowmodel.Constant(offset, Void)
+ self.v_offsets = [flowmodel.Constant(offset, Void)]
self.resulttype = Ptr(ptrtype.TO)
- def access(self, hop):
- assert hop.args_r[0] is self
- return hop.genop('getsubstruct', [hop.args_v[0], self.coffset],
- resulttype=self.resulttype)
-
def rtype_getattr(self, hop):
- hop2 = hop.copy()
- v_ptr = self.access(hop2)
- hop2.r_s_popfirstarg()
- hop2.v_s_insertfirstarg(v_ptr, annmodel.SomePtr(self.resulttype))
- return hop2.dispatch()
-
- rtype_setattr = rtype_getattr
+ vlist = [hop.inputarg(hop.args_r[0], 0)] + self.v_offsets
+ vlist.append(hop.inputarg(Void, 1))
+ return hop.genop('getinteriorfield', vlist,
+ resulttype=hop.r_result.lowleveltype)
+
+ def rtype_setattr(self, hop):
+ vlist = [hop.inputarg(hop.args_r[0], 0)] + self.v_offsets
+ vlist.append(hop.inputarg(Void, 1))
+ vlist.append(hop.inputarg(hop.args_r[2], 2))
+
+ return hop.genop('setinteriorfield', vlist,
+ resulttype=hop.r_result.lowleveltype)
More information about the Pypy-commit
mailing list