[pypy-svn] r54055 - in pypy/branch/io-improvements/pypy/rpython: . memory memory/test

fijal at codespeak.net fijal at codespeak.net
Wed Apr 23 16:51:50 CEST 2008


Author: fijal
Date: Wed Apr 23 16:51:48 2008
New Revision: 54055

Modified:
   pypy/branch/io-improvements/pypy/rpython/llinterp.py
   pypy/branch/io-improvements/pypy/rpython/memory/gcwrapper.py
   pypy/branch/io-improvements/pypy/rpython/memory/test/test_gc.py
   pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py
Log:
* Add tests to test_gc
* Simplify tests in test_tranformed_gc
* support in llinterp for malloc_nonmoving (still, pretty basic)


Modified: pypy/branch/io-improvements/pypy/rpython/llinterp.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/llinterp.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/llinterp.py	Wed Apr 23 16:51:48 2008
@@ -685,11 +685,17 @@
         except MemoryError:
             self.make_llexception()
             
-    def op_malloc_nonmovable(self, obj, flags, size):
-        return self.op_malloc(obj, flags, size)
+    def op_malloc_nonmovable(self, obj, flags):
+        flavor = flags['flavor']
+        assert flavor == 'gc'
+        zero = flags.get('zero', False)
+        return self.heap.malloc_nonmovable(obj, zero=zero)
         
     def op_malloc_nonmovable_varsize(self, obj, flags, size):
-        return self.op_malloc_varsize(obj, flags, size)
+        flavor = flags['flavor']
+        assert flavor == 'gc'
+        zero = flags.get('zero', False)
+        return self.heap.malloc_nonmovable(obj, size, zero=zero)
 
     def op_free(self, obj, flavor):
         assert isinstance(flavor, str)

Modified: pypy/branch/io-improvements/pypy/rpython/memory/gcwrapper.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/gcwrapper.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/gcwrapper.py	Wed Apr 23 16:51:48 2008
@@ -42,6 +42,16 @@
         else:
             return lltype.malloc(TYPE, n, flavor=flavor, zero=zero)
 
+    def malloc_nonmovable(self, TYPE, n=None, zero=False):
+        typeid = self.get_type_id(TYPE)
+        if self.gc.moving_gc:
+            return lltype.nullptr(TYPE)
+        addr = self.gc.malloc(typeid, n, zero=zero)
+        result = llmemory.cast_adr_to_ptr(addr, lltype.Ptr(TYPE))
+        if not self.gc.malloc_zero_filled:
+            gctypelayout.zero_gc_pointers(result)
+        return result
+
     def free(self, TYPE, flavor='gc'):
         assert flavor != 'gc'
         return lltype.free(TYPE, flavor=flavor)

Modified: pypy/branch/io-improvements/pypy/rpython/memory/test/test_gc.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/test/test_gc.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/test/test_gc.py	Wed Apr 23 16:51:48 2008
@@ -396,6 +396,39 @@
             return rgc.can_move(lltype.malloc(TP, 1))
         assert self.interpret(func, []) == self.GC_CAN_MOVE
 
+    
+    def test_malloc_nonmovable(self):
+        TP = lltype.GcArray(lltype.Char)
+        def func():
+            try:
+                from pypy.rlib import rgc
+                a = rgc.malloc_nonmovable(TP, 3)
+                if a:
+                    assert not rgc.can_move(a)
+                    return 0
+                return 1
+            except Exception, e:
+                return 2
+
+        assert self.interpret(func, []) == int(self.GC_CAN_MOVE)
+
+    def test_malloc_nonmovable_fixsize(self):
+        S = lltype.GcStruct('S', ('x', lltype.Float))
+        TP = lltype.GcStruct('T', ('s', lltype.Ptr(S)))
+        def func():
+            try:
+                from pypy.rlib import rgc
+                a = rgc.malloc_nonmovable(TP)
+                rgc.collect()
+                if a:
+                    assert not rgc.can_move(a)
+                    return 0
+                return 1
+            except Exception, e:
+                return 2
+
+        assert self.interpret(func, []) == int(self.GC_CAN_MOVE)
+
 class TestMarkSweepGC(GCTest):
     from pypy.rpython.memory.gc.marksweep import MarkSweepGC as GCClass
 

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 23 16:51:48 2008
@@ -457,12 +457,13 @@
         res = run([])
         assert res == self.GC_CAN_MOVE
 
-    def _test_malloc_nonmovable(self):
+    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
@@ -470,12 +471,10 @@
             except Exception, e:
                 return 2
 
-        # this test would have different outcome for different
-        # gcs, please assert differently
         run = self.runner(func)
-        return run([])
+        assert int(self.GC_CAN_MOVE) == run([])
 
-    def _test_malloc_nonmovable_fixsize(self):
+    def test_malloc_nonmovable_fixsize(self):
         S = lltype.GcStruct('S', ('x', lltype.Float))
         TP = lltype.GcStruct('T', ('s', lltype.Ptr(S)))
         def func():
@@ -490,26 +489,23 @@
             except Exception, e:
                 return 2
 
-        # this test would have different outcome for different
-        # gcs, please assert differently
         run = self.runner(func)
-        return run([])            
+        assert run([]) == int(self.GC_CAN_MOVE)
 
-    def test_malloc_nonmovable(self):
-        res = self._test_malloc_nonmovable()
-        if self.GC_CAN_MOVE:
-            expected = 1
-        else:
-            expected = 0
-        assert res == expected
+    def test_raw_array(self):
+        from pypy.rpython.lltypesystem.rstr import STR
+        from pypy.rpython.annlowlevel import hlstr
+        from pypy.rlib import rgc
 
-    def test_malloc_nonmovable_fixsize(self):
-        res = self._test_malloc_nonmovable_fixsize()
-        if self.GC_CAN_MOVE:
-            expected = 1
-        else:
-            expected = 0
-        assert res == expected
+        def f():
+            arr = rgc.raw_array_of_shape(STR, 1)
+            arr[0] = 'a'
+            arr = rgc.resize_raw_array(arr, 1, 2)
+            arr[1] = 'b'
+            return len(hlstr(rgc.cast_raw_array_to_shape(STR, arr, 2)))
+
+        run = self.runner(f)
+        assert run([]) == 2
 
 class GenericMovingGCTests(GenericGCTests):
     GC_CAN_MOVE = True



More information about the Pypy-commit mailing list