[pypy-commit] pypy gc_no_cleanup_nursery: Remove the zeroing of gc pointers here, however, still remember we call
fijal
noreply at buildbot.pypy.org
Mon Sep 15 00:14:17 CEST 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73537:6f0916ba2510
Date: 2014-09-14 16:13 -0600
http://bitbucket.org/pypy/pypy/changeset/6f0916ba2510/
Log: Remove the zeroing of gc pointers here, however, still remember we
call malloc(zero=True) and reflect it in jtransform
diff --git a/rpython/jit/codewriter/heaptracker.py b/rpython/jit/codewriter/heaptracker.py
--- a/rpython/jit/codewriter/heaptracker.py
+++ b/rpython/jit/codewriter/heaptracker.py
@@ -125,3 +125,4 @@
vtable = descr.as_vtable_size_descr()._corresponding_vtable
vtable = llmemory.cast_ptr_to_adr(vtable)
return adr2int(vtable)
+
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
@@ -614,28 +614,23 @@
arraydescr = self.cpu.arraydescrof(ARRAY)
op1 = SpaceOperation('new_array', [op.args[2], arraydescr],
op.result)
- if self._has_gcptrs_in(ARRAY):
- return self.zero_contents([op1], op.result, ARRAY,
- only_gc_pointers=True)
if op.args[1].value.get('zero', False):
return self.zero_contents([op1], op.result, ARRAY)
return op1
- def zero_contents(self, ops, v, TYPE, only_gc_pointers=False):
+ def zero_contents(self, ops, v, TYPE):
if isinstance(TYPE, lltype.Struct):
for name, FIELD in TYPE._flds.iteritems():
- if (not only_gc_pointers or
- isinstance(FIELD, lltype.Ptr) and FIELD._needsgc()):
+ if isinstance(FIELD, lltype.Struct):
+ # substruct
+ self.zero_contents(ops, v, FIELD)
+ else:
c_name = Constant(name, lltype.Void)
c_null = Constant(FIELD._defl(), FIELD)
op = SpaceOperation('setfield', [v, c_name, c_null],
None)
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',
@@ -906,10 +901,9 @@
return self._rewrite_raw_malloc(op, 'raw_malloc_fixedsize', [])
#
if op.args[1].value.get('zero', False):
- true_zero = True
+ zero = True
else:
- assert op.args[1].value == {'flavor': 'gc'}
- true_zero = False
+ zero = False
STRUCT = op.args[0].value
vtable = heaptracker.get_vtable_for_gcstruct(self.cpu, STRUCT)
if vtable:
@@ -931,11 +925,8 @@
opname = 'new'
sizedescr = self.cpu.sizeof(STRUCT)
op1 = SpaceOperation(opname, [sizedescr], op.result)
- if true_zero:
+ if zero:
return self.zero_contents([op1], op.result, STRUCT)
- if self._has_gcptrs_in(STRUCT):
- return self.zero_contents([op1], op.result, STRUCT,
- only_gc_pointers=True)
return op1
def _has_gcptrs_in(self, STRUCT):
@@ -1677,8 +1668,6 @@
v.concretetype = lltype.Signed
ops.append(SpaceOperation('int_force_ge_zero', [v_length], v))
ops.append(SpaceOperation('new_array', [v, arraydescr], op.result))
- if self._has_gcptrs_in(op.result.concretetype.TO):
- self.zero_contents(ops, op.result, op.result.concretetype.TO)
return ops
def do_fixed_list_len(self, op, args, arraydescr):
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
@@ -529,18 +529,6 @@
assert op1.opname == 'new'
assert op1.args == [('sizedescr', S)]
-def test_malloc_new_zero():
- SS = lltype.GcStruct('SS')
- S = lltype.GcStruct('S', ('x', lltype.Ptr(SS)))
- v = varoftype(lltype.Ptr(S))
- op = SpaceOperation('malloc', [Constant(S, lltype.Void),
- Constant({'flavor': 'gc'}, lltype.Void)], v)
- op1, op2 = Transformer(FakeCPU()).rewrite_operation(op)
- assert op1.opname == 'new'
- assert op1.args == [('sizedescr', S)]
- assert op2.opname == 'setfield_gc_r'
- assert op2.args[0] == v
-
def test_malloc_new_zero_2():
S = lltype.GcStruct('S', ('x', lltype.Signed))
v = varoftype(lltype.Ptr(S))
@@ -560,7 +548,8 @@
('xx', lltype.Ptr(S0)))
v = varoftype(lltype.Ptr(S2))
op = SpaceOperation('malloc', [Constant(S2, lltype.Void),
- Constant({'flavor': 'gc'}, lltype.Void)], v)
+ Constant({'flavor': 'gc',
+ 'zero': True}, lltype.Void)], v)
op1, op2, op3 = Transformer(FakeCPU()).rewrite_operation(op)
assert op1.opname == 'new'
assert op1.args == [('sizedescr', S2)]
@@ -1068,12 +1057,8 @@
def test_malloc_varsize_zero():
c_A = Constant(lltype.GcArray(lltype.Signed), lltype.Void)
- c_flags = Constant({"flavor": "gc"}, lltype.Void)
v1 = varoftype(lltype.Signed)
v2 = varoftype(c_A.value)
- op = SpaceOperation('malloc_varsize', [c_A, c_flags, v1], v2)
- op1 = Transformer(FakeCPU()).rewrite_operation(op)
- assert op1.opname == 'new_array'
c_flags = Constant({"flavor": "gc", "zero": True}, lltype.Void)
op = SpaceOperation('malloc_varsize', [c_A, c_flags, v1], v2)
op1, op2 = Transformer(FakeCPU()).rewrite_operation(op)
More information about the pypy-commit
mailing list