[pypy-svn] r23120 - pypy/dist/pypy/rpython/memory

cfbolz at codespeak.net cfbolz at codespeak.net
Tue Feb 7 19:30:45 CET 2006


Author: cfbolz
Date: Tue Feb  7 19:30:43 2006
New Revision: 23120

Modified:
   pypy/dist/pypy/rpython/memory/gctransform.py
Log:
(mwh, cfbolz):

 * check whether we are dealing with NULL in decref
 * bump the refcount to 1 around the call to the RTTI query function
   in the dynamic deallocator


Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py	Tue Feb  7 19:30:43 2006
@@ -373,8 +373,12 @@
         call_destructor_for_rtti.llresult = lltype.Void
         call_destructor_for_rtti.compute_ll_ops = call_destructor_for_rtti_compute_ops
         def dealloc(addr):
+            # bump refcount to 1
+            gcheader = addr - RefcountingGCTransformer.gc_header_offset
+            gcheader.signed[0] = 1
             v = objectmodel.cast_adr_to_ptr(addr, QUERY_ARG_TYPE)
             rtti = queryptr(v)
+            gcheader.signed[0] = 0
             call_destructor_for_rtti(addr, rtti)
         g = self.translator.rtyper.annotate_helper(dealloc, [llmemory.Address])
         self.dynamic_deallocator_graphs[TYPE] = g
@@ -407,6 +411,8 @@
         destructor.compute_ll_ops = compute_destructor_ll_ops
         destructor.llresult = lltype.Void
         def decref(obj):
+            if not obj:
+                return
             objadr = objectmodel.cast_ptr_to_adr(obj)
             gcheader = objadr - RefcountingGCTransformer.gc_header_offset
             refcount = gcheader.signed[0] - 1



More information about the Pypy-commit mailing list