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

fijal at codespeak.net fijal at codespeak.net
Sun May 4 16:35:48 CEST 2008


Author: fijal
Date: Sun May  4 16:35:47 2008
New Revision: 54409

Modified:
   pypy/branch/io-improvements/pypy/rpython/memory/gctransform/transform.py
   pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py
Log:
Start default transformation of resize_buffer.


Modified: pypy/branch/io-improvements/pypy/rpython/memory/gctransform/transform.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/gctransform/transform.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/gctransform/transform.py	Sun May  4 16:35:47 2008
@@ -522,6 +522,38 @@
 
     gct_malloc_nonmovable = gct_malloc
     gct_malloc_nonmovable_varsize = gct_malloc_varsize
+    
+    gct_malloc_resizable_buffer = gct_malloc_varsize
+
+    def gct_resize_buffer(self, hop):
+        op = hop.spaceop
+        meth = self.gct_fv_gc_malloc_varsize
+        flags = {'flavor':'gc'}
+        self.varsize_malloc_helper(hop, flags, meth, [])
+        # fish resvar
+        v_newbuf = hop.llops[-1].result
+        v_src = op.args[0]
+        TYPE = v_src.concretetype.TO
+        v_arr = hop.genop('getfield', [v_src, rmodel.inputconst(lltype.Void,
+                                                            TYPE._arrayfld)],
+                          resulttype=getattr(TYPE, TYPE._arrayfld))
+        v_lgt = hop.genop('getfield', [v_arr, rmodel.inputconst(lltype.Void,
+                                                             'length')],
+                          resulttype=lltype.Signed)
+        v_adrsrc = hop.genop('cast_ptr_to_adr', [v_src],
+                             resulttype=llmemory.Address)
+        v_adrnewbuf = hop.genop('cast_ptr_to_adr', [v_newbuf],
+                                resulttype=llmemory.Address)
+        ofs = (llmemory.offsetof(TYPE, TYPE._arrayfld) +
+               llmemory.itemoffsetof(getattr(TYPE, TYPE._arrayfld), 0))
+        v_ofs = rmodel.inputconst(lltype.Void, ofs)
+        v_adrsrc = hop.genop('adr_add', [v_adrsrc, v_ofs],
+                             resulttype=llmemory.Address)
+        v_adrnewbuf = hop.genop('adr_add', [v_adrnewbuf, v_ofs],
+                                resulttype=llmemory.Address)
+        vlist = [v_adrsrc, v_adrnewbuf, v_lgt]
+        hop.genop('raw_memcopy', vlist)
+        return v_newbuf
 
     def varsize_malloc_helper(self, hop, flags, meth, extraargs):
         def intconst(c): return rmodel.inputconst(lltype.Signed, c)
@@ -549,10 +581,8 @@
         args = [hop] + extraargs + [flags, TYPE,
                 op.args[-1], c_const_size, c_item_size, c_offset_to_length]
         v_raw = meth(*args)
-
         hop.cast_result(v_raw)
 
-
     def gct_fv_raw_malloc_varsize(self, hop, flags, TYPE, v_length, c_const_size, c_item_size,
                                                                     c_offset_to_length):
         if c_offset_to_length is None:

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	Sun May  4 16:35:47 2008
@@ -492,17 +492,18 @@
         run = self.runner(func)
         assert run([]) == int(self.GC_CAN_MOVE)
 
-    def test_raw_array(self):
+    def test_resizable_buffer(self):
+        py.test.skip("Does not work")
         from pypy.rpython.lltypesystem.rstr import STR
         from pypy.rpython.annlowlevel import hlstr
         from pypy.rlib import rgc
 
         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)))
+            ptr = rgc.resizable_buffer_of_shape(STR, 1)
+            ptr.chars[0] = 'a'
+            ptr = rgc.resize_buffer(ptr, 2)
+            ptr.chars[1] = 'b'
+            return len(hlstr(rgc.finish_building_buffer(ptr)))
 
         run = self.runner(f)
         assert run([]) == 2



More information about the Pypy-commit mailing list