[pypy-svn] r46813 - in pypy/dist/pypy: rpython rpython/memory/gctransform translator/c/test

arigo at codespeak.net arigo at codespeak.net
Sat Sep 22 12:07:58 CEST 2007


Author: arigo
Date: Sat Sep 22 12:07:55 2007
New Revision: 46813

Modified:
   pypy/dist/pypy/rpython/memory/gctransform/transform.py
   pypy/dist/pypy/rpython/rbuiltin.py
   pypy/dist/pypy/translator/c/test/test_lltyped.py
   pypy/dist/pypy/translator/c/test/test_newgc.py
Log:
Support for malloc(flavor='raw', zero=True).
The gctransformer inserts a 'raw_memclear' operation in the graph
to handle this case.  Not implemented: varsized raw zero mallocs.


Modified: pypy/dist/pypy/rpython/memory/gctransform/transform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform/transform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform/transform.py	Sat Sep 22 12:07:55 2007
@@ -343,12 +343,14 @@
         flags = hop.spaceop.args[1].value
         flavor = flags['flavor']
         assert flavor == 'raw'
+        assert not flags.get('zero')
         return self.parenttransformer.gct_malloc(hop)
 
     def gct_malloc_varsize(self, hop):
         flags = hop.spaceop.args[1].value
         flavor = flags['flavor']
         assert flavor == 'raw'
+        assert not flags.get('zero')
         return self.parenttransformer.gct_malloc_varsize(hop)
     
     def gct_free(self, hop):
@@ -435,17 +437,22 @@
     def gct_fv_raw_malloc(self, hop, flags, TYPE, c_size):
         v_raw = hop.genop("direct_call", [self.raw_malloc_fixedsize_ptr, c_size],
                           resulttype=llmemory.Address)
+        if flags.get('zero'):
+            hop.genop("raw_memclear", [v_raw, c_size])
         return v_raw
 
     def gct_fv_stack_malloc(self, hop, flags, TYPE, c_size):
         v_raw = hop.genop("direct_call", [self.stack_malloc_fixedsize_ptr, c_size],
                           resulttype=llmemory.Address)
+        if flags.get('zero'):
+            hop.genop("raw_memclear", [v_raw, c_size])
         return v_raw        
 
     def gct_fv_cpy_malloc(self, hop, flags, TYPE, c_size): # xxx
         op = hop.spaceop
         args = op.args[:]
         del args[1]
+        assert not flags.get('zero')
         return hop.genop('cpy_malloc', args, resulttype=op.result.concretetype)
 
     def gct_malloc_varsize(self, hop):
@@ -497,6 +504,8 @@
                                [self.raw_malloc_varsize_ptr, v_length,
                                 c_const_size, c_item_size, c_offset_to_length],
                                resulttype=llmemory.Address)
+        if flags.get('zero'):
+            raise NotImplementedError("raw zero varsize malloc")
         return v_raw
 
     def gct_free(self, hop):

Modified: pypy/dist/pypy/rpython/rbuiltin.py
==============================================================================
--- pypy/dist/pypy/rpython/rbuiltin.py	(original)
+++ pypy/dist/pypy/rpython/rbuiltin.py	Sat Sep 22 12:07:55 2007
@@ -335,7 +335,7 @@
     if v_flavor is not None:
         flags['flavor'] = v_flavor.value
     if i_zero is not None:
-        assert i_extra_args is i_flavor is None
+        assert i_extra_args is None
         flags['zero'] = v_zero.value
     vlist.append(hop.inputconst(lltype.Void, flags))
         

Modified: pypy/dist/pypy/translator/c/test/test_lltyped.py
==============================================================================
--- pypy/dist/pypy/translator/c/test/test_lltyped.py	(original)
+++ pypy/dist/pypy/translator/c/test/test_lltyped.py	Sat Sep 22 12:07:55 2007
@@ -416,6 +416,22 @@
         res = fn(100)
         assert res == 3050
 
+    def test_zero_raw_malloc(self):
+        S = Struct('S', ('x', Signed), ('y', Signed))
+        def f(n):
+            for i in range(n):
+                p = malloc(S, flavor='raw', zero=True)
+                if p.x != 0 or p.y != 0:
+                    return -1
+                p.x = i
+                p.y = i
+                free(p, flavor='raw')
+            return 42
+
+        fn = self.getcompiled(f, [int])
+        res = fn(100)
+        assert res == 42
+
     def test_arithmetic_cornercases(self):
         import operator, sys
         from pypy.rlib.unroll import unrolling_iterable

Modified: pypy/dist/pypy/translator/c/test/test_newgc.py
==============================================================================
--- pypy/dist/pypy/translator/c/test/test_newgc.py	(original)
+++ pypy/dist/pypy/translator/c/test/test_newgc.py	Sat Sep 22 12:07:55 2007
@@ -758,6 +758,22 @@
         # the point is just not to segfault
         res = fn()
 
+    def test_zero_raw_malloc(self):
+        S = lltype.Struct('S', ('x', lltype.Signed), ('y', lltype.Signed))
+        def f():
+            for i in range(100):
+                p = lltype.malloc(S, flavor='raw', zero=True)
+                if p.x != 0 or p.y != 0:
+                    return -1
+                p.x = i
+                p.y = i
+                lltype.free(p, flavor='raw')
+            return 42
+
+        fn = self.getcompiled(f)
+        res = fn()
+        assert res == 42
+
 class TestUsingStacklessFramework(TestUsingFramework):
     gcpolicy = "stacklessgc"
 



More information about the Pypy-commit mailing list