[pypy-svn] r28414 - in pypy/branch/pypy-malloc-nz: . annotation rpython rpython/lltypesystem rpython/memory translator/c translator/c/src

arigo at codespeak.net arigo at codespeak.net
Tue Jun 6 20:37:48 CEST 2006


Author: arigo
Date: Tue Jun  6 20:37:46 2006
New Revision: 28414

Added:
   pypy/branch/pypy-malloc-nz/
      - copied from r28413, pypy/dist/pypy/
Modified:
   pypy/branch/pypy-malloc-nz/annotation/builtin.py
   pypy/branch/pypy-malloc-nz/rpython/llinterp.py
   pypy/branch/pypy-malloc-nz/rpython/lltypesystem/llheap.py
   pypy/branch/pypy-malloc-nz/rpython/lltypesystem/llmemory.py
   pypy/branch/pypy-malloc-nz/rpython/lltypesystem/lloperation.py
   pypy/branch/pypy-malloc-nz/rpython/lltypesystem/lltype.py
   pypy/branch/pypy-malloc-nz/rpython/memory/gc.py
   pypy/branch/pypy-malloc-nz/rpython/memory/gclltype.py
   pypy/branch/pypy-malloc-nz/rpython/memory/gctransform.py
   pypy/branch/pypy-malloc-nz/rpython/memory/lladdress.py
   pypy/branch/pypy-malloc-nz/rpython/memory/simulator.py
   pypy/branch/pypy-malloc-nz/rpython/rbuiltin.py
   pypy/branch/pypy-malloc-nz/translator/c/funcgen.py
   pypy/branch/pypy-malloc-nz/translator/c/src/mem.h
Log:
A branch to experiment with a raw_malloc_nz operation that doesn't zero
out memory.



Modified: pypy/branch/pypy-malloc-nz/annotation/builtin.py
==============================================================================
--- pypy/dist/pypy/annotation/builtin.py	(original)
+++ pypy/branch/pypy-malloc-nz/annotation/builtin.py	Tue Jun  6 20:37:46 2006
@@ -543,7 +543,7 @@
 
 from pypy.rpython.memory import lladdress
 
-def raw_malloc(s_size):
+def raw_malloc(s_size, s_clear=None):
     assert isinstance(s_size, SomeInteger) #XXX add noneg...?
     return SomeAddress()
 

Modified: pypy/branch/pypy-malloc-nz/rpython/llinterp.py
==============================================================================
--- pypy/dist/pypy/rpython/llinterp.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/llinterp.py	Tue Jun  6 20:37:46 2006
@@ -798,9 +798,9 @@
     # __________________________________________________________
     # operations on addresses
 
-    def op_raw_malloc(self, size):
+    def op_raw_malloc_nz(self, size):
         assert lltype.typeOf(size) == lltype.Signed
-        return self.heap.raw_malloc(size)
+        return self.heap.raw_malloc(size, clear=False)
 
     def op_raw_malloc_usage(self, size):
         assert lltype.typeOf(size) == lltype.Signed
@@ -815,6 +815,10 @@
         assert checkadr(toaddr)
         self.heap.raw_memcopy(fromaddr, toaddr, size)
 
+    def op_raw_memclear(self, addr, size):
+        assert checkadr(addr)
+        self.heap.raw_memclear(addr, size)
+
     def op_raw_load(self, addr, typ, offset):
         assert checkadr(addr)
         value = getattr(addr, str(typ).lower())[offset]

Modified: pypy/branch/pypy-malloc-nz/rpython/lltypesystem/llheap.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llheap.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/lltypesystem/llheap.py	Tue Jun  6 20:37:46 2006
@@ -2,5 +2,5 @@
 
 from pypy.rpython.lltypesystem.lltype import pyobjectptr, malloc, free
 from pypy.rpython.lltypesystem.llmemory import raw_malloc, raw_free
-from pypy.rpython.lltypesystem.llmemory import raw_memcopy
+from pypy.rpython.lltypesystem.llmemory import raw_memcopy, raw_memclear
 from pypy.rpython.lltypesystem.llmemory import raw_malloc_usage

Modified: pypy/branch/pypy-malloc-nz/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/lltypesystem/llmemory.py	Tue Jun  6 20:37:46 2006
@@ -527,7 +527,7 @@
 
 # ____________________________________________________________
 
-def raw_malloc(size):
+def raw_malloc(size, clear=True):
     if not isinstance(size, AddressOffset):
         raise NotImplementedError(size)
     return size.raw_malloc([])
@@ -552,6 +552,9 @@
     from pypy.rpython.rctypes.rmodel import reccopy
     reccopy(source, dest)
 
+def raw_memclear(adr, size):
+    pass  # XXX
+
 # ____________________________________________________________
 
 class _arena(object):

Modified: pypy/branch/pypy-malloc-nz/rpython/lltypesystem/lloperation.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/lloperation.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/lltypesystem/lloperation.py	Tue Jun  6 20:37:46 2006
@@ -292,10 +292,11 @@
 
     # __________ address operations __________
 
-    'raw_malloc':           LLOp(canraise=(MemoryError,)),
+    'raw_malloc_nz':        LLOp(canraise=(MemoryError,)),
     'raw_malloc_usage':     LLOp(sideeffects=False),
     'raw_free':             LLOp(),
     'raw_memcopy':          LLOp(),
+    'raw_memclear':         LLOp(),
     'raw_load':             LLOp(sideeffects=False),
     'raw_store':            LLOp(),
     'adr_add':              LLOp(canfold=True),

Modified: pypy/branch/pypy-malloc-nz/rpython/lltypesystem/lltype.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/lltype.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/lltypesystem/lltype.py	Tue Jun  6 20:37:46 2006
@@ -437,12 +437,6 @@
     def _inline_is_varsize(self, last):
         raise TypeError, "%r cannot be inlined in structure" % self
 
-class PyObjectType(ContainerType):
-    __name__ = 'PyObject'
-    def __str__(self):
-        return "PyObject"
-PyObject = PyObjectType()
-
 class ForwardReference(ContainerType):
     def become(self, realcontainertype):
         if not isinstance(realcontainertype, ContainerType):
@@ -462,9 +456,6 @@
         self.__class__ = realcontainertype.__class__
         self.__dict__ = realcontainertype.__dict__
 
-GC_CONTAINER = (GcStruct, GcArray, PyObjectType, GcForwardReference,
-                GcOpaqueType)
-
 
 class Primitive(LowLevelType):
     def __init__(self, name, default):
@@ -521,6 +512,21 @@
 UniChar  = Primitive("UniChar", u'\x00')
 
 
+class PyObjectType(ContainerType):
+    def __init__(self, DATA=Void):
+        self.DATA = DATA
+        if DATA is Void:
+            self.__name__ = 'PyObject'
+        else:
+            self.__name__ = 'PyObjectType(%s)' % (DATA,)
+    def __str__(self):
+        return self.__name__
+PyObject = PyObjectType()
+
+GC_CONTAINER = (GcStruct, GcArray, PyObjectType, GcForwardReference,
+                GcOpaqueType)
+
+
 class Ptr(LowLevelType):
     __name__ = property(lambda self: '%sPtr' % self.TO.__name__)
 

Modified: pypy/branch/pypy-malloc-nz/rpython/memory/gc.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gc.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/memory/gc.py	Tue Jun  6 20:37:46 2006
@@ -1,5 +1,6 @@
 from pypy.rpython.memory.lladdress import raw_malloc, raw_free, raw_memcopy
 from pypy.rpython.memory.lladdress import NULL, _address, raw_malloc_usage
+from pypy.rpython.memory.lladdress import raw_memclear
 from pypy.rpython.memory.support import get_address_linked_list
 from pypy.rpython.memory.gcheader import GCHeaderBuilder
 from pypy.rpython.memory import lltypesimulation
@@ -109,7 +110,7 @@
         return
     init_gc_object_immortal = init_gc_object
 
-DEBUG_PRINT = True
+DEBUG_PRINT = False
 
 class MarkSweepGC(GCBase):
     _alloc_flavor_ = "raw"
@@ -162,17 +163,20 @@
             offset_to_length = self.varsize_offset_to_length(typeid)
             ref = self.malloc_varsize(typeid, length, size, itemsize,
                                       offset_to_length, True)
+            addr = llmemory.cast_ptr_to_adr(ref)
         else:
             ref = self.malloc_fixedsize(typeid, size, True)
+            addr = llmemory.cast_ptr_to_adr(ref)
+            raw_memclear(addr, size)
         # XXX lots of cast and reverse-cast around, but this malloc()
         # should eventually be killed
-        return llmemory.cast_ptr_to_adr(ref)
+        return addr
 
     def malloc_fixedsize(self, typeid, size, can_collect):
         if can_collect and self.bytes_malloced > self.bytes_malloced_threshold:
             self.collect()
         size_gc_header = self.gcheaderbuilder.size_gc_header
-        result = raw_malloc(size_gc_header + size)
+        result = raw_malloc(size_gc_header + size, clear=False)
         hdr = llmemory.cast_adr_to_ptr(result, self.HDRPTR)
         hdr.typeid = typeid << 1
         if not self.getfinalizer(typeid):

Modified: pypy/branch/pypy-malloc-nz/rpython/memory/gclltype.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gclltype.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/memory/gclltype.py	Tue Jun  6 20:37:46 2006
@@ -4,6 +4,7 @@
 from pypy.rpython.memory.lltypesimulation import malloc, functionptr, nullptr
 from pypy.rpython.memory.lltypesimulation import pyobjectptr
 from pypy.rpython.memory.lladdress import raw_malloc, raw_free, raw_memcopy
+from pypy.rpython.memory.lladdress import raw_memclear
 
 def raw_malloc_usage(sz):
     return sz

Modified: pypy/branch/pypy-malloc-nz/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/memory/gctransform.py	Tue Jun  6 20:37:46 2006
@@ -18,6 +18,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):
@@ -1194,6 +1195,10 @@
         ops, index = self.protect_roots(newop, livevars, block,
                                         block.operations.index(op))
         ops.append(SpaceOperation("cast_opaque_ptr", [v], op.result))
+        if not op.opname.endswith('_varsize'):
+            llops = LowLevelOpList(None)
+            gen_zero_gc_pointers(TYPE, op.result, llops)
+            ops.extend(llops)
         return ops
 
     replace_malloc_varsize = replace_malloc
@@ -1297,6 +1302,20 @@
         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/pypy-malloc-nz/rpython/memory/lladdress.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/lladdress.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/memory/lladdress.py	Tue Jun  6 20:37:46 2006
@@ -118,7 +118,7 @@
 
 simulator = MemorySimulator()
 
-def raw_malloc(size):
+def raw_malloc(size, clear=True):
     return _address(simulator.malloc(size))
 
 def raw_malloc_usage(size):
@@ -131,6 +131,9 @@
 def raw_memcopy(addr1, addr2, size):
     simulator.memcopy(addr1.intaddress, addr2.intaddress, size)
 
+def raw_memclear(addr, size):
+    simulator.memclear(addr.intaddress, size)
+
 def get_address_of_object(obj):
     return _address(simulator.get_address_of_object(obj))
 

Modified: pypy/branch/pypy-malloc-nz/rpython/memory/simulator.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/simulator.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/memory/simulator.py	Tue Jun  6 20:37:46 2006
@@ -58,6 +58,9 @@
         other.memory[offset2:offset2+size] = self.memory[offset1:offset1+size]
         other.status[offset2:offset2+size] = self.status[offset1:offset1+size]
 
+    def memclear(self, offset, size):
+        self.setbytes(offset, "\x00" * size)
+
 
 # block which stores functions and PyObects
 class ObjectBlock(object):

Modified: pypy/branch/pypy-malloc-nz/rpython/rbuiltin.py
==============================================================================
--- pypy/dist/pypy/rpython/rbuiltin.py	(original)
+++ pypy/branch/pypy-malloc-nz/rpython/rbuiltin.py	Tue Jun  6 20:37:46 2006
@@ -494,9 +494,18 @@
 from pypy.rpython.memory import lladdress
 from pypy.rpython.lltypesystem import llmemory
 
-def rtype_raw_malloc(hop):
-    v_size, = hop.inputargs(lltype.Signed)
-    return hop.genop('raw_malloc', [v_size], resulttype=llmemory.Address)
+def rtype_raw_malloc(hop, i_clear=None):
+    v_size = hop.inputarg(lltype.Signed, 0)
+    if i_clear is not None:
+        v_clear = hop.inputarg(lltype.Bool, i_clear)
+        assert isinstance(v_clear, Constant)
+        clear = v_clear.value
+    else:
+        clear = True
+    res = hop.genop('raw_malloc_nz', [v_size], resulttype=llmemory.Address)
+    if clear:
+        hop.genop('raw_memclear', [res, v_size])
+    return res
 
 def rtype_raw_malloc_usage(hop):
     v_size, = hop.inputargs(lltype.Signed)

Modified: pypy/branch/pypy-malloc-nz/translator/c/funcgen.py
==============================================================================
--- pypy/dist/pypy/translator/c/funcgen.py	(original)
+++ pypy/branch/pypy-malloc-nz/translator/c/funcgen.py	Tue Jun  6 20:37:46 2006
@@ -559,7 +559,7 @@
         if flavor == "raw": 
             return "OP_RAW_MALLOC(%s, %s);" % (esize, eresult) 
         elif flavor == "stack": 
-            return "OP_STACK_MALLOC(%s, %s);" % (esize, eresult) 
+            return "OP_STACK_MALLOC(%s, %s);" % (esize, eresult)
         else:
             raise NotImplementedError
 

Modified: pypy/branch/pypy-malloc-nz/translator/c/src/mem.h
==============================================================================
--- pypy/dist/pypy/translator/c/src/mem.h	(original)
+++ pypy/branch/pypy-malloc-nz/translator/c/src/mem.h	Tue Jun  6 20:37:46 2006
@@ -15,7 +15,8 @@
     if (r == NULL) FAIL_EXCEPTION(PyExc_MemoryError, "out of memory");\
  
 #define OP_RAW_FREE(x,r)        OP_FREE(x)
-#define OP_RAW_MEMCOPY(x,y,size,r) memcpy(y,x,size);
+#define OP_RAW_MEMCOPY(x,y,size,r) memcpy(y,x,size)
+#define OP_RAW_MEMCLEAR(x,size,r) memset(x,0,size)
 
 /************************************************************/
 
@@ -44,6 +45,13 @@
         COUNT_MALLOC;                                                   \
     }                                                                   \
   }
+#define OP_RAW_MALLOC_NZ(size, r)  {                                    \
+    r = (void*) PyObject_Malloc(size);                                  \
+    if (r == NULL) {FAIL_EXCEPTION(PyExc_MemoryError, "out of memory"); } \
+    else {                                                              \
+        COUNT_MALLOC;                                                   \
+    }                                                                   \
+  }
 
 #define OP_FREE(p)	{ PyObject_Free(p); COUNT_FREE; }
 



More information about the Pypy-commit mailing list