[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