Author: Armin Rigo <ar...@tunes.org> Branch: gc-del Changeset: r62762:559f98495630 Date: 2013-03-25 22:04 +0100 http://bitbucket.org/pypy/pypy/changeset/559f98495630/
Log: Hack until test_newgc compiles. diff --git a/rpython/rlib/clibffi.py b/rpython/rlib/clibffi.py --- a/rpython/rlib/clibffi.py +++ b/rpython/rlib/clibffi.py @@ -646,8 +646,7 @@ def __del__(self): if self.ll_args: - argnum = len(self.argtypes) - for i in range(argnum): + for i in range(self.argnum): if self.ll_args[i]: lltype.free(self.ll_args[i], flavor='raw') lltype.free(self.ll_args, flavor='raw') diff --git a/rpython/translator/c/test/test_newgc.py b/rpython/translator/c/test/test_newgc.py --- a/rpython/translator/c/test/test_newgc.py +++ b/rpython/translator/c/test/test_newgc.py @@ -44,7 +44,8 @@ t = Translation(main, gc=cls.gcpolicy, taggedpointers=cls.taggedpointers, gcremovetypeptr=cls.removetypeptr) - t.disable(['backendopt']) + #t.disable(['backendopt']) -- XXX temporary maybe? needed for __del__ + # -- that calls external C functions t.set_backend_extra_options(c_debug_defines=True) t.rtype() if option.view: @@ -371,7 +372,7 @@ res = self.run('framework_opaque') assert res == -70 - def define_framework_finalizer(cls): + def define_framework_destructor(cls): class B(object): pass b = B() @@ -384,11 +385,41 @@ def __del__(self): b.num_deleted += 1 def f(): - a = A() + A() i = 0 while i < 5: i += 1 - a = A() + A() + llop.gc__collect(lltype.Void) + llop.gc__collect(lltype.Void) + return b.num_deleted + return f + + def test_framework_destructor(self): + res = self.run('framework_destructor') + assert res == 6 + + def define_framework_finalizer(cls): + class B(object): + pass + b = B() + b.nextid = 0 + b.num_deleted = 0 + class A(object): + def __init__(self): + self.id = b.nextid + b.nextid += 1 + rgc.register_finalizer(self.finalizer) + def finalizer(self): + b.num_deleted += 1 + if b.num_deleted == 3: + raise rgc.FinalizeLater + def f(): + A() + i = 0 + while i < 5: + i += 1 + A() llop.gc__collect(lltype.Void) llop.gc__collect(lltype.Void) return b.num_deleted @@ -441,6 +472,21 @@ def test_del_raises(self): self.run('del_raises') # does not raise + def define_finalizer_raises(cls): + class B(object): + def finalizer(self): + raise TypeError + def func(): + b = B() + rgc.register_finalizer(b.finalizer) + b = None + rgc.collect() + return 0 + return func + + def test_finalizer_raises(self): + self.run('finalizer_raises') # does not raise + def define_custom_trace(cls): from rpython.rtyper.annlowlevel import llhelper # _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit