[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