[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