[pypy-svn] r68740 - in pypy/branch/gc-dump-heap/pypy/rpython: lltypesystem memory memory/gc memory/gctransform
fijal at codespeak.net
fijal at codespeak.net
Mon Oct 26 00:21:33 CET 2009
Author: fijal
Date: Mon Oct 26 00:21:32 2009
New Revision: 68740
Modified:
pypy/branch/gc-dump-heap/pypy/rpython/lltypesystem/opimpl.py
pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/base.py
pypy/branch/gc-dump-heap/pypy/rpython/memory/gctransform/framework.py
pypy/branch/gc-dump-heap/pypy/rpython/memory/gctypelayout.py
Log:
Hack differently. Since we have a couple of bits left, encode the member
num in infobits.
Modified: pypy/branch/gc-dump-heap/pypy/rpython/lltypesystem/opimpl.py
==============================================================================
--- pypy/branch/gc-dump-heap/pypy/rpython/lltypesystem/opimpl.py (original)
+++ pypy/branch/gc-dump-heap/pypy/rpython/lltypesystem/opimpl.py Mon Oct 26 00:21:32 2009
@@ -429,11 +429,6 @@
return lltype.cast_pointer(TYPE, member)
op_get_group_member.need_result_type = True
-def op_get_member_index(memberoffset):
- from pypy.rpython.lltypesystem import llgroup
- assert isinstance(memberoffset, llgroup.GroupMemberOffset)
- return memberoffset.index
-
def op_get_next_group_member(TYPE, grpptr, memberoffset, skipoffset):
from pypy.rpython.lltypesystem import llgroup
assert isinstance(memberoffset, llgroup.GroupMemberOffset)
Modified: pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/base.py
==============================================================================
--- pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/base.py (original)
+++ pypy/branch/gc-dump-heap/pypy/rpython/memory/gc/base.py Mon Oct 26 00:21:32 2009
@@ -52,7 +52,8 @@
varsize_offset_to_variable_part,
varsize_offset_to_length,
varsize_offsets_to_gcpointers_in_var_part,
- weakpointer_offset):
+ weakpointer_offset,
+ member_index):
self.getfinalizer = getfinalizer
self.is_varsize = is_varsize
self.has_gcptr_in_varsize = has_gcptr_in_varsize
@@ -64,6 +65,10 @@
self.varsize_offset_to_length = varsize_offset_to_length
self.varsize_offsets_to_gcpointers_in_var_part = varsize_offsets_to_gcpointers_in_var_part
self.weakpointer_offset = weakpointer_offset
+ self.member_index = member_index
+
+ def get_member_index(self, type_id):
+ return self.member_index(type_id)
def set_root_walker(self, root_walker):
self.root_walker = root_walker
Modified: pypy/branch/gc-dump-heap/pypy/rpython/memory/gctransform/framework.py
==============================================================================
--- pypy/branch/gc-dump-heap/pypy/rpython/memory/gctransform/framework.py (original)
+++ pypy/branch/gc-dump-heap/pypy/rpython/memory/gctransform/framework.py Mon Oct 26 00:21:32 2009
@@ -274,6 +274,10 @@
if hasattr(GCClass, 'dump_heap'):
self.dump_heap_ptr = getfn(GCClass.dump_heap.im_func,
[s_gc], annmodel.SomePtr(lltype.Ptr(ARRAY_TYPEID_MAP)))
+ self.get_member_index_ptr = getfn(
+ GCClass.get_member_index.im_func,
+ [s_gc, annmodel.SomeInteger(knowntype=rffi.r_ushort)],
+ annmodel.SomeInteger())
# in some GCs we can inline the common case of
# malloc_fixedsize(typeid, size, True, False, False)
@@ -514,7 +518,6 @@
newgcdependencies = []
newgcdependencies.append(ll_static_roots_inside)
ll_instance.inst_max_type_id = len(group.members)
-
self.write_typeid_list()
return newgcdependencies
@@ -649,6 +652,12 @@
hop.genop("direct_call", [self.dump_heap_ptr, self.c_const_gc],
resultvar=op.result)
+ def gct_get_member_index(self, hop):
+ op = hop.spaceop
+ v_typeid = op.args[0]
+ hop.genop("direct_call", [self.get_member_index_ptr, self.c_const_gc,
+ v_typeid], resultvar=op.result)
+
def gct_gc_adr_of_nursery_free(self, hop):
if getattr(self.gcdata.gc, 'nursery_free', None) is None:
raise NotImplementedError("gc_adr_of_nursery_free only for generational gcs")
Modified: pypy/branch/gc-dump-heap/pypy/rpython/memory/gctypelayout.py
==============================================================================
--- pypy/branch/gc-dump-heap/pypy/rpython/memory/gctypelayout.py (original)
+++ pypy/branch/gc-dump-heap/pypy/rpython/memory/gctypelayout.py Mon Oct 26 00:21:32 2009
@@ -92,6 +92,10 @@
return weakptr_offset
return -1
+ def q_member_index(self, typeid):
+ infobits = self.get(typeid).infobits
+ return infobits & T_MEMBER_INDEX
+
def set_query_functions(self, gc):
gc.set_query_functions(
self.q_is_varsize,
@@ -104,23 +108,26 @@
self.q_varsize_offset_to_variable_part,
self.q_varsize_offset_to_length,
self.q_varsize_offsets_to_gcpointers_in_var_part,
- self.q_weakpointer_offset)
+ self.q_weakpointer_offset,
+ self.q_member_index)
-T_IS_VARSIZE = 0x01
-T_HAS_GCPTR_IN_VARSIZE = 0x02
-T_IS_GCARRAY_OF_GCPTR = 0x04
-T_IS_WEAKREF = 0x08
+# the lowest 16bits are used to store group member index
+T_MEMBER_INDEX = 0xffff
+T_IS_VARSIZE = 0x10000
+T_HAS_GCPTR_IN_VARSIZE = 0x20000
+T_IS_GCARRAY_OF_GCPTR = 0x40000
+T_IS_WEAKREF = 0x80000
def _check_typeid(typeid):
ll_assert(llop.is_group_member_nonzero(lltype.Bool, typeid),
"invalid type_id")
-def encode_type_shape(builder, info, TYPE):
+def encode_type_shape(builder, info, TYPE, index):
"""Encode the shape of the TYPE into the TYPE_INFO structure 'info'."""
offsets = offsets_to_gc_pointers(TYPE)
- infobits = 0
+ infobits = index
info.ofstoptrs = builder.offsets2table(offsets, TYPE)
info.finalizer = builder.make_finalizer_funcptr_for_type(TYPE)
if not TYPE._is_varsize():
@@ -211,12 +218,12 @@
fullinfo = lltype.malloc(GCData.VARSIZE_TYPE_INFO,
immortal=True, zero=True)
info = fullinfo.header
+ type_id = self.type_info_group.add_member(fullinfo)
if self.can_encode_type_shape:
- encode_type_shape(self, info, TYPE)
+ encode_type_shape(self, info, TYPE, type_id.index)
else:
- self._pending_type_shapes.append((info, TYPE))
+ self._pending_type_shapes.append((info, TYPE, type_id.index))
# store it
- type_id = self.type_info_group.add_member(fullinfo)
self.id_of_type[TYPE] = type_id
# store the vtable of the type (if any) immediately thereafter
# (note that if gcconfig.removetypeptr is False, lltype2vtable
@@ -245,8 +252,8 @@
def encode_type_shapes_now(self):
if not self.can_encode_type_shape:
self.can_encode_type_shape = True
- for info, TYPE in self._pending_type_shapes:
- encode_type_shape(self, info, TYPE)
+ for info, TYPE, index in self._pending_type_shapes:
+ encode_type_shape(self, info, TYPE, index)
del self._pending_type_shapes
def delay_encoding(self):
More information about the Pypy-commit
mailing list