[pypy-svn] r27258 - in pypy/dist/pypy: rpython/lltypesystem rpython/memory rpython/memory/test translator/c
pedronis at codespeak.net
pedronis at codespeak.net
Mon May 15 23:58:27 CEST 2006
Author: pedronis
Date: Mon May 15 23:58:23 2006
New Revision: 27258
Modified:
pypy/dist/pypy/rpython/lltypesystem/llmemory.py
pypy/dist/pypy/rpython/lltypesystem/lltype.py
pypy/dist/pypy/rpython/memory/gc.py
pypy/dist/pypy/rpython/memory/gctransform.py
pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py
pypy/dist/pypy/translator/c/gc.py
Log:
test_transformed_gc for mark-and-sweep passes on top of llinterp without simulator even if the parameters introduce
collections!
attach gc header info to prebuilt constants to allow this.
fakeadr -+0
some fixes.
Modified: pypy/dist/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/llmemory.py Mon May 15 23:58:23 2006
@@ -203,10 +203,18 @@
try:
headerobj = _gc_struct2header[gcptr._obj]
except KeyError:
- headerobj = lltype.malloc(self.minimal_layout,
- immortal=True)._obj
+ # sanity checks
+ HDR = self.minimal_layout
+ gcobj = gcptr._obj
+ assert isinstance(gcobj._TYPE, lltype.GC_CONTAINER)
+ assert not gcobj._parentstructure()
+
+ headerobj = lltype.malloc(HDR, immortal=True)._obj
+ # make uninitialized access explode
+ for fldname in HDR._names:
+ getattr(type(headerobj), fldname).__set__(headerobj, None)
_gc_struct2header[gcptr._obj] = headerobj
- _gc_header2struct[headerobj] = gcptr._obj
+ _gc_header2struct[headerobj] = gcobj
p = lltype._ptr(lltype.Ptr(headerobj._TYPE), headerobj, True)
return _obref(p)
@@ -284,7 +292,7 @@
class fakeaddress(object):
def __init__(self, ob, offset=None):
- #assert not isinstance(ob, lltype._parentable) - XXX in-progress
+ assert not isinstance(ob, lltype._parentable)
self.ob = ob or None # replace null pointers with None
self.offset = offset
@@ -306,11 +314,15 @@
res = fakeaddress(self.ob, offset)
#res.ref() # sanity check
return res
+ if other == 0:
+ return self
return NotImplemented
def __sub__(self, other):
if isinstance(other, AddressOffset):
return self + (-other)
+ if other == 0:
+ return self
return NotImplemented
def __nonzero__(self):
Modified: pypy/dist/pypy/rpython/lltypesystem/lltype.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/lltype.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/lltype.py Mon May 15 23:58:23 2006
@@ -769,6 +769,15 @@
else:
return None, None
+def top_container(container):
+ top_parent = container
+ while True:
+ parent = top_parent._parentstructure()
+ if parent is None:
+ break
+ top_parent = parent
+ return top_parent
+
class _ptr(object):
__slots__ = ('_TYPE', '_T',
@@ -990,8 +999,7 @@
obj = self._obj
if isinstance(obj, int):
return obj # special case for cast_int_to_ptr() results
- while obj._parentstructure():
- obj = obj._parentstructure()
+ obj = top_container(obj)
result = id(obj)
# assume that id() returns an addressish value which is
# not zero and aligned to at least a multiple of 4
@@ -1406,12 +1414,8 @@
T = typeOf(p)
if not isinstance(T, Ptr) or not isinstance(T.TO, GcStruct):
raise TypeError, "runtime_type_info on non-GcStruct pointer: %s" % p
- top_parent = struct = p._obj
- while True:
- parent = top_parent._parentstructure()
- if parent is None:
- break
- top_parent = parent
+ struct = p._obj
+ top_parent = top_container(struct)
result = getRuntimeTypeInfo(top_parent._TYPE)
static_info = getRuntimeTypeInfo(T.TO)
query_funcptr = getattr(static_info._obj, 'query_funcptr', None)
Modified: pypy/dist/pypy/rpython/memory/gc.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gc.py (original)
+++ pypy/dist/pypy/rpython/memory/gc.py Mon May 15 23:58:23 2006
@@ -203,8 +203,8 @@
if self.is_varsize(typeid):
offset = self.varsize_offset_to_variable_part(
typeid)
- curr += offset
length = (curr + self.varsize_offset_to_length(typeid)).signed[0]
+ curr += offset
offsets = self.varsize_offsets_to_gcpointers_in_var_part(typeid)
itemlength = self.varsize_item_sizes(typeid)
i = 0
@@ -229,7 +229,7 @@
size = self.fixed_size(typeid)
if self.is_varsize(typeid):
length = (curr + MarkSweepGC._size_gc_header + self.varsize_offset_to_length(typeid)).signed[0]
- size += length * self.varsize_item_sizes(typeid)
+ size += self.varsize_item_sizes(typeid) * length
estimate = raw_malloc_usage(MarkSweepGC._size_gc_header + size)
if hdr.typeid & 1:
hdr.typeid = hdr.typeid & (~1)
Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py (original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py Mon May 15 23:58:23 2006
@@ -885,8 +885,8 @@
r_gc = self.translator.rtyper.getrepr(s_gc)
self.c_const_gc = rmodel.inputconst(r_gc, self.gcdata.gc)
- gc_header_offset = self.gcdata.gc.size_gc_header()
- HDR = self._gc_HDR = gc_header_offset.minimal_layout
+ self.gc_header_offset = self.gcdata.gc.size_gc_header()
+ HDR = self._gc_HDR = self.gc_header_offset.minimal_layout
self._gc_fields = fields = []
for fldname in HDR._names:
FLDTYPE = getattr(HDR, fldname)
@@ -986,13 +986,18 @@
return type_id
def consider_constant(self, TYPE, value):
- if id(value) not in self.seen_roots:
- self.seen_roots[id(value)] = True
+ if id(value) in self.seen_roots:
+ return
+ self.seen_roots[id(value)] = True
+ p = lltype._ptr(lltype.Ptr(TYPE), value)
+ adr = llmemory.cast_ptr_to_adr(p)
+
if isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)):
- self.get_type_id(TYPE)
+ typeid = self.get_type_id(TYPE)
+ if lltype.top_container(value) is value:
+ self.gcdata.gc.init_gc_object(adr-self.gc_header_offset, typeid)
+
if TYPE != lltype.PyObject and find_gc_ptrs_in_type(TYPE):
- p = lltype._ptr(lltype.Ptr(TYPE), value)
- adr = llmemory.cast_ptr_to_adr(p)
if isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)):
self.static_gc_roots.append(adr)
else:
@@ -1003,11 +1008,11 @@
return self._gc_fields
def gc_field_values_for(self, obj):
+ p = lltype._ptr(lltype.Ptr(lltype.typeOf(obj)), obj)
+ adr = llmemory.cast_ptr_to_adr(p)
HDR = self._gc_HDR
- p_hdr = lltype.malloc(HDR, immortal=True)
- hdr_adr = llmemory.cast_ptr_to_adr(p_hdr)
- vals = []
- self.gcdata.gc.init_gc_object(hdr_adr, self.get_type_id(lltype.typeOf(obj)))
+ p_hdr = llmemory.cast_adr_to_ptr(adr-self.gc_header_offset,
+ lltype.Ptr(HDR))
return [getattr(p_hdr, fldname) for fldname in HDR._names]
def offsets2table(self, offsets, TYPE):
Modified: pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py (original)
+++ pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py Mon May 15 23:58:23 2006
@@ -216,7 +216,7 @@
class gcpolicy(gc.FrameworkGcPolicy):
class transformerclass(gctransform.FrameworkGCTransformer):
- GC_PARAMS = {'start_heap_size': 15999 } # XXX 4096 -> collect boom
+ GC_PARAMS = {'start_heap_size': 4096 }
def test_llinterp_lists(self):
def malloc_a_lot():
Modified: pypy/dist/pypy/translator/c/gc.py
==============================================================================
--- pypy/dist/pypy/translator/c/gc.py (original)
+++ pypy/dist/pypy/translator/c/gc.py Mon May 15 23:58:23 2006
@@ -3,7 +3,7 @@
from pypy.translator.c.node import ContainerNode
from pypy.rpython.lltypesystem.lltype import \
typeOf, Ptr, PyObject, ContainerType, GcArray, GcStruct, \
- RuntimeTypeInfo, getRuntimeTypeInfo
+ RuntimeTypeInfo, getRuntimeTypeInfo, top_container
from pypy.rpython.memory import gctransform
from pypy.rpython.lltypesystem import lltype, llmemory
@@ -377,12 +377,7 @@
return defnode.db.gctransformer.gc_fields()
def common_gcheader_initdata(self, defnode):
- o = defnode.obj
- while True:
- n = o._parentstructure()
- if n is None:
- break
- o = n
+ o = top_container(defnode.obj)
return defnode.db.gctransformer.gc_field_values_for(o)
def zero_malloc(self, TYPE, esize, eresult):
More information about the Pypy-commit
mailing list