[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