[pypy-svn] r23207 - pypy/dist/pypy/rpython/memory
mwh at codespeak.net
mwh at codespeak.net
Fri Feb 10 15:41:12 CET 2006
Author: mwh
Date: Fri Feb 10 15:41:11 2006
New Revision: 23207
Modified:
pypy/dist/pypy/rpython/memory/gctransform.py
Log:
make the decref graphs operate on Addresses, like everything else in the world
(actually makes the code a bit simpler).
Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py (original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py Fri Feb 10 15:41:11 2006
@@ -220,6 +220,18 @@
elif isinstance(TYPE, lltype.Ptr):
yield ' '*depth + 'pop_alive(%s)'%v
+## def print_call_chain(ob):
+## import sys
+## f = sys._getframe(1)
+## stack = []
+## while f:
+## if f.f_locals.get('self') is ob:
+## stack.append((f.f_code.co_name, f.f_locals.get('TYPE')))
+## f = f.f_back
+## stack.reverse()
+## for i, (a, b) in enumerate(stack):
+## print ' '*i, a, repr(b)[:100-i-len(a)], id(b)
+
class RefcountingGCTransformer(GCTransformer):
gc_header_offset = gc.GCHeaderOffset(lltype.Struct("header", ("refcount", lltype.Signed)))
@@ -251,11 +263,14 @@
def pop_alive_nopyobj(self, var):
PTRTYPE = var.concretetype
+ adr1 = varoftype(llmemory.Address)
+ result = [SpaceOperation("cast_ptr_to_adr", [var], adr1)]
decref_graph = self.decref_graph_for_type(PTRTYPE.TO)
- FUNC = lltype.FuncType([PTRTYPE], lltype.Void)
+ FUNC = lltype.FuncType([llmemory.Address], lltype.Void)
const_fptr = rmodel.inputconst(
lltype.Ptr(FUNC), lltype.functionptr(FUNC, decref_graph.name, graph=decref_graph))
- return [SpaceOperation("direct_call", [const_fptr, var], varoftype(lltype.Void))]
+ result.append(SpaceOperation("direct_call", [const_fptr, adr1], varoftype(lltype.Void)))
+ return result
def replace_setfield(self, op):
if not var_needsgc(op.args[2]):
@@ -293,6 +308,7 @@
def static_deallocation_graph_for_type(self, TYPE):
if TYPE in self.static_deallocator_graphs:
return self.static_deallocator_graphs[TYPE]
+ #print_call_chain(self)
PTRS = find_gc_ptrs_in_type(TYPE)
def compute_pop_alive_ll_ops(hop):
hop.llops.extend(self.pop_alive(hop.args_v[1]))
@@ -415,24 +431,22 @@
const_funcptr = rmodel.inputconst(lltype.Ptr(FUNC),
lltype.functionptr(FUNC, graph.name, graph=graph))
def compute_destructor_ll_ops(hop):
- assert hop.args_v[1].concretetype.TO == TYPE
- addr = hop.genop("cast_ptr_to_adr", [hop.args_v[1]], resulttype=llmemory.Address)
- return hop.genop("direct_call", [const_funcptr, addr],
+ assert hop.args_v[1].concretetype == llmemory.Address
+ return hop.genop("direct_call", [const_funcptr, hop.args_v[1]],
resulttype=lltype.Void)
def destructor(var):
pass
destructor.compute_ll_ops = compute_destructor_ll_ops
destructor.llresult = lltype.Void
- def decref(obj):
- if not obj:
+ def decref(addr):
+ if not addr:
return
- objadr = objectmodel.cast_ptr_to_adr(obj)
- gcheader = objadr - RefcountingGCTransformer.gc_header_offset
+ gcheader = addr - RefcountingGCTransformer.gc_header_offset
refcount = gcheader.signed[0] - 1
gcheader.signed[0] = refcount
if refcount == 0:
- destructor(obj)
- g = self.translator.rtyper.annotate_helper(decref, [lltype.Ptr(TYPE)])
+ destructor(addr)
+ g = self.translator.rtyper.annotate_helper(decref, [llmemory.Address])
# the produced deallocator graph does not need to be transformed
self.seen_graphs[g] = True
self.decref_graphs[TYPE] = g
More information about the Pypy-commit
mailing list