[pypy-svn] r54661 - in pypy/branch/hybrid-io/pypy/rpython/lltypesystem: . test
fijal at codespeak.net
fijal at codespeak.net
Sun May 11 23:19:47 CEST 2008
Author: fijal
Date: Sun May 11 23:19:47 2008
New Revision: 54661
Modified:
pypy/branch/hybrid-io/pypy/rpython/lltypesystem/llmemory.py
pypy/branch/hybrid-io/pypy/rpython/lltypesystem/test/test_llmemory.py
Log:
Implement raw_realloc for varsized struct as well
Modified: pypy/branch/hybrid-io/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/lltypesystem/llmemory.py (original)
+++ pypy/branch/hybrid-io/pypy/rpython/lltypesystem/llmemory.py Sun May 11 23:19:47 2008
@@ -695,10 +695,20 @@
def raw_realloc(adr, size):
new_area = size._raw_malloc([], zero=False)
- old_len = len(adr.ptr)
- new_len = len(new_area.ptr)
+ ptr = adr.ptr
+ if isinstance(lltype.typeOf(ptr).TO, lltype.Array):
+ from_arr = adr.ptr
+ to_arr = new_area.ptr
+ elif isinstance(lltype.typeOf(ptr).TO, lltype.Struct):
+ arrayfld = lltype.typeOf(ptr).TO._arrayfld
+ from_arr = getattr(ptr, arrayfld)
+ to_arr = getattr(new_area.ptr, arrayfld)
+ else:
+ raise TypeError("%s seems to be not var-sized" % (lltype.typeOf(ptr),))
+ old_len = len(from_arr)
+ new_len = len(to_arr)
for i in range(min(old_len, new_len)):
- new_area.ptr[i] = adr.ptr[i]
+ to_arr[i] = from_arr[i]
return new_area
def raw_free(adr):
Modified: pypy/branch/hybrid-io/pypy/rpython/lltypesystem/test/test_llmemory.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/lltypesystem/test/test_llmemory.py (original)
+++ pypy/branch/hybrid-io/pypy/rpython/lltypesystem/test/test_llmemory.py Sun May 11 23:19:47 2008
@@ -624,4 +624,16 @@
assert len(ptr2) == 5
assert ptr2[3] == 3.0
assert ptr2[1] == 1.0
-
+
+def test_realloc_struct():
+ S = lltype.Struct('x', ('one', lltype.Signed),
+ ('a', lltype.Array(lltype.Float)))
+ adr = raw_malloc(sizeof(S, 5))
+ ptr = cast_adr_to_ptr(adr, lltype.Ptr(S))
+ for i in range(5):
+ ptr.a[i] = float(i)
+ adr2 = raw_realloc(adr, sizeof(S, 10))
+ ptr2 = cast_adr_to_ptr(adr2, lltype.Ptr(S))
+ assert len(ptr2.a) == 10
+ assert ptr2.a[3] == 3.0
+ assert ptr2.a[0] == 0.0
More information about the Pypy-commit
mailing list