[pypy-svn] r27340 - in pypy/dist/pypy: annotation rpython rpython/lltypesystem rpython/lltypesystem/test rpython/memory translator/c translator/llvm

arigo at codespeak.net arigo at codespeak.net
Wed May 17 12:48:33 CEST 2006


Author: arigo
Date: Wed May 17 12:48:28 2006
New Revision: 27340

Added:
   pypy/dist/pypy/rpython/memory/gcheader.py   (contents, props changed)
Modified:
   pypy/dist/pypy/annotation/binaryop.py
   pypy/dist/pypy/annotation/bookkeeper.py
   pypy/dist/pypy/annotation/model.py
   pypy/dist/pypy/annotation/unaryop.py
   pypy/dist/pypy/rpython/lltypesystem/llmemory.py
   pypy/dist/pypy/rpython/lltypesystem/lltype.py
   pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
   pypy/dist/pypy/rpython/memory/gc.py
   pypy/dist/pypy/rpython/memory/gctransform.py
   pypy/dist/pypy/rpython/memory/lltypelayout.py
   pypy/dist/pypy/rpython/objectmodel.py
   pypy/dist/pypy/rpython/rbuiltin.py
   pypy/dist/pypy/rpython/rptr.py
   pypy/dist/pypy/translator/c/extfunc.py
   pypy/dist/pypy/translator/c/primitive.py
   pypy/dist/pypy/translator/llvm/extfunchelper.py
Log:
(arigo, some pedronis)

* added GCHeaderBuilder that contains the mappings between GcStructs
  and their GC headers.  In this way the mapping is not global but
  specific to the currently compiled GC.

* some fixes in the annotator to still propagate the constantness of
  Symbolics, without trying to constant-fold operations on them.

* general niceifications



Modified: pypy/dist/pypy/annotation/binaryop.py
==============================================================================
--- pypy/dist/pypy/annotation/binaryop.py	(original)
+++ pypy/dist/pypy/annotation/binaryop.py	Wed May 17 12:48:28 2006
@@ -60,7 +60,7 @@
                 result.knowntype = obj1.knowntype
             is_type_of1 = getattr(obj1, 'is_type_of', None)
             is_type_of2 = getattr(obj2, 'is_type_of', None)
-            if obj1.is_constant() and obj2.is_constant() and obj1.const == obj2.const:
+            if obj1.is_immutable_constant() and obj2.is_immutable_constant() and obj1.const == obj2.const:
                 result.const = obj1.const
                 is_type_of = {}
                 if is_type_of1:
@@ -269,7 +269,7 @@
     pow_ovf = _clone(pow, [ZeroDivisionError, OverflowError])
 
     def _compare_helper((int1, int2), opname, operation):
-        if int1.is_constant() and int2.is_constant():
+        if int1.is_immutable_constant() and int2.is_immutable_constant():
             r = immutablevalue(operation(int1.const, int2.const))
         else:
             r = SomeBool()
@@ -446,7 +446,7 @@
 class __extend__(pairtype(SomeTuple, SomeInteger)):
     
     def getitem((tup1, int2)):
-        if int2.is_constant():
+        if int2.is_immutable_constant():
             try:
                 return tup1.items[int2.const]
             except IndexError:
@@ -771,7 +771,7 @@
         pass
 
     def getitem((s_cto, s_index)):
-        if s_index.is_constant():
+        if s_index.is_immutable_constant():
             # check that the constant index is valid, just because we
             # are nice (users should really catch such errors by
             # testing their programs!)

Modified: pypy/dist/pypy/annotation/bookkeeper.py
==============================================================================
--- pypy/dist/pypy/annotation/bookkeeper.py	(original)
+++ pypy/dist/pypy/annotation/bookkeeper.py	Wed May 17 12:48:28 2006
@@ -307,7 +307,9 @@
             return SomeObject()
         tp = type(x)
         if issubclass(tp, Symbolic): # symbolic constants support
-            return x.annotation()
+            result = x.annotation()
+            result.const_box = Constant(x)
+            return result
         if tp is bool:
             result = SomeBool()
         elif tp is int:

Modified: pypy/dist/pypy/annotation/model.py
==============================================================================
--- pypy/dist/pypy/annotation/model.py	(original)
+++ pypy/dist/pypy/annotation/model.py	Wed May 17 12:48:28 2006
@@ -94,10 +94,21 @@
             TLS.no_side_effects_in_union -= 1
 
     def is_constant(self):
-        return hasattr(self, 'const')
+        d = self.__dict__
+        return 'const' in d or 'const_box' in d
 
     def is_immutable_constant(self):
-        return self.immutable and hasattr(self, 'const')
+        return self.immutable and 'const' in self.__dict__
+
+    # delegate accesses to 'const' to accesses to 'const_box.value',
+    # where const_box is a Constant.  XXX the idea is to eventually
+    # use systematically 'const_box' instead of 'const' for
+    # non-immutable constant annotations
+    class ConstAccessDelegator(object):
+        def __get__(self, obj, cls=None):
+            return obj.const_box.value
+    const = ConstAccessDelegator()
+    del ConstAccessDelegator
 
     # for debugging, record where each instance comes from
     # this is disabled if DEBUG is set to False

Modified: pypy/dist/pypy/annotation/unaryop.py
==============================================================================
--- pypy/dist/pypy/annotation/unaryop.py	(original)
+++ pypy/dist/pypy/annotation/unaryop.py	Wed May 17 12:48:28 2006
@@ -71,7 +71,7 @@
             return immutablevalue(bool(obj.const))
         else:
             s_len = obj.len()
-            if s_len.is_constant():
+            if s_len.is_immutable_constant():
                 return immutablevalue(s_len.const > 0)
             else:
                 return SomeBool()
@@ -188,7 +188,7 @@
     abs = neg
 
     def is_true(self):
-        if self.is_constant():
+        if self.is_immutable_constant():
             return getbookkeeper().immutablevalue(bool(self.const))
         return SomeBool()
 

Modified: pypy/dist/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/llmemory.py	Wed May 17 12:48:28 2006
@@ -167,46 +167,46 @@
 
 
 class GCHeaderOffset(AddressOffset):
-    def __init__(self, minimal_layout):
-        self.minimal_layout = minimal_layout
+    def __init__(self, gcheaderbuilder):
+        self.gcheaderbuilder = gcheaderbuilder
 
     def __repr__(self):
         return '< GCHeaderOffset >'
 
     def __neg__(self):
-        return GCHeaderAntiOffset(self.minimal_layout)
+        return GCHeaderAntiOffset(self.gcheaderbuilder)
 
     def ref(self, headerref):
         header = headerref.get()
-        gcobj = _gc_header2struct[header._obj]
-        return _obref(lltype._ptr(lltype.Ptr(gcobj._TYPE), gcobj))
+        gcptr = self.gcheaderbuilder.object_from_header(header)
+        return _obref(gcptr)
 
     def raw_malloc(self, rest):
         assert rest
         if isinstance(rest[0], GCHeaderAntiOffset):
             return rest[1].raw_malloc(rest[2:])    # just for fun
         gcobjadr = rest[0].raw_malloc(rest[1:])
-        return gcobjadr - self
+        headerptr = self.gcheaderbuilder.new_header(gcobjadr.get())
+        return cast_ptr_to_adr(headerptr)
 
 
 class GCHeaderAntiOffset(AddressOffset):
-    def __init__(self, minimal_layout):
-        self.minimal_layout = minimal_layout
+    def __init__(self, gcheaderbuilder):
+        self.gcheaderbuilder = gcheaderbuilder
 
     def __repr__(self):
         return '< GCHeaderAntiOffset >'
 
     def __neg__(self):
-        return GCHeaderOffset(self.minimal_layout)
+        return GCHeaderOffset(self.gcheaderbuilder)
 
     def ref(self, gcptrref):
         gcptr = gcptrref.get()
-        headerobj = getgcheaderobj(self.minimal_layout, gcptr._obj)
-        p = lltype._ptr(lltype.Ptr(headerobj._TYPE), headerobj, True)
-        return _obref(p)
+        headerptr = self.gcheaderbuilder.header_of_object(gcptr)
+        return _obref(headerptr)
 
     def raw_malloc(self, rest):
-        assert rest
+        assert len(rest) >= 2
         assert isinstance(rest[0], GCHeaderOffset)
         return rest[1].raw_malloc(rest[2:])
 
@@ -493,28 +493,6 @@
 
 # ____________________________________________________________
 
-_gc_struct2header = weakref.WeakKeyDictionary()
-_gc_header2struct = weakref.WeakKeyDictionary()
-
-def getgcheaderobj(HDR, gcobj):
-    # XXX! this doesn't work if we use different HDRs in different tests
-    # for the same constants
-    try:
-        headerobj = _gc_struct2header[gcobj]
-    except KeyError:
-        # sanity checks
-        assert isinstance(gcobj._TYPE, lltype.GC_CONTAINER)
-        assert not isinstance(gcobj._TYPE, lltype.GcOpaqueType)
-        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[gcobj] = headerobj
-        _gc_header2struct[headerobj] = gcobj
-    return headerobj
-
 def raw_malloc(size):
     if not isinstance(size, AddressOffset):
         raise NotImplementedError(size)

Modified: pypy/dist/pypy/rpython/lltypesystem/lltype.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/lltype.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/lltype.py	Wed May 17 12:48:28 2006
@@ -782,7 +782,7 @@
     # If p is a pointer, returns the same pointer casted to the largest
     # containing structure (for the cast where p points to the header part).
     # Also un-hides pointers to opaque.  Null pointers become None.
-    assert not isinstance(p, _parentable)  # pointer or primitive
+    assert not isinstance(p, _container)  # pointer or primitive
     T = typeOf(p)
     if not isinstance(T, Ptr):
         return p      # primitive
@@ -1054,9 +1054,25 @@
             # normal case
             return llmemory.fakeaddress(normalizeptr(self))
 
+    def _as_ptr(self):
+        return self
+    def _as_obj(self):
+        return self._obj
+
 assert not '__dict__' in dir(_ptr)
 
-class _parentable(object):
+class _container(object):
+    __slots__ = ()
+    def _parentstructure(self):
+        return None
+    def _check(self):
+        pass
+    def _as_ptr(self):
+        return _ptr(Ptr(self._TYPE), self, True)
+    def _as_obj(self):
+        return self
+
+class _parentable(_container):
     _kind = "?"
 
     __slots__ = ('_TYPE',
@@ -1315,19 +1331,13 @@
     _makeptr = staticmethod(_makeptr)
 
 
-class _func(object):
+class _func(_container):
     def __init__(self, TYPE, **attrs):
         self._TYPE = TYPE
         self._name = "?"
         self._callable = None
         self.__dict__.update(attrs)
 
-    def _parentstructure(self):
-        return None
-
-    def _check(self):
-        pass
-
     def __repr__(self):
         return '<%s>' % (self,)
 
@@ -1372,17 +1382,11 @@
         return "%s %s" % (self._TYPE.__name__, self._name)
 
 
-class _pyobject(Hashable):
+class _pyobject(Hashable, _container):
     __slots__ = []   # or we get in trouble with pickling
 
     _TYPE = PyObject
 
-    def _parentstructure(self):
-        return None
-
-    def _check(self):
-        pass
-
     def __repr__(self):
         return '<%s>' % (self,)
 

Modified: pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py	Wed May 17 12:48:28 2006
@@ -258,9 +258,10 @@
     py.test.raises(IndexError, "item_adr.signed[0]")
 
 def test_raw_malloc_gcstruct():
-    from pypy.rpython.memory import gc
+    from pypy.rpython.memory import gcheader
     HDR = lltype.Struct('header', ('a', lltype.Signed))
-    gchdr = gc.GCHeaderOffset(HDR)
+    builder = gcheader.GCHeaderBuilder(HDR)
+    gchdr = builder.size_gc_header
     S = lltype.GcStruct('S', ('x', lltype.Signed))
 
     def allocate():

Modified: pypy/dist/pypy/rpython/memory/gc.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gc.py	(original)
+++ pypy/dist/pypy/rpython/memory/gc.py	Wed May 17 12:48:28 2006
@@ -1,6 +1,7 @@
 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.support import get_address_linked_list
+from pypy.rpython.memory.gcheader import GCHeaderBuilder
 from pypy.rpython.memory import lltypesimulation
 from pypy.rpython.lltypesystem import lltype, llmemory
 from pypy.rpython.objectmodel import free_non_gc_object
@@ -9,11 +10,7 @@
 import sys
 
 int_size = lltypesimulation.sizeof(lltype.Signed)
-
-GCHeaderOffset = llmemory.GCHeaderOffset
-
-gc_header_two_ints = GCHeaderOffset(
-    lltype.Struct("header", ("a", lltype.Signed), ("b", lltype.Signed)))
+gc_header_two_ints = 2*int_size
 
 class GCError(Exception):
     pass
@@ -109,7 +106,6 @@
 
     HDR = lltype.Struct('header', ('typeid', lltype.Signed))
     HDRPTR = lltype.Ptr(HDR)
-    _size_gc_header = GCHeaderOffset(HDR)
 
     def __init__(self, AddressLinkedList, start_heap_size=4096, get_roots=None):
         self.heap_usage = 0          # at the end of the latest collection
@@ -122,6 +118,7 @@
         self.AddressLinkedList = AddressLinkedList
         #self.set_query_functions(None, None, None, None, None, None, None)
         self.get_roots = get_roots
+        self.gcheaderbuilder = GCHeaderBuilder(self.HDR)
 
     def setup(self):
         self.malloced_objects = self.AddressLinkedList()
@@ -142,7 +139,7 @@
     def malloc_fixedsize(self, typeid, size, can_collect):
         if can_collect and self.bytes_malloced > self.bytes_malloced_threshold:
             self.collect()
-        size_gc_header = MarkSweepGC._size_gc_header
+        size_gc_header = self.gcheaderbuilder.size_gc_header
         result = raw_malloc(size_gc_header + size)
         hdr = llmemory.cast_adr_to_ptr(result, self.HDRPTR)
         hdr.typeid = typeid << 1
@@ -161,7 +158,7 @@
             raise MemoryError
         # XXX also check for overflow on the various '+' below!
         size += varsize
-        size_gc_header = MarkSweepGC._size_gc_header
+        size_gc_header = self.gcheaderbuilder.size_gc_header
         result = raw_malloc(size_gc_header + size)
         (result + size_gc_header + offset_to_length).signed[0] = length
         hdr = llmemory.cast_adr_to_ptr(result, self.HDRPTR)
@@ -176,6 +173,7 @@
         os.write(2, 'collecting...\n')
         start_time = time.time()
         roots = self.get_roots()
+        size_gc_header = self.gcheaderbuilder.size_gc_header
         objects = self.AddressLinkedList()
         while 1:
             curr = roots.pop()
@@ -186,7 +184,7 @@
             objects.append(curr.address[0])
             # the last sweep did not clear the mark bit of static roots, 
             # since they are not in the malloced_objects list
-            gc_info = curr.address[0] - MarkSweepGC._size_gc_header
+            gc_info = curr.address[0] - size_gc_header
             hdr = llmemory.cast_adr_to_ptr(gc_info, self.HDRPTR)
             hdr.typeid = hdr.typeid & (~1)
         free_non_gc_object(roots)
@@ -198,7 +196,7 @@
 ##             print "object: ", curr
             if curr == NULL:
                 break
-            gc_info = curr - MarkSweepGC._size_gc_header
+            gc_info = curr - size_gc_header
             hdr = llmemory.cast_adr_to_ptr(gc_info, self.HDRPTR)
             if hdr.typeid & 1:
                 continue
@@ -237,9 +235,9 @@
             typeid = hdr.typeid >> 1
             size = self.fixed_size(typeid)
             if self.is_varsize(typeid):
-                length = (curr + MarkSweepGC._size_gc_header + self.varsize_offset_to_length(typeid)).signed[0]
+                length = (curr + size_gc_header + self.varsize_offset_to_length(typeid)).signed[0]
                 size += self.varsize_item_sizes(typeid) * length
-            estimate = raw_malloc_usage(MarkSweepGC._size_gc_header + size)
+            estimate = raw_malloc_usage(size_gc_header + size)
             if hdr.typeid & 1:
                 hdr.typeid = hdr.typeid & (~1)
                 newmo.append(curr)
@@ -274,7 +272,7 @@
         return self.heap_usage, self.bytes_malloced
 
     def size_gc_header(self, typeid=0):
-        return MarkSweepGC._size_gc_header
+        return self.gcheaderbuilder.size_gc_header
 
     def init_gc_object(self, addr, typeid):
         hdr = llmemory.cast_adr_to_ptr(addr, self.HDRPTR)

Added: pypy/dist/pypy/rpython/memory/gcheader.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/memory/gcheader.py	Wed May 17 12:48:28 2006
@@ -0,0 +1,35 @@
+import weakref
+from pypy.rpython.lltypesystem import lltype, llmemory
+
+
+class GCHeaderBuilder(object):
+
+    def __init__(self, HDR):
+        self.HDR = HDR
+        self.obj2header = weakref.WeakKeyDictionary()
+        self.header2obj = weakref.WeakKeyDictionary()
+        self.size_gc_header = llmemory.GCHeaderOffset(self)
+
+    def header_of_object(self, gcptr):
+        return self.obj2header[gcptr._as_obj()]
+
+    def object_from_header(self, headerptr):
+        return self.header2obj[headerptr._as_obj()]
+
+    def get_header(self, gcptr):
+        return self.obj2header.get(gcptr._as_obj(), None)
+
+    def new_header(self, gcptr):
+        gcobj = gcptr._as_obj()
+        assert gcobj not in self.obj2header
+        # sanity checks
+        assert isinstance(gcobj._TYPE, lltype.GC_CONTAINER)
+        assert not isinstance(gcobj._TYPE, lltype.GcOpaqueType)
+        assert not gcobj._parentstructure()
+        headerptr = lltype.malloc(self.HDR, immortal=True)
+        self.obj2header[gcobj] = headerptr
+        self.header2obj[headerptr._obj] = gcptr._as_ptr()
+        return headerptr
+
+    def _freeze_(self):
+        return True     # for reads of size_gc_header

Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py	Wed May 17 12:48:28 2006
@@ -14,6 +14,7 @@
 from pypy.annotation import model as annmodel
 from pypy.rpython import rmodel, rptr, annlowlevel, typesystem
 from pypy.rpython.memory import gc, lladdress
+from pypy.rpython.memory.gcheader import GCHeaderBuilder
 from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
 from pypy.rpython.extregistry import ExtRegistryEntry
 import sets, os
@@ -388,19 +389,21 @@
 
 class RefcountingGCTransformer(GCTransformer):
 
-    gc_header_offset = gc.GCHeaderOffset(lltype.Struct("header", ("refcount", lltype.Signed)))
+    HDR = lltype.Struct("header", ("refcount", lltype.Signed))
 
     def __init__(self, translator):
         super(RefcountingGCTransformer, self).__init__(translator)
+        self.gcheaderbuilder = GCHeaderBuilder(self.HDR)
+        gc_header_offset = self.gcheaderbuilder.size_gc_header
         self.deallocator_graphs_needing_transforming = []
         # create incref graph
         def ll_incref(adr):
             if adr:
-                gcheader = adr - RefcountingGCTransformer.gc_header_offset
+                gcheader = adr - gc_header_offset
                 gcheader.signed[0] = gcheader.signed[0] + 1
         def ll_decref(adr, dealloc):
             if adr:
-                gcheader = adr - RefcountingGCTransformer.gc_header_offset
+                gcheader = adr - gc_header_offset
                 refcount = gcheader.signed[0] - 1
                 gcheader.signed[0] = refcount
                 if refcount == 0:
@@ -490,6 +493,13 @@
     def finish(self):
         super(RefcountingGCTransformer, self).finish()
 
+##    -- maybe add this for tests and for consistency --
+##    def consider_constant(self, TYPE, value):
+##        p = value._as_ptr()
+##        if not self.gcheaderbuilder.get_header(p):
+##            hdr = new_header(p)
+##            hdr.refcount = sys.maxint // 2
+
     def static_deallocation_funcptr_for_type(self, TYPE):
         if TYPE in self.static_deallocator_funcptrs:
             return self.static_deallocator_funcptrs[TYPE]
@@ -543,7 +553,7 @@
              'llop': llop,
              'lltype': lltype,
              'destrptr': destrptr,
-             'gc_header_offset': RefcountingGCTransformer.gc_header_offset,
+             'gc_header_offset': self.gcheaderbuilder.size_gc_header,
              'cast_adr_to_ptr': llmemory.cast_adr_to_ptr,
              'cast_pointer': lltype.cast_pointer,
              'PTR_TYPE': lltype.Ptr(TYPE),
@@ -577,9 +587,10 @@
         
         RTTI_PTR = lltype.Ptr(lltype.RuntimeTypeInfo)
         QUERY_ARG_TYPE = lltype.typeOf(queryptr).TO.ARGS[0]
+        gc_header_offset = self.gcheaderbuilder.size_gc_header
         def ll_dealloc(addr):
             # bump refcount to 1
-            gcheader = addr - RefcountingGCTransformer.gc_header_offset
+            gcheader = addr - gc_header_offset
             gcheader.signed[0] = 1
             v = llmemory.cast_adr_to_ptr(addr, QUERY_ARG_TYPE)
             rtti = queryptr(v)
@@ -631,8 +642,6 @@
 
 
 class BoehmGCTransformer(GCTransformer):
-    gc_header_offset = gc.GCHeaderOffset(lltype.Void)
-
     def __init__(self, translator, inline=False):
         super(BoehmGCTransformer, self).__init__(translator, inline=inline)
         self.finalizer_funcptrs = {}
@@ -908,8 +917,7 @@
         r_gc = self.translator.rtyper.getrepr(s_gc)
         self.c_const_gc = rmodel.inputconst(r_gc, self.gcdata.gc)
 
-        self.gc_header_offset = self.gcdata.gc.size_gc_header()
-        HDR = self._gc_HDR = self.gc_header_offset.minimal_layout
+        HDR = self._gc_HDR = self.gcdata.gc.gcheaderbuilder.HDR
         self._gc_fields = fields = []
         for fldname in HDR._names:
             FLDTYPE = getattr(HDR, fldname)
@@ -1012,15 +1020,17 @@
         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)):
             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)
+                hdrbuilder = self.gcdata.gc.gcheaderbuilder
+                hdr = hdrbuilder.new_header(value)
+                adr = llmemory.cast_ptr_to_adr(hdr)
+                self.gcdata.gc.init_gc_object(adr, typeid)
 
         if TYPE != lltype.PyObject and find_gc_ptrs_in_type(TYPE):
+            adr = llmemory.cast_ptr_to_adr(value._as_ptr())
             if isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)):
                 self.static_gc_roots.append(adr)
             else: 
@@ -1031,12 +1041,9 @@
         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.gcdata.gc.gcheaderbuilder.header_of_object(obj)
         HDR = self._gc_HDR
-        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]
+        return [getattr(hdr, fldname) for fldname in HDR._names]
 
     def offsets2table(self, offsets, TYPE):
         try:

Modified: pypy/dist/pypy/rpython/memory/lltypelayout.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/lltypelayout.py	(original)
+++ pypy/dist/pypy/rpython/memory/lltypelayout.py	Wed May 17 12:48:28 2006
@@ -90,7 +90,6 @@
         return fixedsize + i * varsize
 
 def convert_offset_to_int(offset):
-    from pypy.rpython.memory.gc import GCHeaderOffset
     if isinstance(offset, llmemory.FieldOffset):
         layout = get_layout(offset.TYPE)
         return layout[offset.fldname]
@@ -102,8 +101,8 @@
         return sizeof(offset.TYPE) * offset.repeat
     elif isinstance(offset, llmemory.ArrayItemsOffset):
         return get_fixed_size(lltype.Signed)
-    elif isinstance(offset, GCHeaderOffset):
-        return sizeof(offset.minimal_layout)
+    elif isinstance(offset, llmemory.GCHeaderOffset):
+        return sizeof(offset.gcheaderbuilder.HDR)
     else:
         raise Exception("unknown offset type %r"%offset)
         

Modified: pypy/dist/pypy/rpython/objectmodel.py
==============================================================================
--- pypy/dist/pypy/rpython/objectmodel.py	(original)
+++ pypy/dist/pypy/rpython/objectmodel.py	Wed May 17 12:48:28 2006
@@ -14,7 +14,10 @@
         return None
 
     def __cmp__(self, other):
-        raise TypeError("Symbolics can not be compared!")
+        if self is other:
+            return 0
+        else:
+            raise TypeError("Symbolics can not be compared!")
 
     def __hash__(self):
         raise TypeError("Symbolics are not hashable!")

Modified: pypy/dist/pypy/rpython/rbuiltin.py
==============================================================================
--- pypy/dist/pypy/rpython/rbuiltin.py	(original)
+++ pypy/dist/pypy/rpython/rbuiltin.py	Wed May 17 12:48:28 2006
@@ -427,7 +427,7 @@
     assert isinstance(hop.args_r[0], rptr.PtrRepr)
     vlist = hop.inputargs(hop.args_r[0])
     return hop.genop('runtime_type_info', vlist,
-                 resulttype = rptr.PtrRepr(lltype.Ptr(lltype.RuntimeTypeInfo)))
+                     resulttype = hop.r_result.lowleveltype)
 
 BUILTIN_TYPER[lltype.malloc] = rtype_malloc
 BUILTIN_TYPER[lltype.free] = rtype_free

Modified: pypy/dist/pypy/rpython/rptr.py
==============================================================================
--- pypy/dist/pypy/rpython/rptr.py	(original)
+++ pypy/dist/pypy/rpython/rptr.py	Wed May 17 12:48:28 2006
@@ -149,16 +149,16 @@
 class LLADTMethRepr(Repr):
 
     def __init__(self, adtmeth):
-        self.adtmeth = adtmeth
+        self.func = adtmeth.func
         self.lowleveltype = adtmeth.ll_ptrtype
 
     def rtype_simple_call(self, hop):
         hop2 = hop.copy()
-        func = self.adtmeth.func
+        func = self.func
         s_func = hop.rtyper.annotator.bookkeeper.immutablevalue(func)
         v_ptr = hop2.args_v[0]
         hop2.r_s_popfirstarg()
-        hop2.v_s_insertfirstarg(v_ptr, annmodel.SomePtr(self.adtmeth.ll_ptrtype))
+        hop2.v_s_insertfirstarg(v_ptr, annmodel.SomePtr(self.lowleveltype))
         hop2.v_s_insertfirstarg(flowmodel.Constant(func), s_func)
         return hop2.dispatch()
 

Modified: pypy/dist/pypy/translator/c/extfunc.py
==============================================================================
--- pypy/dist/pypy/translator/c/extfunc.py	(original)
+++ pypy/dist/pypy/translator/c/extfunc.py	Wed May 17 12:48:28 2006
@@ -159,7 +159,7 @@
         if modname not in modules:
             modules[modname] = True
             yield 'LL_NEED_%s' % modname.upper(), 1
-        funcptr = lltype._ptr(lltype.Ptr(lltype.typeOf(funcobj)), funcobj) # hum
+        funcptr = funcobj._as_ptr()
         yield c_name, funcptr
 
 def predeclare_exception_data(db, rtyper, optimize=True):

Modified: pypy/dist/pypy/translator/c/primitive.py
==============================================================================
--- pypy/dist/pypy/translator/c/primitive.py	(original)
+++ pypy/dist/pypy/translator/c/primitive.py	Wed May 17 12:48:28 2006
@@ -3,8 +3,8 @@
 from pypy.rpython.lltypesystem.lltype import *
 from pypy.rpython.lltypesystem.llmemory import Address, fakeaddress, \
      AddressOffset, ItemOffset, ArrayItemsOffset, FieldOffset, \
-     CompositeOffset, ArrayLengthOffset, WeakGcAddress, fakeweakaddress
-from pypy.rpython.memory.gc import GCHeaderOffset
+     CompositeOffset, ArrayLengthOffset, WeakGcAddress, fakeweakaddress, \
+     GCHeaderOffset
 from pypy.rpython.memory.lladdress import NULL
 from pypy.translator.c.support import cdecl
 

Modified: pypy/dist/pypy/translator/llvm/extfunchelper.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/extfunchelper.py	(original)
+++ pypy/dist/pypy/translator/llvm/extfunchelper.py	Wed May 17 12:48:28 2006
@@ -182,7 +182,7 @@
         if modname not in modules:
             modules[modname] = True
             yield 'LL_NEED_%s' % modname.upper(), 1
-        funcptr = lltype._ptr(lltype.Ptr(lltype.typeOf(funcobj)), funcobj) # hum
+        funcptr = funcobj._as_ptr()
         yield c_name, funcptr
 
 def predeclare_exception_data(db, rtyper, optimize=True):



More information about the Pypy-commit mailing list