[pypy-svn] r53630 - in pypy/branch/io-improvements/pypy/rpython/memory: gc gctransform test

fijal at codespeak.net fijal at codespeak.net
Wed Apr 9 21:54:29 CEST 2008


Author: fijal
Date: Wed Apr  9 21:54:27 2008
New Revision: 53630

Modified:
   pypy/branch/io-improvements/pypy/rpython/memory/gc/marksweep.py
   pypy/branch/io-improvements/pypy/rpython/memory/gc/semispace.py
   pypy/branch/io-improvements/pypy/rpython/memory/gctransform/framework.py
   pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py
Log:
gc_can_move operation in gc transform


Modified: pypy/branch/io-improvements/pypy/rpython/memory/gc/marksweep.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/gc/marksweep.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/gc/marksweep.py	Wed Apr  9 21:54:27 2008
@@ -38,7 +38,6 @@
     POOLNODEPTR = lltype.Ptr(POOLNODE)
     POOLNODE.become(lltype.Struct('gc_pool_node', ('linkedlist', HDRPTR),
                                                   ('nextnode', POOLNODEPTR)))
-
     def __init__(self, chunk_size=DEFAULT_CHUNK_SIZE, start_heap_size=4096):
         self.heap_usage = 0          # at the end of the latest collection
         self.bytes_malloced = 0      # since the latest collection
@@ -693,6 +692,8 @@
         # reinstall the pool that was current at the beginning of x_clone()
         clonedata.pool = self.x_swap_pool(curpool)
 
+    def can_move(self, addr):
+        return False
 
 class PrintingMarkSweepGC(MarkSweepGC):
     _alloc_flavor_ = "raw"

Modified: pypy/branch/io-improvements/pypy/rpython/memory/gc/semispace.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/gc/semispace.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/gc/semispace.py	Wed Apr  9 21:54:27 2008
@@ -537,5 +537,8 @@
         finally:
             self.finalizer_lock_count -= 1
 
+    def can_move(self, addr):
+        return True
+
     STATISTICS_NUMBERS = 0
 

Modified: pypy/branch/io-improvements/pypy/rpython/memory/gctransform/framework.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/gctransform/framework.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/gctransform/framework.py	Wed Apr  9 21:54:27 2008
@@ -221,6 +221,9 @@
             [s_gc], annmodel.s_None)
         self.enable_finalizers_ptr = getfn(GCClass.enable_finalizers.im_func,
             [s_gc], annmodel.s_None)
+        self.can_move_ptr = getfn(GCClass.can_move.im_func,
+                                  [s_gc, annmodel.SomeAddress()],
+                                  annmodel.SomeBool())
 
         # in some GCs we can inline the common case of
         # malloc_fixedsize(typeid, size, True, False, False)
@@ -530,6 +533,13 @@
                   resultvar=op.result)
         self.pop_roots(hop, livevars)
 
+    def gct_gc_can_move(self, hop):
+        op = hop.spaceop
+        v_addr = hop.genop('cast_ptr_to_adr',
+                           [op.args[0]], resulttype=llmemory.Address)
+        hop.genop("direct_call", [self.can_move_ptr, self.c_const_gc, v_addr],
+                  resultvar=op.result)
+
     def gct_gc__disable_finalizers(self, hop):
         # cannot collect()
         op = hop.spaceop

Modified: pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py	Wed Apr  9 21:54:27 2008
@@ -37,6 +37,7 @@
 class GCTest(object):
     gcpolicy = None
     stacklessgc = False
+    GC_CAN_MOVE = False
 
     def runner(self, f, nbargs=0, statistics=False, transformer=False,
                **extraconfigopts):
@@ -447,8 +448,18 @@
         res = run([])
         assert res == 0
 
+    def test_can_move(self):
+        TP = lltype.GcArray(lltype.Float)
+        def func():
+            from pypy.rlib import rgc
+            return rgc.can_move(lltype.malloc(TP, 1))
+        run = self.runner(func)
+        res = run([])
+        assert res == self.GC_CAN_MOVE
 
 class GenericMovingGCTests(GenericGCTests):
+    GC_CAN_MOVE = True
+    
     def test_many_ids(self):
         py.test.skip("fails for bad reasons in lltype.py :-(")
         class A(object):
@@ -477,7 +488,6 @@
         run = self.runner(f)
         run([])
 
-
 class TestMarkSweepGC(GenericGCTests):
     gcname = "marksweep"
     class gcpolicy(gc.FrameworkGcPolicy):



More information about the Pypy-commit mailing list