[pypy-svn] r24155 - in pypy/dist/pypy/rpython/lltypesystem: . test
mwh at codespeak.net
mwh at codespeak.net
Thu Mar 9 10:56:36 CET 2006
Author: mwh
Date: Thu Mar 9 10:56:29 2006
New Revision: 24155
Modified:
pypy/dist/pypy/rpython/lltypesystem/lltype.py
pypy/dist/pypy/rpython/lltypesystem/test/test_lltype.py
Log:
a dissect_ll_instance generator, that returns all ll objects referred to by a
given ll object. hope this helps me simplify stuff in FrameworkGCTransformer,
or I've just wasted half an hour writing it...
Modified: pypy/dist/pypy/rpython/lltypesystem/lltype.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/lltype.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/lltype.py Thu Mar 9 10:56:29 2006
@@ -1110,5 +1110,29 @@
def typeMethod(func):
func._type_method = True
return func
-
+def dissect_ll_instance(v, memo=None):
+ if memo is None:
+ memo = {}
+ if id(v) in memo:
+ return
+ memo[id(v)] = True
+ yield v
+ t = typeOf(v)
+ if isinstance(t, Ptr):
+ if v._obj:
+ for i in dissect_ll_instance(v._obj, memo):
+ yield i
+ elif isinstance(t, Struct):
+ parent = v._parentstructure()
+ if parent:
+ for i in dissect_ll_instance(parent, memo):
+ yield i
+ for n in t._flds:
+ f = getattr(t, n)
+ for i in dissect_ll_instance(getattr(v, n), memo):
+ yield i
+ elif isinstance(t, Array):
+ for item in v.items:
+ for i in dissect_ll_instance(item, memo):
+ yield i
Modified: pypy/dist/pypy/rpython/lltypesystem/test/test_lltype.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/test/test_lltype.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/test/test_lltype.py Thu Mar 9 10:56:29 2006
@@ -513,3 +513,34 @@
a = malloc(A, 10)
py.test.raises(TypeError, len, a)
+def test_dissect_ll_instance():
+ assert list(dissect_ll_instance(1)) == [1]
+ GcS = GcStruct("S", ('x', Signed))
+ s = malloc(GcS)
+ s.x = 1
+ assert list(dissect_ll_instance(s)) == [s, s._obj, 1]
+
+ A = GcArray(('x', Signed))
+ a = malloc(A, 10)
+ for i in range(10):
+ a[i].x = i
+ expected = [a, a._obj]
+ for t in [(a._obj.items[i], i) for i in range(10)]:
+ expected.extend(t)
+ assert list(dissect_ll_instance(a)) == expected
+
+ R = GcStruct("R", ('r', Ptr(GcForwardReference())))
+ R.r.TO.become(R)
+
+ r = malloc(R)
+ r.r = r
+ assert list(dissect_ll_instance(r)) == [r, r._obj]
+
+ B = GcArray(Ptr(R))
+ b = malloc(B, 2)
+ b[0] = b[1] = r
+ assert list(dissect_ll_instance(b)) == [b, b._obj, r, r._obj]
+
+ memo = {}
+ assert list(dissect_ll_instance(r, memo)) == [r, r._obj]
+ assert list(dissect_ll_instance(b, memo)) == [b, b._obj]
More information about the Pypy-commit
mailing list