[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