[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