[pypy-commit] pypy default: Test and fix: must call _contains_gcptr recursively
arigo
noreply at buildbot.pypy.org
Sat Jan 5 22:56:37 CET 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r59792:0603719c6c31
Date: 2013-01-05 22:56 +0100
http://bitbucket.org/pypy/pypy/changeset/0603719c6c31/
Log: Test and fix: must call _contains_gcptr recursively
diff --git a/pypy/rlib/rgc.py b/pypy/rlib/rgc.py
--- a/pypy/rlib/rgc.py
+++ b/pypy/rlib/rgc.py
@@ -176,13 +176,12 @@
@specialize.memo()
def _contains_gcptr(TP):
- TP = TP.OF
if not isinstance(TP, lltype.Struct):
if isinstance(TP, lltype.Ptr) and TP.TO._gckind == 'gc':
return True
return False
for TP in TP._flds.itervalues():
- if isinstance(TP, lltype.Ptr) and TP.TO._gckind == 'gc':
+ if _contains_gcptr(TP):
return True
return False
@@ -208,7 +207,7 @@
TP = lltype.typeOf(source).TO
assert TP == lltype.typeOf(dest).TO
- if _contains_gcptr(TP):
+ if _contains_gcptr(TP.OF):
# perform a write barrier that copies necessary flags from
# source to dest
if not llop.gc_writebarrier_before_copy(lltype.Bool, source, dest,
diff --git a/pypy/rlib/test/test_rgc.py b/pypy/rlib/test/test_rgc.py
--- a/pypy/rlib/test/test_rgc.py
+++ b/pypy/rlib/test/test_rgc.py
@@ -159,17 +159,20 @@
assert a2[2].y == 15
def test__contains_gcptr():
- assert not rgc._contains_gcptr(lltype.GcArray(lltype.Signed))
- assert not rgc._contains_gcptr(lltype.GcArray(
- lltype.Struct('x', ('x', lltype.Signed))))
- assert rgc._contains_gcptr(lltype.GcArray(
+ assert not rgc._contains_gcptr(lltype.Signed)
+ assert not rgc._contains_gcptr(
+ lltype.Struct('x', ('x', lltype.Signed)))
+ assert rgc._contains_gcptr(
lltype.Struct('x', ('x', lltype.Signed),
- ('y', lltype.Ptr(lltype.GcArray(lltype.Signed))))))
- assert rgc._contains_gcptr(lltype.GcArray(
+ ('y', lltype.Ptr(lltype.GcArray(lltype.Signed)))))
+ assert rgc._contains_gcptr(
lltype.Struct('x', ('x', lltype.Signed),
- ('y', llmemory.GCREF))))
- assert rgc._contains_gcptr(lltype.GcArray(lltype.Ptr(lltype.GcStruct('x'))))
- assert not rgc._contains_gcptr(lltype.GcArray(lltype.Ptr(lltype.Struct('x'))))
+ ('y', llmemory.GCREF)))
+ assert rgc._contains_gcptr(lltype.Ptr(lltype.GcStruct('x')))
+ assert not rgc._contains_gcptr(lltype.Ptr(lltype.Struct('x')))
+ GCPTR = lltype.Ptr(lltype.GcStruct('x'))
+ assert rgc._contains_gcptr(
+ lltype.Struct('FOO', ('s', lltype.Struct('BAR', ('y', GCPTR)))))
def test_ll_arraycopy_small():
TYPE = lltype.GcArray(lltype.Signed)
More information about the pypy-commit
mailing list