[pypy-svn] r79751 - pypy/trunk/pypy/rpython/memory/gctransform
cfbolz at codespeak.net
cfbolz at codespeak.net
Thu Dec 2 15:13:53 CET 2010
Author: cfbolz
Date: Thu Dec 2 15:13:51 2010
New Revision: 79751
Modified:
pypy/trunk/pypy/rpython/memory/gctransform/boehm.py
pypy/trunk/pypy/rpython/memory/gctransform/framework.py
pypy/trunk/pypy/rpython/memory/gctransform/refcounting.py
pypy/trunk/pypy/rpython/memory/gctransform/support.py
Log:
issue586 testing
Try to make the error messages of interp-level destructors more helpful by
printing the name of the TYPE and the exception raised.
Modified: pypy/trunk/pypy/rpython/memory/gctransform/boehm.py
==============================================================================
--- pypy/trunk/pypy/rpython/memory/gctransform/boehm.py (original)
+++ pypy/trunk/pypy/rpython/memory/gctransform/boehm.py Thu Dec 2 15:13:51 2010
@@ -120,10 +120,11 @@
fptr = self.annotate_finalizer(d['ll_finalizer'], [llmemory.Address], lltype.Void)
elif destrptr:
EXC_INSTANCE_TYPE = self.translator.rtyper.exceptiondata.lltype_of_exception_value
+ typename = TYPE.__name__
def ll_finalizer(addr):
exc_instance = llop.gc_fetch_exception(EXC_INSTANCE_TYPE)
v = llmemory.cast_adr_to_ptr(addr, DESTR_ARG)
- ll_call_destructor(destrptr, v)
+ ll_call_destructor(destrptr, v, typename)
llop.gc_restore_exception(lltype.Void, exc_instance)
fptr = self.annotate_finalizer(ll_finalizer, [llmemory.Address], lltype.Void)
else:
Modified: pypy/trunk/pypy/rpython/memory/gctransform/framework.py
==============================================================================
--- pypy/trunk/pypy/rpython/memory/gctransform/framework.py (original)
+++ pypy/trunk/pypy/rpython/memory/gctransform/framework.py Thu Dec 2 15:13:51 2010
@@ -1204,9 +1204,10 @@
assert not type_contains_pyobjs(TYPE), "not implemented"
if destrptr:
+ typename = TYPE.__name__
def ll_finalizer(addr):
v = llmemory.cast_adr_to_ptr(addr, DESTR_ARG)
- ll_call_destructor(destrptr, v)
+ ll_call_destructor(destrptr, v, typename)
fptr = self.transformer.annotate_finalizer(ll_finalizer,
[llmemory.Address],
lltype.Void)
Modified: pypy/trunk/pypy/rpython/memory/gctransform/refcounting.py
==============================================================================
--- pypy/trunk/pypy/rpython/memory/gctransform/refcounting.py (original)
+++ pypy/trunk/pypy/rpython/memory/gctransform/refcounting.py Thu Dec 2 15:13:51 2010
@@ -227,7 +227,7 @@
# refcount is at zero, temporarily bump it to 1:
gcheader.refcount = 1
destr_v = cast_pointer(DESTR_ARG, v)
- ll_call_destructor(destrptr, destr_v)
+ ll_call_destructor(destrptr, destr_v, %r)
refcount = gcheader.refcount - 1
gcheader.refcount = refcount
if refcount == 0:
@@ -239,7 +239,7 @@
pop_alive(exc_instance)
# XXX layering of exceptiontransform versus gcpolicy
-""" % (body, TYPE._gckind)
+""" % (TYPE.__name__, body, TYPE._gckind)
else:
call_del = None
body = '\n'.join(_static_deallocator_body_for_type('v', TYPE))
Modified: pypy/trunk/pypy/rpython/memory/gctransform/support.py
==============================================================================
--- pypy/trunk/pypy/rpython/memory/gctransform/support.py (original)
+++ pypy/trunk/pypy/rpython/memory/gctransform/support.py Thu Dec 2 15:13:51 2010
@@ -98,11 +98,15 @@
hop.exception_cannot_occur()
return hop.inputconst(hop.r_result.lowleveltype, hop.s_result.const)
-def ll_call_destructor(destrptr, destr_v):
+def ll_call_destructor(destrptr, destr_v, typename):
try:
destrptr(destr_v)
- except:
+ except Exception, e:
try:
- os.write(2, "a destructor raised an exception, ignoring it\n")
+ os.write(2, "a destructor of type ")
+ os.write(2, typename)
+ os.write(2, " raised an exception ")
+ os.write(2, str(e))
+ os.write(2, " ignoring it\n")
except:
pass
More information about the Pypy-commit
mailing list