[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