[pypy-svn] r32246 - in pypy/branch/more-gckinds/pypy: rpython/memory translator/c

mwh at codespeak.net mwh at codespeak.net
Wed Sep 13 11:21:30 CEST 2006


Author: mwh
Date: Wed Sep 13 11:21:29 2006
New Revision: 32246

Modified:
   pypy/branch/more-gckinds/pypy/rpython/memory/gctransform.py
   pypy/branch/more-gckinds/pypy/translator/c/funcgen.py
Log:
gctransform and genc support for {get,set}interiorfield.
only 5 genc tests fail, not bad.
i think i may have actually made gctransform cleaner in the process...


Modified: pypy/branch/more-gckinds/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/branch/more-gckinds/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/branch/more-gckinds/pypy/rpython/memory/gctransform.py	Wed Sep 13 11:21:29 2006
@@ -258,28 +258,18 @@
         raise NotImplementedError("gc_protect does not make sense for this gc")
 
     def replace_setfield(self, op, livevars, block):
-        if not var_ispyobj(op.args[2]):
-            return [op]
-        oldval = varoftype(op.args[2].concretetype)
-        getoldvalop = SpaceOperation("getfield",
-                                     [op.args[0], op.args[1]], oldval)
-        result = [getoldvalop]
-        result.extend(self.push_alive(op.args[2]))
-        result.append(op)
-        result.extend(self.pop_alive(oldval))
-        return result
-
-    def replace_setarrayitem(self, op, livevars, block):
-        if not var_ispyobj(op.args[2]):
-            return [op]
-        oldval = varoftype(op.args[2].concretetype)
-        getoldvalop = SpaceOperation("getarrayitem",
-                                     [op.args[0], op.args[1]], oldval)
-        result = [getoldvalop]
-        result.extend(self.push_alive(op.args[2]))
-        result.append(op)
+        if not var_ispyobj(op.args[-1]):
+            return [SpaceOperation("bare_" + op.opname, op.args, op.result)]
+        oldval = varoftype(op.args[-1].concretetype)
+        result = []
+        result.append(SpaceOperation("g" + op.opname[1:],
+                                     op.args[:-1], oldval))
+        result.extend(self.push_alive(op.args[-1]))
+        result.append(SpaceOperation("bare_" + op.opname, op.args, op.result))
         result.extend(self.pop_alive(oldval))
         return result
+    replace_setinteriorfield = replace_setfield
+    replace_setarrayitem = replace_setfield
 
     def replace_safe_call(self, op, livevars, block):
         return [SpaceOperation("direct_call", op.args, op.result)]
@@ -502,29 +492,20 @@
         newops[-1].result = op.result
         return newops
 
-    def replace_setfield(self, op, livevars, block):
-        if not var_needsgc(op.args[2]):
-            return [op]
-        oldval = varoftype(op.args[2].concretetype)
-        getoldvalop = SpaceOperation("getfield",
-                                     [op.args[0], op.args[1]], oldval)
-        result = [getoldvalop]
-        result.extend(self.push_alive(op.args[2]))
-        result.append(op)
-        result.extend(self.pop_alive(oldval))
-        return result
 
-    def replace_setarrayitem(self, op, livevars, block):
-        if not var_needsgc(op.args[2]):
-            return [op]
-        oldval = varoftype(op.args[2].concretetype)
-        getoldvalop = SpaceOperation("getarrayitem",
-                                     [op.args[0], op.args[1]], oldval)
-        result = [getoldvalop]
-        result.extend(self.push_alive(op.args[2]))
-        result.append(op)
+    def replace_setfield(self, op, livevars, block):
+        if not var_needsgc(op.args[-1]):
+            return [SpaceOperation("bare_" + op.opname, op.args, op.result)]
+        oldval = varoftype(op.args[-1].concretetype)
+        result = []
+        result.append(SpaceOperation("g" + op.opname[1:],
+                                     op.args[:-1], oldval))
+        result.extend(self.push_alive(op.args[-1]))
+        result.append(SpaceOperation("bare_" + op.opname, op.args, op.result))
         result.extend(self.pop_alive(oldval))
         return result
+    replace_setinteriorfield = replace_setfield
+    replace_setarrayitem = replace_setfield
 
 ##    -- maybe add this for tests and for consistency --
 ##    def consider_constant(self, TYPE, value):

Modified: pypy/branch/more-gckinds/pypy/translator/c/funcgen.py
==============================================================================
--- pypy/branch/more-gckinds/pypy/translator/c/funcgen.py	(original)
+++ pypy/branch/more-gckinds/pypy/translator/c/funcgen.py	Wed Sep 13 11:21:29 2006
@@ -416,9 +416,9 @@
         return result
 
     def generic_set(self, op, targetexpr):
-        newvalue = self.expr(op.args[2], special_case_void=False)
+        newvalue = self.expr(op.args[-1], special_case_void=False)
         result = ['%s = %s;' % (targetexpr, newvalue)]
-        T = self.lltypemap(op.args[2])
+        T = self.lltypemap(op.args[-1])
         result = '\n'.join(result)
         if T is Void:
             result = '/* %s */' % result
@@ -432,7 +432,7 @@
                                                      op.args[1].value)
         return self.generic_get(op, expr)
 
-    def OP_SETFIELD(self, op):
+    def OP_BARE_SETFIELD(self, op):
         assert isinstance(op.args[1], Constant)
         STRUCT = self.lltypemap(op.args[0]).TO
         structdef = self.db.gettypedefnode(STRUCT)
@@ -440,7 +440,7 @@
                                          op.args[1].value)
         return self.generic_set(op, expr)
 
-    OP_BARE_SETFIELD = OP_SETFIELD
+    #OP_SETFIELD = OP_BARE_SETFIELD
 
     def OP_GETSUBSTRUCT(self, op):
         RESULT = self.lltypemap(op.result).TO
@@ -466,7 +466,7 @@
         return self.generic_get(op, '%s[%s]' % (items,
                                                 self.expr(op.args[1])))
 
-    def OP_SETARRAYITEM(self, op):
+    def OP_BARE_SETARRAYITEM(self, op):
         ARRAY = self.lltypemap(op.args[0]).TO
         items = self.expr(op.args[0])
         if not isinstance(ARRAY, FixedSizeArray):
@@ -474,6 +474,35 @@
         return self.generic_set(op, '%s[%s]' % (items,
                                                 self.expr(op.args[1])))
 
+    def interior_expr(self, args):
+        TYPE = args[0].concretetype.TO
+        expr = '(*(' + self.expr(args[0]) + '))'
+        for arg in args[1:]:
+            defnode = self.db.gettypedefnode(TYPE)
+            if arg.concretetype is Void:
+                fieldname = arg.value
+                expr = defnode.access_expr(expr, fieldname)
+                TYPE = getattr(TYPE, fieldname)
+            else:
+                if not isinstance(TYPE, FixedSizeArray):
+                    expr = '(%s).items[%s]'%(expr, self.expr(arg))
+                else:
+                    expr = '(%s)[%s]'%(expr, self.expr(arg))
+                TYPE = TYPE.OF
+        return expr
+
+    def OP_GETINTERIORFIELD(self, op):
+        return self.generic_get(op, self.interior_expr(op.args))
+
+    def OP_BARE_SETINTERIORFIELD(self, op):
+        return self.generic_set(op, self.interior_expr(op.args[:-1]))
+
+    def OP_GETINTERIORARRAYSIZE(self, op):
+        expr = self.interior_expr(op.args)
+        return '%s = %s.length;'%(self.expr(op.result), expr)
+
+    #OP_SETINTERIORFIELD = OP_BARE_SETINTERIORFIELD
+
     def OP_GETARRAYSUBSTRUCT(self, op):
         ARRAY = self.lltypemap(op.args[0]).TO
         items = self.expr(op.args[0])



More information about the Pypy-commit mailing list