[pypy-svn] r70832 - in pypy/branch/stringbuilder2/pypy/rpython/memory: . test

fijal at codespeak.net fijal at codespeak.net
Mon Jan 25 15:18:20 CET 2010


Author: fijal
Date: Mon Jan 25 15:18:19 2010
New Revision: 70832

Modified:
   pypy/branch/stringbuilder2/pypy/rpython/memory/gcwrapper.py
   pypy/branch/stringbuilder2/pypy/rpython/memory/test/test_gc.py
Log:
Improve gcwrapper, so we can test stringbuilder in test_gc, add a test


Modified: pypy/branch/stringbuilder2/pypy/rpython/memory/gcwrapper.py
==============================================================================
--- pypy/branch/stringbuilder2/pypy/rpython/memory/gcwrapper.py	(original)
+++ pypy/branch/stringbuilder2/pypy/rpython/memory/gcwrapper.py	Mon Jan 25 15:18:19 2010
@@ -67,19 +67,31 @@
             gctypelayout.zero_gc_pointers(result)
         return result
 
-    def resize_buffer(self, obj, old_size, new_size):
+    def resize_buffer(self, obj, oldlength, newlength):
         T = lltype.typeOf(obj).TO
-        buf = self.malloc_resizable_buffer(T, new_size)
-        # copy contents
-        arrayfld = T._arrayfld
-        new_arr = getattr(buf, arrayfld)
-        old_arr = getattr(obj, arrayfld)
-        for i in range(old_size):
-            new_arr[i] = old_arr[i]
-        return buf
+        ARRAY = getattr(T, T._arrayfld)
+        itemsofs = (llmemory.FieldOffset(T, T._arrayfld) +
+                    llmemory.itemoffsetof(ARRAY, 0))
+        fixedsize = llmemory.sizeof(T, 0)
+        itemsize = llmemory.sizeof(ARRAY.OF)
+        lengthofs = llmemory.FieldOffset(T, T._arrayfld) + \
+                           llmemory.ArrayLengthOffset(ARRAY)
+        result = self.gc.realloc(obj, oldlength, newlength, fixedsize,
+                                 itemsize, lengthofs, itemsofs, True)
+        return lltype.cast_opaque_ptr(lltype.typeOf(obj), result)
 
-    def finish_building_buffer(self, obj, size):
-        return obj
+    def finish_building_buffer(self, obj, newlength):
+        T = lltype.typeOf(obj).TO
+        ARRAY = getattr(T, T._arrayfld)
+        itemsofs = (llmemory.FieldOffset(T, T._arrayfld) +
+                    llmemory.itemoffsetof(ARRAY, 0))
+        fixedsize = llmemory.sizeof(T, 0)
+        itemsize = llmemory.sizeof(ARRAY.OF)
+        lengthofs = llmemory.FieldOffset(T, T._arrayfld) + \
+                           llmemory.ArrayLengthOffset(ARRAY)
+        result = self.gc.realloc(obj, 0, newlength, fixedsize,
+                                 itemsize, lengthofs, itemsofs, False)
+        return lltype.cast_opaque_ptr(lltype.typeOf(obj), result)
 
     def free(self, TYPE, flavor='gc'):
         assert flavor != 'gc'

Modified: pypy/branch/stringbuilder2/pypy/rpython/memory/test/test_gc.py
==============================================================================
--- pypy/branch/stringbuilder2/pypy/rpython/memory/test/test_gc.py	(original)
+++ pypy/branch/stringbuilder2/pypy/rpython/memory/test/test_gc.py	Mon Jan 25 15:18:19 2010
@@ -11,7 +11,7 @@
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rlib.objectmodel import compute_unique_id, keepalive_until_here
 from pypy.rlib import rgc
-
+from pypy.rlib.rstring import StringBuilder
 
 def stdout_ignore_ll_functions(msg):
     strmsg = str(msg)
@@ -475,7 +475,7 @@
         def f():
             ptr = rgc.resizable_buffer_of_shape(STR, 1)
             ptr.chars[0] = 'a'
-            ptr = rgc.resize_buffer(ptr, 1, 2)
+            ptr = rgc.resize_buffer(ptr, 1, 4)
             ptr.chars[1] = 'b'
             return len(hlstr(rgc.finish_building_buffer(ptr, 2)))
 
@@ -571,6 +571,20 @@
 
         self.interpret(fn, [])
 
+    def test_stringbuilder(self):
+        def fn():
+            s = StringBuilder(4)
+            s.append("abcd")
+            s.append("defg")
+            s.append("rty")
+            s.append_multiple_char('y', 1000)
+            rgc.collect()
+            s.append_multiple_char('y', 1000)
+            res = s.build()[1000]
+            rgc.collect()
+            return ord(res)
+        res = self.interpret(fn, [])
+        assert res == ord('y')
 
 from pypy.rlib.objectmodel import UnboxedValue
 



More information about the Pypy-commit mailing list