[pypy-svn] r15712 - in pypy/dist/pypy/rpython/memory: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Sat Aug 6 00:50:11 CEST 2005


Author: cfbolz
Date: Sat Aug  6 00:50:09 2005
New Revision: 15712

Modified:
   pypy/dist/pypy/rpython/memory/convertlltype.py
   pypy/dist/pypy/rpython/memory/test/test_convertlltype.py
Log:
fixed convert_struct for variable sized structs


Modified: pypy/dist/pypy/rpython/memory/convertlltype.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/convertlltype.py	(original)
+++ pypy/dist/pypy/rpython/memory/convertlltype.py	Sat Aug  6 00:50:09 2005
@@ -56,7 +56,11 @@
             return address
         TYPE = lltype.typeOf(_struct)
         layout = get_layout(TYPE)
-        size = get_total_size(TYPE)
+        if TYPE._arrayfld is not None:
+            inlinedarraylength = len(getattr(_struct, TYPE._arrayfld).items)
+            size = get_total_size(TYPE, inlinedarraylength)
+        else:
+            size = get_total_size(TYPE)
         if inline_to_addr is not None:
             startaddr = inline_to_addr
         else:

Modified: pypy/dist/pypy/rpython/memory/test/test_convertlltype.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/test/test_convertlltype.py	(original)
+++ pypy/dist/pypy/rpython/memory/test/test_convertlltype.py	Sat Aug  6 00:50:09 2005
@@ -87,5 +87,18 @@
     a = cvter.convert(lla)
     assert a[0].a[1].a[2].a == a
     assert [a[i].b for i in range(3)] == [1, 2, 3]
+
+def test_varsize_struct():
+    cvter = LLTypeConverter(lladdress.raw_malloc(1000))
+    A = lltype.Array(lltype.Signed)
+    S = lltype.GcStruct("name", ("v", lltype.Signed), ("a", A))
+    lls = lltype.malloc(S, 3)
+    lls.a[0] = 1
+    lls.a[1] = 2
+    lls.a[2] = 3
+    lls.v = 4
+    s = cvter.convert(lls)
+    assert [s.a[i] for i in range(3)] == [1, 2, 3]
+    assert s.v == 4
     
     



More information about the Pypy-commit mailing list