Author: Armin Rigo <ar...@tunes.org> Branch: gc-del Changeset: r62752:df1b2661e5c8 Date: 2013-03-25 19:55 +0100 http://bitbucket.org/pypy/pypy/changeset/df1b2661e5c8/
Log: In-progress: start on framework.py. diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py --- a/rpython/memory/gctransform/framework.py +++ b/rpython/memory/gctransform/framework.py @@ -241,7 +241,6 @@ [s_gc, s_typeid16, annmodel.SomeInteger(nonneg=True), annmodel.SomeBool(), - annmodel.SomeBool(), annmodel.SomeBool()], s_gcref, inline = False) if hasattr(GCClass, 'malloc_fixedsize'): @@ -251,7 +250,6 @@ [s_gc, s_typeid16, annmodel.SomeInteger(nonneg=True), annmodel.SomeBool(), - annmodel.SomeBool(), annmodel.SomeBool()], s_gcref, inline = False) else: @@ -322,7 +320,7 @@ malloc_fast, [s_gc, s_typeid16, annmodel.SomeInteger(nonneg=True), - s_False, s_False, s_False], s_gcref, + s_False, s_False], s_gcref, inline = True) else: self.malloc_fast_ptr = None @@ -892,7 +890,7 @@ c_false = rmodel.inputconst(lltype.Bool, False) c_has_weakptr = rmodel.inputconst(lltype.Bool, True) args = [self.c_const_gc, c_type_id, c_size, - c_false, c_false, c_has_weakptr] + c_false, c_has_weakptr] # push and pop the current live variables *including* the argument # to the weakref_create operation, which must be kept alive and diff --git a/rpython/memory/gctypelayout.py b/rpython/memory/gctypelayout.py --- a/rpython/memory/gctypelayout.py +++ b/rpython/memory/gctypelayout.py @@ -1,13 +1,14 @@ from rpython.rtyper.lltypesystem import lltype, llmemory, llarena, llgroup from rpython.rtyper.lltypesystem import rclass from rpython.rtyper.lltypesystem.lloperation import llop -from rpython.rlib.debug import ll_assert +from rpython.rlib.debug import ll_assert, debug_print from rpython.rlib.rarithmetic import intmask from rpython.rlib import rgc from rpython.rlib.objectmodel import we_are_translated from rpython.tool.identity_dict import identity_dict + class GCData(object): """The GC information tables, and the query functions that the GC calls to decode their content. The encoding of this information @@ -28,6 +29,7 @@ llmemory.Address], llmemory.Address) DESTRUCTOR_OR_CT = lltype.Ptr(DESTRUCTOR_OR_CT_FUNC) + FINALIZER = lltype.Ptr(lltype.FuncType([llmemory.Address], lltype.Void)) # structure describing the layout of a typeid TYPE_INFO = lltype.Struct("type_info", @@ -138,15 +140,14 @@ return infobits & T_ANY_SLOW_FLAG == 0 def q_call_finalizer(self, finalizer, obj): - XXX - FINALIZER = lltype.Ptr(lltype.FuncType([llmemory.Address], - lltype.Void)) - finalizer = llmemory.cast_adr_to_ptr(finalizer, FINALIZER) - finalizer(obj) -## except rgc.FinalizeLater: -## xxx -## except Exception, e: -## XXX + finalizer = llmemory.cast_adr_to_ptr(finalizer, self.FINALIZER) + try: + finalizer(obj) + except rgc.FinalizeLater: + return False + except Exception: + debug_print("exception from finalizer", finalizer, "of", obj) + llop.debug_fatalerror(lltype.Void, "exception from finalizer!") return True diff --git a/rpython/memory/test/test_transformed_gc.py b/rpython/memory/test/test_transformed_gc.py --- a/rpython/memory/test/test_transformed_gc.py +++ b/rpython/memory/test/test_transformed_gc.py @@ -287,7 +287,7 @@ res = run([]) assert res == 42 - def define_finalizer(cls): + def define_destructor(cls): class B(object): pass b = B() @@ -312,42 +312,10 @@ def test_finalizer(self): run = self.runner("finalizer") - res = run([5, 42]) #XXX pure lazyness here too + res = run([5, 42]) assert res == 6 - def define_finalizer_calls_malloc(cls): - class B(object): - pass - b = B() - b.nextid = 0 - b.num_deleted = 0 - class AAA(object): - def __init__(self): - self.id = b.nextid - b.nextid += 1 - def __del__(self): - b.num_deleted += 1 - C() - class C(AAA): - def __del__(self): - b.num_deleted += 1 - def f(x, y): - a = AAA() - i = 0 - while i < x: - i += 1 - a = AAA() - llop.gc__collect(lltype.Void) - llop.gc__collect(lltype.Void) - return b.num_deleted - return f - - def test_finalizer_calls_malloc(self): - run = self.runner("finalizer_calls_malloc") - res = run([5, 42]) #XXX pure lazyness here too - assert res == 12 - - def define_finalizer_resurrects(cls): + def define_finalizer(cls): class B(object): pass b = B() @@ -357,9 +325,9 @@ def __init__(self): self.id = b.nextid b.nextid += 1 - def __del__(self): + rgc.register_finalizer(self.finalizer) + def finalizer(self): b.num_deleted += 1 - b.a = self def f(x, y): a = A() i = 0 @@ -368,18 +336,13 @@ a = A() llop.gc__collect(lltype.Void) llop.gc__collect(lltype.Void) - aid = b.a.id - b.a = None - # check that __del__ is not called again - llop.gc__collect(lltype.Void) - llop.gc__collect(lltype.Void) - return b.num_deleted * 10 + aid + 100 * (b.a is None) + return b.num_deleted return f - def test_finalizer_resurrects(self): - run = self.runner("finalizer_resurrects") - res = run([5, 42]) #XXX pure lazyness here too - assert 160 <= res <= 165 + def test_finalizer(self): + run = self.runner("finalizer") + res = run([5, 42]) + assert res == 6 def define_custom_trace(cls): from rpython.rtyper.annlowlevel import llhelper @@ -475,13 +438,16 @@ def __init__(self): self.id = b.nextid b.nextid += 1 - def __del__(self): + rgc.register_finalizer(self.finalizer) + def finalizer(self): + self.finalizer1() # possibly-overriden method + def finalizer1(self): llop.gc__collect(lltype.Void) b.num_deleted += 1 C() C() class C(A): - def __del__(self): + def finalizer1(self): b.num_deleted += 1 b.num_deleted_c += 1 def f(x, y): @@ -504,7 +470,7 @@ def test_collect_during_collect(self): run = self.runner("collect_during_collect") # runs collect recursively 4 times - res = run([4, 42]) #XXX pure lazyness here too + res = run([4, 42]) assert res == 12 def define_collect_0(cls): @@ -782,8 +748,7 @@ if op.opname == 'do_malloc_fixedsize_clear': op.args = [Constant(type_id, llgroup.HALFWORD), Constant(llmemory.sizeof(P), lltype.Signed), - Constant(False, lltype.Bool), # has_finalizer - Constant(False, lltype.Bool), # is_finalizer_light + Constant(False, lltype.Bool), # has_destructor Constant(False, lltype.Bool)] # contains_weakptr break else: @@ -819,8 +784,7 @@ if op.opname == 'do_malloc_fixedsize_clear': op.args = [Constant(type_id, llgroup.HALFWORD), Constant(llmemory.sizeof(P), lltype.Signed), - Constant(False, lltype.Bool), # has_finalizer - Constant(False, lltype.Bool), # is_finalizer_light + Constant(False, lltype.Bool), # has_destructor Constant(False, lltype.Bool)] # contains_weakptr break else: _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit