[pypy-svn] r54656 - in pypy/branch/hybrid-io/pypy/rpython/memory: gc gctransform test

fijal at codespeak.net fijal at codespeak.net
Sun May 11 20:32:01 CEST 2008


Author: fijal
Date: Sun May 11 20:32:00 2008
New Revision: 54656

Modified:
   pypy/branch/hybrid-io/pypy/rpython/memory/gc/hybrid.py
   pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/framework.py
   pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/transform.py
   pypy/branch/hybrid-io/pypy/rpython/memory/test/test_transformed_gc.py
Log:
Implement basic version of malloc_nonmovable for hybrid gc


Modified: pypy/branch/hybrid-io/pypy/rpython/memory/gc/hybrid.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/memory/gc/hybrid.py	(original)
+++ pypy/branch/hybrid-io/pypy/rpython/memory/gc/hybrid.py	Sun May 11 20:32:00 2008
@@ -200,6 +200,9 @@
     malloc_varsize_slowpath._dont_inline_ = True
     malloc_varsize_slowpath._annspecialcase_ = 'specialize:arg(3)'
 
+    def malloc_varsize_nonmovable(self, typeid, length):
+        return self.malloc_varsize_slowpath(typeid, length, True)
+
     def malloc_nonmovable(self, typeid, length, zero):
         # helper for testing, same as GCBase.malloc
         if self.is_varsize(typeid):

Modified: pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/framework.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/framework.py	(original)
+++ pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/framework.py	Sun May 11 20:32:00 2008
@@ -273,6 +273,17 @@
         else:
             self.malloc_varsize_clear_fast_ptr = None
 
+        if getattr(GCClass, 'malloc_varsize_nonmovable', False):
+            malloc_nonmovable = func_with_new_name(
+                GCClass.malloc_varsize_nonmovable.im_func,
+                "malloc_varsize_nonmovable")
+            self.malloc_varsize_nonmovable_ptr = getfn(
+                malloc_nonmovable,
+                [s_gc, annmodel.SomeInteger(nonneg=True),
+                 annmodel.SomeInteger(nonneg=True)], s_gcref)
+        else:
+            self.malloc_varsize_nonmovable_ptr = None
+
         if GCClass.moving_gc:
             self.id_ptr = getfn(GCClass.id.im_func,
                                 [s_gc, s_gcref], annmodel.SomeInteger(),
@@ -456,14 +467,22 @@
             v_length = op.args[-1]
             c_ofstolength = rmodel.inputconst(lltype.Signed, info.ofstolength)
             c_varitemsize = rmodel.inputconst(lltype.Signed, info.varitemsize)
-            if (self.malloc_varsize_clear_fast_ptr is not None and
-                c_can_collect.value and not c_has_finalizer.value):
-                malloc_ptr = self.malloc_varsize_clear_fast_ptr
+            if flags.get('nonmovable') and self.malloc_varsize_nonmovable_ptr:
+                # we don't have tests for such cases, let's fail
+                # explicitely
+                assert c_can_collect.value
+                assert not c_has_finalizer.value
+                malloc_ptr = self.malloc_varsize_nonmovable_ptr
+                args = [self.c_const_gc, c_type_id, v_length]
             else:
-                malloc_ptr = self.malloc_varsize_clear_ptr
-            args = [self.c_const_gc, c_type_id, v_length, c_size,
-                    c_varitemsize, c_ofstolength, c_can_collect,
-                    c_has_finalizer]
+                if (self.malloc_varsize_clear_fast_ptr is not None and
+                    c_can_collect.value and not c_has_finalizer.value):
+                    malloc_ptr = self.malloc_varsize_clear_fast_ptr
+                else:
+                    malloc_ptr = self.malloc_varsize_clear_ptr
+                args = [self.c_const_gc, c_type_id, v_length, c_size,
+                        c_varitemsize, c_ofstolength, c_can_collect,
+                        c_has_finalizer]
         livevars = self.push_roots(hop)
         v_result = hop.genop("direct_call", [malloc_ptr] + args,
                              resulttype=llmemory.GCREF)
@@ -593,19 +612,17 @@
 
     def gct_malloc_nonmovable_varsize(self, hop):
         TYPE = hop.spaceop.result.concretetype
-        if self.gcdata.gc.moving_gc:
-            # first approximation
-            c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
-            return hop.cast_result(c)
-        return self.gct_malloc_varsize(hop)
+        if self.gcdata.gc.can_malloc_nonmovable():
+            return self.gct_malloc_varsize(hop, {'nonmovable':True})
+        c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
+        return hop.cast_result(c)
 
     def gct_malloc_nonmovable(self, hop):
         TYPE = hop.spaceop.result.concretetype
-        if self.gcdata.gc.moving_gc:
-            # first approximation
-            c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
-            return hop.cast_result(c)
-        return self.gct_malloc(hop)
+        if self.gcdata.gc.can_malloc_nonmovable():
+            return self.gct_malloc(hop, {'nonmovable':True})
+        c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
+        return hop.cast_result(c)
 
     def transform_generic_set(self, hop):
         from pypy.objspace.flow.model import Constant

Modified: pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/transform.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/transform.py	(original)
+++ pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/transform.py	Sun May 11 20:32:00 2008
@@ -495,7 +495,7 @@
             self.stack_malloc_fixedsize_ptr = self.inittime_helper(
                 ll_stack_malloc_fixedsize, [lltype.Signed], llmemory.Address)
 
-    def gct_malloc(self, hop):
+    def gct_malloc(self, hop, add_flags=None):
         TYPE = hop.spaceop.result.concretetype.TO
         assert not TYPE._is_varsize()
         flags = hop.spaceop.args[1].value
@@ -520,17 +520,21 @@
             hop.genop("raw_memclear", [v_raw, c_size])
         return v_raw        
 
-    def gct_malloc_varsize(self, hop):
-
+    def gct_malloc_varsize(self, hop, add_flags=None):
         flags = hop.spaceop.args[1].value
+        if add_flags:
+            flags.update(add_flags)
         flavor = flags['flavor']
         assert flavor != 'cpy', "cannot malloc CPython objects directly"
         meth = getattr(self, 'gct_fv_%s_malloc_varsize' % flavor, None)
         assert meth, "%s has no support for malloc_varsize with flavor %r" % (self, flavor) 
         return self.varsize_malloc_helper(hop, flags, meth, [])
 
-    gct_malloc_nonmovable = gct_malloc
-    gct_malloc_nonmovable_varsize = gct_malloc_varsize
+    def gct_malloc_nonmovable(self, *args, **kwds):
+        return self.gct_malloc(*args, **kwds)
+
+    def gct_malloc_nonmovable_varsize(self, *args, **kwds):
+        return self.gct_malloc_varsize(*args, **kwds)
 
     def gct_malloc_resizable_buffer(self, hop):
         flags = hop.spaceop.args[1].value

Modified: pypy/branch/hybrid-io/pypy/rpython/memory/test/test_transformed_gc.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/memory/test/test_transformed_gc.py	(original)
+++ pypy/branch/hybrid-io/pypy/rpython/memory/test/test_transformed_gc.py	Sun May 11 20:32:00 2008
@@ -37,6 +37,7 @@
     gcpolicy = None
     stacklessgc = False
     GC_CAN_MOVE = False
+    GC_CANNOT_MALLOC_NONMOVABLE = False
 
     def runner(self, f, nbargs=0, statistics=False, transformer=False,
                **extraconfigopts):
@@ -459,19 +460,19 @@
     def test_malloc_nonmovable(self):
         TP = lltype.GcArray(lltype.Char)
         def func():
-            try:
-                from pypy.rlib import rgc
-                a = rgc.malloc_nonmovable(TP, 3)
-                rgc.collect()
-                if a:
-                    assert not rgc.can_move(a)
-                    return 0
-                return 1
-            except Exception, e:
-                return 2
+            #try:
+            from pypy.rlib import rgc
+            a = rgc.malloc_nonmovable(TP, 3)
+            rgc.collect()
+            if a:
+                assert not rgc.can_move(a)
+                return 0
+            return 1
+            #except Exception, e:
+            #    return 2
 
         run = self.runner(func)
-        assert int(self.GC_CAN_MOVE) == run([])
+        assert int(self.GC_CANNOT_MALLOC_NONMOVABLE) == run([])
 
     def test_malloc_nonmovable_fixsize(self):
         S = lltype.GcStruct('S', ('x', lltype.Float))
@@ -489,7 +490,7 @@
                 return 2
 
         run = self.runner(func)
-        assert run([]) == int(self.GC_CAN_MOVE)
+        assert run([]) == int(self.GC_CANNOT_MALLOC_NONMOVABLE)
 
     def test_resizable_buffer(self):
         from pypy.rpython.lltypesystem.rstr import STR
@@ -508,6 +509,7 @@
 
 class GenericMovingGCTests(GenericGCTests):
     GC_CAN_MOVE = True
+    GC_CANNOT_MALLOC_NONMOVABLE = True
 
     def test_many_ids(self):
         py.test.skip("fails for bad reasons in lltype.py :-(")
@@ -956,6 +958,7 @@
 
 class TestHybridGC(TestGenerationGC):
     gcname = "hybrid"
+    GC_CANNOT_MALLOC_NONMOVABLE = False
 
     class gcpolicy(gc.FrameworkGcPolicy):
         class transformerclass(framework.FrameworkGCTransformer):
@@ -986,3 +989,6 @@
         run = self.runner(f, nbargs=2)
         res = run([100, 100])
         assert res == 200
+
+    def test_malloc_nonmovable_fixsize(self):
+        py.test.skip("not supported")



More information about the Pypy-commit mailing list