[pypy-svn] r47201 - pypy/branch/kill-keepalives-again/pypy/rpython/memory/gctransform
cfbolz at codespeak.net
cfbolz at codespeak.net
Fri Oct 5 20:58:29 CEST 2007
Author: cfbolz
Date: Fri Oct 5 20:58:29 2007
New Revision: 47201
Modified:
pypy/branch/kill-keepalives-again/pypy/rpython/memory/gctransform/framework.py
Log:
resolve this XXX by correctly generating bare_setinteriorfields
Modified: pypy/branch/kill-keepalives-again/pypy/rpython/memory/gctransform/framework.py
==============================================================================
--- pypy/branch/kill-keepalives-again/pypy/rpython/memory/gctransform/framework.py (original)
+++ pypy/branch/kill-keepalives-again/pypy/rpython/memory/gctransform/framework.py Fri Oct 5 20:58:29 2007
@@ -686,20 +686,22 @@
return llmemory.offsetof(WEAKREF, "weakptr")
return -1
-def gen_zero_gc_pointers(TYPE, v, llops):
+def gen_zero_gc_pointers(TYPE, v, llops, previous_steps=None):
+ if previous_steps is None:
+ previous_steps = []
assert isinstance(TYPE, lltype.Struct)
for name in TYPE._names:
+ c_name = rmodel.inputconst(lltype.Void, name)
FIELD = getattr(TYPE, name)
if isinstance(FIELD, lltype.Ptr) and FIELD._needsgc():
- c_name = rmodel.inputconst(lltype.Void, name)
c_null = rmodel.inputconst(FIELD, lltype.nullptr(FIELD.TO))
- llops.genop('bare_setfield', [v, c_name, c_null])
+ if not previous_steps:
+ llops.genop('bare_setfield', [v, c_name, c_null])
+ else:
+ llops.genop('bare_setinteriorfield',
+ [v] + previous_steps + [c_name, c_null])
elif isinstance(FIELD, lltype.Struct):
- c_name = rmodel.inputconst(lltype.Void, name)
- XXX # should use 'setinteriorfield'
- v1 = llops.genop('getsubstruct', [v, c_name],
- resulttype = lltype.Ptr(FIELD))
- gen_zero_gc_pointers(FIELD, v1, llops)
+ gen_zero_gc_pointers(FIELD, v, llops, previous_steps + [c_name])
def gc_pointers_inside(v, adr):
t = lltype.typeOf(v)
More information about the pypy-svn
mailing list