[pypy-svn] r24559 - in pypy/dist/pypy: rpython/memory translator/c

cfbolz at codespeak.net cfbolz at codespeak.net
Sun Mar 19 22:54:39 CET 2006


Author: cfbolz
Date: Sun Mar 19 22:54:38 2006
New Revision: 24559

Modified:
   pypy/dist/pypy/rpython/memory/gc.py
   pypy/dist/pypy/translator/c/gc.py
Log:
reduce the size of the gc header for mark and sweep by one word


Modified: pypy/dist/pypy/rpython/memory/gc.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gc.py	(original)
+++ pypy/dist/pypy/rpython/memory/gc.py	Sun Mar 19 22:54:38 2006
@@ -23,6 +23,9 @@
 gc_header_two_ints = GCHeaderOffset(
     lltype.Struct("header", ("a", lltype.Signed), ("b", lltype.Signed)))
 
+gc_header_one_int = GCHeaderOffset(
+    lltype.Struct("header", ("a", lltype.Signed)))
+
 class GCError(Exception):
     pass
 
@@ -110,7 +113,7 @@
 class MarkSweepGC(GCBase):
     _alloc_flavor_ = "raw"
     
-    _size_gc_header = gc_header_two_ints
+    _size_gc_header = gc_header_one_int
 
     def __init__(self, start_heap_size=4096, get_roots=None):
         self.bytes_malloced = 0
@@ -136,8 +139,7 @@
             self.collect()
         size_gc_header = MarkSweepGC._size_gc_header
         result = raw_malloc(size + size_gc_header)
-        result.signed[0] = 0
-        result.signed[1] = typeid
+        result.signed[0] = typeid << 1
         self.malloced_objects.append(result)
         self.bytes_malloced += size + size_gc_header
         return result + size_gc_header
@@ -153,8 +155,7 @@
         size_gc_header = MarkSweepGC._size_gc_header
         result = raw_malloc(size + size_gc_header)
         (result + offset_to_length + size_gc_header).signed[0] = length
-        result.signed[0] = 0
-        result.signed[1] = typeid
+        result.signed[0] = typeid << 1
         self.malloced_objects.append(result)
         self.bytes_malloced += size + size_gc_header
         return result + size_gc_header
@@ -174,7 +175,7 @@
             gc_info = curr.address[0] - MarkSweepGC._size_gc_header
             # constants roots are not malloced and thus don't have their mark
             # bit reset
-            gc_info.signed[0] = 0
+            gc_info.signed[0] = gc_info.signed[0] & (~1)
         free_non_gc_object(roots)
         while 1:  #mark
             curr = objects.pop()
@@ -182,9 +183,9 @@
             if curr == NULL:
                 break
             gc_info = curr - MarkSweepGC._size_gc_header
-            if gc_info.signed[0] == 1:
+            if gc_info.signed[0] & 1:
                 continue
-            typeid = gc_info.signed[1]
+            typeid = gc_info.signed[0] >> 1
             offsets = self.offsets_to_gc_pointers(typeid)
             i = 0
             while i < len(offsets):
@@ -206,7 +207,7 @@
                         objects.append((item + offsets[j]).address[0])
                         j += 1
                     i += 1
-            gc_info.signed[0] = 1
+            gc_info.signed[0] = gc_info.signed[0] | 1
         free_non_gc_object(objects)
         newmo = AddressLinkedList()
         curr_heap_size = 0
@@ -215,13 +216,13 @@
             curr = self.malloced_objects.pop()
             if curr == NULL:
                 break
-            typeid = curr.signed[1]
+            typeid = curr.signed[0] >> 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]
                 size += length * self.varsize_item_sizes(typeid)
-            if curr.signed[0] == 1:
-                curr.signed[0] = 0
+            if curr.signed[0] & 1:
+                curr.signed[0] = curr.signed[0] & (~1)
                 newmo.append(curr)
                 curr_heap_size += size + MarkSweepGC._size_gc_header
             else:
@@ -237,8 +238,7 @@
         return MarkSweepGC._size_gc_header
 
     def init_gc_object(self, addr, typeid):
-        addr.signed[0] = 0
-        addr.signed[1] = typeid
+        addr.signed[0] = typeid << 1
     init_gc_object_immortal = init_gc_object
 
 class SemiSpaceGC(GCBase):

Modified: pypy/dist/pypy/translator/c/gc.py
==============================================================================
--- pypy/dist/pypy/translator/c/gc.py	(original)
+++ pypy/dist/pypy/translator/c/gc.py	Sun Mar 19 22:54:38 2006
@@ -288,14 +288,15 @@
         return '%s = %s; /* for moving GCs */' % (args[1], args[0])
 
     def common_gcheader_definition(self, defnode):
-        return [('flags', lltype.Signed), ('typeid', lltype.Signed)]
+        # XXX assumes mark and sweep
+        return [('typeid', lltype.Signed)]
 
     def common_gcheader_initdata(self, defnode):
-        # this more or less assumes mark-and-sweep gc
+        # XXX this more or less assumes mark-and-sweep gc
         o = defnode.obj
         while True:
             n = o._parentstructure()
             if n is None:
                 break
             o = n
-        return [0, defnode.db.gctransformer.id_of_type[typeOf(o)]]
+        return [defnode.db.gctransformer.id_of_type[typeOf(o)] << 1]



More information about the Pypy-commit mailing list