[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