[pypy-svn] r31676 - in pypy/branch/no-zeroing-assumption/pypy: rpython/memory translator/c/src

mwh at codespeak.net mwh at codespeak.net
Sat Aug 26 13:08:51 CEST 2006


Author: mwh
Date: Sat Aug 26 13:08:50 2006
New Revision: 31676

Modified:
   pypy/branch/no-zeroing-assumption/pypy/rpython/memory/gctransform.py
   pypy/branch/no-zeroing-assumption/pypy/translator/c/src/mem.h
Log:
actually allocate some non zeroed memory.


Modified: pypy/branch/no-zeroing-assumption/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/branch/no-zeroing-assumption/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/branch/no-zeroing-assumption/pypy/rpython/memory/gctransform.py	Sat Aug 26 13:08:50 2006
@@ -20,6 +20,7 @@
 from pypy.rpython.memory.gcheader import GCHeaderBuilder
 from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
 from pypy.rpython.extregistry import ExtRegistryEntry
+from pypy.rpython.rtyper import LowLevelOpList
 import sets, os
 
 def var_ispyobj(var):
@@ -1216,28 +1217,33 @@
         c_size = rmodel.inputconst(lltype.Signed, info["fixedsize"])
         if not op.opname.endswith('_varsize'):
             if op.opname.startswith('zero'):
-                p = self.malloc_fixedsize_clear_ptr
+                malloc_ptr = self.malloc_fixedsize_clear_ptr
             else:
-                p = self.malloc_fixedsize_clear_ptr
-            args = [p, self.c_const_gc, c_type_id, c_size, c_can_collect]
+                malloc_ptr = self.malloc_fixedsize_ptr
+            args = [self.c_const_gc, c_type_id, c_size, c_can_collect]
         else:
             v_length = op.args[-1]
             c_ofstolength = rmodel.inputconst(lltype.Signed, info['ofstolength'])
             c_varitemsize = rmodel.inputconst(lltype.Signed, info['varitemsize'])
-            if op.opname.startswith('zero'):
-                p = self.malloc_varsize_clear_ptr
-            else:
-                p = self.malloc_varsize_clear_ptr
-            args = [p, self.c_const_gc, c_type_id, v_length, c_size,
+            malloc_ptr = self.malloc_varsize_clear_ptr
+##             if op.opname.startswith('zero'):
+##                 p = self.malloc_varsize_clear_ptr
+##             else:
+##                 p = self.malloc_varsize_clear_ptr
+            args = [self.c_const_gc, c_type_id, v_length, c_size,
                     c_varitemsize, c_ofstolength, c_can_collect]
         c_has_finalizer = rmodel.inputconst(
             lltype.Bool, bool(self.finalizer_funcptr_for_type(TYPE)))
         args.append(c_has_finalizer)
         v = varoftype(llmemory.GCREF)
-        newop = SpaceOperation("direct_call", args, v)
+        newop = SpaceOperation("direct_call", [malloc_ptr] + args, v)
         ops, index = self.protect_roots(newop, livevars, block,
                                         block.operations.index(op))
         ops.append(SpaceOperation("cast_opaque_ptr", [v], op.result))
+        if malloc_ptr == self.malloc_fixedsize_ptr:
+            llops = LowLevelOpList(None)
+            gen_zero_gc_pointers(TYPE, op.result, llops)
+            ops.extend(llops)            
         return ops
 
     replace_zero_malloc = replace_malloc
@@ -1342,6 +1348,21 @@
         offsets.append(0)
     return offsets
 
+def gen_zero_gc_pointers(TYPE, v, llops):
+    assert isinstance(TYPE, lltype.Struct)
+    for name in TYPE._names:
+        FIELD = getattr(TYPE, name)
+        if isinstance(FIELD, lltype.Ptr) and FIELD._needsgc():
+            c_name = Constant(name, lltype.Void)
+            c_null = Constant(lltype.nullptr(FIELD.TO), FIELD)
+            llops.genop('bare_setfield', [v, c_name, c_null])
+        elif isinstance(FIELD, lltype.Struct):
+            c_name = Constant(name, lltype.Void)
+            v1 = llops.genop('getsubstruct', [v, c_name],
+                             resulttype = lltype.Ptr(FIELD))
+            gen_zero_gc_pointers(FIELD, v1, llops)
+
+
 # ____________________________________________________________
 
 

Modified: pypy/branch/no-zeroing-assumption/pypy/translator/c/src/mem.h
==============================================================================
--- pypy/branch/no-zeroing-assumption/pypy/translator/c/src/mem.h	(original)
+++ pypy/branch/no-zeroing-assumption/pypy/translator/c/src/mem.h	Sat Aug 26 13:08:50 2006
@@ -23,7 +23,11 @@
 #define alloca  _alloca
 #endif
 
+#ifdef USING_BOEHM_GC
 #define MALLOC_ZERO_FILLED 1
+#else
+#define MALLOC_ZERO_FILLED 0
+#endif
 
 #define OP_STACK_MALLOC(size,r,restype)                                 \
     r = (restype) alloca(size);                                         \



More information about the Pypy-commit mailing list