[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