[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