[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