[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