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

cfbolz at codespeak.net cfbolz at codespeak.net
Fri Aug 5 15:07:21 CEST 2005


Author: cfbolz
Date: Fri Aug  5 15:07:20 2005
New Revision: 15691

Modified:
   pypy/dist/pypy/rpython/memory/convertlltype.py
   pypy/dist/pypy/rpython/memory/test/test_convertlltype.py
Log:
fixed problems with circular data structures + tests


Modified: pypy/dist/pypy/rpython/memory/convertlltype.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/convertlltype.py	(original)
+++ pypy/dist/pypy/rpython/memory/convertlltype.py	Fri Aug  5 15:07:20 2005
@@ -9,10 +9,10 @@
 
 class LLTypeConverter(object):
     def __init__(self, address):
+        self.converted = {}
         self.curraddress = address
 
     def convert(self, val_or_ptr, inline_to_addr=None):
-        print "convert", val_or_ptr, inline_to_addr
         TYPE = lltype.typeOf(val_or_ptr)
         if isinstance(TYPE, lltype.Primitive):
             if inline_to_addr is not None:
@@ -28,7 +28,10 @@
             assert 0, "not yet implemented"
 
     def convert_array(self, _array, inline_to_addr):
-        print "convert_array", _array, inline_to_addr
+        if _array in self.converted:
+            address = self.converted[_array]
+            assert inline_to_addr is None or address == inline_to_addr
+            return address
         TYPE = lltype.typeOf(_array)
         arraylength = len(_array.items)
         size = get_total_size(TYPE, arraylength)
@@ -36,6 +39,7 @@
             startaddr = inline_to_addr
         else:
             startaddr = self.curraddress
+        self.converted[_array] = startaddr
         startaddr.signed[0] = arraylength
         curraddr = startaddr + get_fixed_size(TYPE)
         varsize = get_variable_size(TYPE)
@@ -46,15 +50,18 @@
         return startaddr
 
     def convert_struct(self, _struct, inline_to_addr):
-        print "convert_struct", _struct, inline_to_addr,
+        if _struct in self.converted:
+            address = self.converted[_struct]
+            assert inline_to_addr is None or address == inline_to_addr
+            return address
         TYPE = lltype.typeOf(_struct)
         layout = get_layout(TYPE)
-        print layout
         size = get_total_size(TYPE)
         if inline_to_addr is not None:
             startaddr = inline_to_addr
         else:
             startaddr = self.curraddress
+        self.converted[_struct] = startaddr
         self.curraddress += size
         for name in TYPE._flds:
             addr = startaddr + layout[name]
@@ -62,7 +69,6 @@
         return startaddr
 
     def convert_pointer(self, _ptr, inline_to_addr):
-        print "convert_pointer", _ptr, inline_to_addr
         TYPE = lltype.typeOf(_ptr)
         addr = self.convert(_ptr._obj)
         assert isinstance(addr, lladdress.Address)

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	Fri Aug  5 15:07:20 2005
@@ -45,7 +45,47 @@
     lla[1] = lltype.malloc(S)
     lla[1].v = 2
     lla[2] = lltype.malloc(S)
-    lla[2].v = 2
+    lla[2].v = 3
+    assert [lla[z].v for z in range(3)] == [1, 2, 3]
+    print lla
+    print [lla[z] for z in range(3)]
     x = cvter.convert(lla)
+    print x
+    print [x[z] for z in range(3)]
+    print x._address._load("iiiiiii")
     assert [x[z].v for z in range(3)] == [1, 2, 3]
+    
 
+def test_circular_struct():
+    cvter = LLTypeConverter(lladdress.raw_malloc(100))
+    F = lltype.GcForwardReference()
+    S = lltype.GcStruct('abc', ('x', lltype.Ptr(F)))
+    F.become(S)
+    lls = lltype.malloc(S)
+    lls.x = lls
+    s = cvter.convert(lls)
+    assert s.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x == s
+
+def test_circular_array():
+    cvter = LLTypeConverter(lladdress.raw_malloc(1000))
+    F = lltype.GcForwardReference()
+    A = lltype.GcArray(lltype.Ptr(F))
+    S = lltype.GcStruct("name", ("a", lltype.Ptr(A)), ("b", lltype.Signed))
+    F.become(S)
+    lla = lltype.malloc(A, 3)
+    lla[0] = lltype.malloc(S)
+    lla[1] = lltype.malloc(S)
+    lla[2] = lltype.malloc(S)
+    lla[0].a = lla
+    lla[1].a = lla
+    lla[2].a = lla
+    lla[0].b = 1
+    lla[1].b = 2
+    lla[2].b = 3
+    assert lla[0].a[1].a[2].a == lla
+    assert [lla[i].b for i in range(3)] == [1, 2, 3]
+    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]
+    
+    



More information about the Pypy-commit mailing list