[pypy-commit] pypy gc_no_cleanup_nursery: fix codewriter for nested structs (a bit hackish)

fijal noreply at buildbot.pypy.org
Sun Sep 7 18:50:16 CEST 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73360:be3eeb6dcff1
Date: 2014-09-07 10:49 -0600
http://bitbucket.org/pypy/pypy/changeset/be3eeb6dcff1/

Log:	fix codewriter for nested structs (a bit hackish)

diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -630,7 +630,12 @@
                     c_null = Constant(FIELD._defl(), FIELD)
                     op = SpaceOperation('setfield', [v, c_name, c_null],
                                         None)
-                    self.extend_with(ops, self.rewrite_op_setfield(op))
+                    self.extend_with(ops, self.rewrite_op_setfield(op,
+                                          override_type=TYPE))
+                elif isinstance(FIELD, lltype.Struct):
+                    # substruct
+                    self.zero_contents(ops, v, FIELD,
+                                       only_gc_pointers=only_gc_pointers)
         elif isinstance(TYPE, lltype.Array):
             arraydescr = self.cpu.arraydescrof(TYPE)
             ops.append(SpaceOperation('clear_array_contents',
@@ -793,13 +798,17 @@
                    op1]
         return op1
 
-    def rewrite_op_setfield(self, op):
+    def rewrite_op_setfield(self, op, override_type=None):
         if self.is_typeptr_getset(op):
             # ignore the operation completely -- instead, it's done by 'new'
             return
         # turn the flow graph 'setfield' operation into our own version
         [v_inst, c_fieldname, v_value] = op.args
         RESULT = v_value.concretetype
+        if override_type is not None:
+            TYPE = override_type
+        else:
+            TYPE = v_inst.concretetype.TO
         if RESULT is lltype.Void:
             return
         # check for virtualizable
@@ -809,10 +818,12 @@
             return [SpaceOperation('-live-', [], None),
                     SpaceOperation('setfield_vable_%s' % kind,
                                    [v_inst, v_value, descr], None)]
-        self.check_field_access(v_inst.concretetype.TO)
-        argname = getattr(v_inst.concretetype.TO, '_gckind', 'gc')
-        descr = self.cpu.fielddescrof(v_inst.concretetype.TO,
-                                      c_fieldname.value)
+        self.check_field_access(TYPE)
+        if override_type:
+            argname = 'gc'
+        else:
+            argname = getattr(TYPE, '_gckind', 'gc')
+        descr = self.cpu.fielddescrof(TYPE, c_fieldname.value)
         kind = getkind(RESULT)[0]
         if argname == 'raw' and kind == 'r':
             raise Exception("setfield_raw_r not supported")
diff --git a/rpython/jit/codewriter/test/test_jtransform.py b/rpython/jit/codewriter/test/test_jtransform.py
--- a/rpython/jit/codewriter/test/test_jtransform.py
+++ b/rpython/jit/codewriter/test/test_jtransform.py
@@ -553,6 +553,22 @@
     assert op2.opname == 'setfield_gc_i'
     assert op2.args[0] == v
 
+def test_malloc_new_zero_nested():
+    S0 = lltype.GcStruct('S0')
+    S = lltype.Struct('S', ('x', lltype.Ptr(S0)))
+    S2 = lltype.GcStruct('S2', ('parent', S),
+                         ('xx', lltype.Ptr(S0)))
+    v = varoftype(lltype.Ptr(S2))
+    op = SpaceOperation('malloc', [Constant(S2, lltype.Void),
+                                   Constant({'flavor': 'gc'}, lltype.Void)], v)
+    op1, op2, op3 = Transformer(FakeCPU()).rewrite_operation(op)
+    assert op1.opname == 'new'
+    assert op1.args == [('sizedescr', S2)]
+    assert op2.opname == 'setfield_gc_r'
+    assert op2.args[0] == v
+    assert op3.opname == 'setfield_gc_r'
+    assert op3.args[0] == v
+
 def test_malloc_new_with_vtable():
     vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     S = lltype.GcStruct('S', ('parent', rclass.OBJECT))


More information about the pypy-commit mailing list