[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