[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