[pypy-svn] r76771 - in pypy/branch/markcompact/pypy/rpython: lltypesystem memory/gc
arigo at codespeak.net
arigo at codespeak.net
Sat Aug 28 19:19:13 CEST 2010
Author: arigo
Date: Sat Aug 28 19:19:12 2010
New Revision: 76771
Modified:
pypy/branch/markcompact/pypy/rpython/lltypesystem/llmemory.py
pypy/branch/markcompact/pypy/rpython/memory/gc/markcompact.py
Log:
Fixes.
Modified: pypy/branch/markcompact/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/branch/markcompact/pypy/rpython/lltypesystem/llmemory.py (original)
+++ pypy/branch/markcompact/pypy/rpython/lltypesystem/llmemory.py Sat Aug 28 19:19:12 2010
@@ -361,19 +361,27 @@
# ____________________________________________________________
+def _sizeof_none(TYPE):
+ assert not TYPE._is_varsize()
+ return ItemOffset(TYPE)
+_sizeof_none._annspecialcase_ = 'specialize:memo'
+
+def _sizeof_int(TYPE, n):
+ "NOT_RPYTHON"
+ if isinstance(TYPE, lltype.Struct):
+ return FieldOffset(TYPE, TYPE._arrayfld) + \
+ itemoffsetof(TYPE._flds[TYPE._arrayfld], n)
+ else:
+ raise Exception("don't know how to take the size of a %r"%TYPE)
+
def sizeof(TYPE, n=None):
if n is None:
- assert not TYPE._is_varsize()
- return ItemOffset(TYPE)
+ return _sizeof_none(TYPE)
+ elif isinstance(TYPE, lltype.Array):
+ return itemoffsetof(TYPE) + _sizeof_none(TYPE.OF) * n
else:
- if isinstance(TYPE, lltype.Array):
- return itemoffsetof(TYPE, n)
- elif isinstance(TYPE, lltype.Struct):
- return FieldOffset(TYPE, TYPE._arrayfld) + \
- itemoffsetof(TYPE._flds[TYPE._arrayfld], n)
- else:
- raise Exception("don't know how to take the size of a %r"%TYPE)
-sizeof._annspecialcase_ = 'specialize:memo' # only for n == None
+ return _sizeof_int(TYPE, n)
+sizeof._annspecialcase_ = 'specialize:arg(0)'
def offsetof(TYPE, fldname):
assert fldname in TYPE._flds
Modified: pypy/branch/markcompact/pypy/rpython/memory/gc/markcompact.py
==============================================================================
--- pypy/branch/markcompact/pypy/rpython/memory/gc/markcompact.py (original)
+++ pypy/branch/markcompact/pypy/rpython/memory/gc/markcompact.py Sat Aug 28 19:19:12 2010
@@ -8,7 +8,7 @@
from pypy.rpython.lltypesystem.llmemory import NULL, raw_malloc_usage
from pypy.rlib.rarithmetic import ovfcheck, LONG_BIT, intmask
from pypy.rpython.lltypesystem.lloperation import llop
-from pypy.rlib.objectmodel import we_are_translated
+from pypy.rlib.objectmodel import we_are_translated, running_on_llinterp
from pypy.rpython.lltypesystem import rffi
from pypy.rpython.memory.gcheader import GCHeaderBuilder
@@ -60,6 +60,9 @@
BYTES_PER_TID = rffi.sizeof(TID_TYPE)
TID_BACKUP = rffi.CArray(TID_TYPE)
+def translated_to_c():
+ return we_are_translated() and not running_on_llinterp
+
class MarkCompactGC(MovingGCBase):
HDR = lltype.Struct('header', ('tid', lltype.Signed))
@@ -232,9 +235,7 @@
toaddr = llarena.arena_new_view(self.space)
maxnum = self.space_size - (self.free - self.space)
maxnum /= BYTES_PER_TID
- llarena.arena_reserve(self.free,
- llmemory.itemoffsetof(TID_BACKUP) +
- llmemory.sizeof(TID_BACKUP.OF) * maxnum)
+ llarena.arena_reserve(self.free, llmemory.sizeof(TID_BACKUP, maxnum))
self.tid_backup = llmemory.cast_adr_to_ptr(self.free,
lltype.Ptr(TID_BACKUP))
#
@@ -251,13 +252,13 @@
#
self.tid_backup = lltype.nullptr(TID_BACKUP)
self.free = finaladdr
- remaining_size = (toaddr + self.space_size) - finaladdr
- llarena.arena_reset(finaladdr, remaining_size, False)
self.next_collect_after = self.next_collection(finaladdr - toaddr,
self.num_alive_objs,
requested_size)
#
- if not we_are_translated():
+ if not translated_to_c():
+ remaining_size = (toaddr + self.space_size) - finaladdr
+ llarena.arena_reset(finaladdr, remaining_size, False)
llarena.arena_free(self.space)
self.space = toaddr
#
@@ -381,7 +382,7 @@
return MovingGCBase.header(self, obj).tid & GCFLAG_MARKBIT
def toaddr_smaller_than_fromaddr(self, toaddr, fromaddr):
- if we_are_translated():
+ if translated_to_c():
return toaddr < fromaddr
else:
# convert the addresses to integers, because they are
@@ -415,7 +416,7 @@
if self.toaddr_smaller_than_fromaddr(toaddr, fromaddr):
totaldstsize += llmemory.sizeof(lltype.Signed)
#
- if not we_are_translated():
+ if not translated_to_c():
llarena.arena_reserve(toaddr, basesize)
if (raw_malloc_usage(totaldstsize) >
raw_malloc_usage(basesize)):
@@ -438,7 +439,7 @@
toaddr += totaldstsize
#
fromaddr += totalsrcsize
- if not we_are_translated():
+ if not translated_to_c():
assert toaddr - base_forwarding_addr <= fromaddr - self.space
self.num_alive_objs = num
@@ -582,8 +583,7 @@
hdr.tid = self.combine(typeid, gcflags << first_gcflag_bit)
#
fromaddr = obj - self.gcheaderbuilder.size_gc_header
- llarena.arena_reserve(toaddr, basesize)
- if we_are_translated():
+ if translated_to_c():
llmemory.raw_memmove(fromaddr, toaddr, basesize)
else:
llmemory.raw_memcopy(fromaddr, toaddr, basesize)
@@ -637,7 +637,7 @@
return self.get_identityhash_from_addr(obj)
def get_identityhash_from_addr(self, obj):
- if we_are_translated():
+ if translated_to_c():
return llmemory.cast_adr_to_int(obj) # direct case
else:
try:
More information about the Pypy-commit
mailing list