[pypy-svn] r24984 - in pypy/dist/pypy: rpython/memory translator/c
pedronis at codespeak.net
pedronis at codespeak.net
Sat Mar 25 00:07:27 CET 2006
Author: pedronis
Date: Sat Mar 25 00:07:20 2006
New Revision: 24984
Modified:
pypy/dist/pypy/rpython/memory/gctransform.py
pypy/dist/pypy/translator/c/funcgen.py
Log:
try to fix gctransform and PyObject interaction (at least for refcounting). Hackish/quick way. This needs to be done properly on the branch. test_refcount_pyobj passes.
Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py (original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py Sat Mar 25 00:07:20 2006
@@ -273,7 +273,11 @@
def pop_alive_nopyobj(self, var):
return []
-
+ def replace_getfield(self, op, livevars, block): # XXX hackish solution for now
+ getvalop = SpaceOperation("bare_getfield",
+ [op.args[0], op.args[1]], op.result)
+ return [getvalop], []
+
# ----------------------------------------------------------------
def _static_deallocator_body_for_type(v, TYPE, depth=1):
@@ -394,11 +398,15 @@
if not var_needsgc(op.args[2]):
return [op], []
oldval = varoftype(op.args[2].concretetype)
- getoldvalop = SpaceOperation("getfield",
+ getoldvalop = SpaceOperation("bare_getfield",
[op.args[0], op.args[1]], oldval)
result = [getoldvalop]
result.extend(self.push_alive(op.args[2]))
- result.append(op)
+ setvalop = SpaceOperation("bare_setfield",
+ op.args, op.result)
+
+
+ result.append(setvalop)
return result, self.pop_alive(oldval)
def replace_setarrayitem(self, op, livevars, block):
@@ -505,10 +513,10 @@
g, fptr = self.annotate_helper(this, [llmemory.Address], lltype.Void)
# the produced deallocator graph does not need to be transformed
self.seen_graphs[g] = True
- if destrptr:
- # however, the direct_call to the destructor needs to get
- # .cleanup attached
- self.deallocator_graphs_needing_transforming.append(g)
+ #if destrptr:
+ # however, the direct_call to the destructor needs to get
+ # .cleanup attached
+ self.deallocator_graphs_needing_transforming.append(g)
self.static_deallocator_funcptrs[TYPE] = fptr
for p in find_gc_ptrs_in_type(TYPE):
Modified: pypy/dist/pypy/translator/c/funcgen.py
==============================================================================
--- pypy/dist/pypy/translator/c/funcgen.py (original)
+++ pypy/dist/pypy/translator/c/funcgen.py Sat Mar 25 00:07:20 2006
@@ -12,7 +12,7 @@
LOCALVAR = 'l_%s'
# I'm not absolutely sure, so just in case:
-NEED_OLD_EXTRA_REFS = False
+NEED_OLD_EXTRA_REFS = True # we need them for now, should go in the tranformation!
class FunctionCodeGenerator(object):
"""
@@ -453,11 +453,12 @@
return 'if (RPyExceptionOccurred())\n\tFAIL(%s);' % err
# low-level operations
- def generic_get(self, op, sourceexpr):
+ def generic_get(self, op, sourceexpr, bare=False):
T = self.lltypemap(op.result)
newvalue = self.expr(op.result, special_case_void=False)
result = ['%s = %s;' % (newvalue, sourceexpr)]
# need to adjust the refcount of the result only for PyObjects
+ print "BARE", bare
if NEED_OLD_EXTRA_REFS and T == PyObjPtr:
result.append('Py_XINCREF(%s);' % newvalue)
result = '\n'.join(result)
@@ -474,14 +475,17 @@
result = '/* %s */' % result
return result
- def OP_GETFIELD(self, op, err, ampersand=''):
+ def OP_GETFIELD(self, op, err, ampersand='', bare=False):
assert isinstance(op.args[1], Constant)
STRUCT = self.lltypemap(op.args[0]).TO
structdef = self.db.gettypedefnode(STRUCT)
fieldname = structdef.c_struct_field_name(op.args[1].value)
return self.generic_get(op, '%s%s->%s' % (ampersand,
self.expr(op.args[0]),
- fieldname))
+ fieldname), bare=bare)
+
+ def OP_BARE_GETFIELD(self, op, err, ampersand=''):
+ return self.OP_GETFIELD(op, err, ampersand, bare=True)
def OP_SETFIELD(self, op, err):
assert isinstance(op.args[1], Constant)
@@ -491,6 +495,8 @@
return self.generic_set(op, '%s->%s' % (self.expr(op.args[0]),
fieldname))
+ OP_BARE_SETFIELD = OP_SETFIELD
+
def OP_GETSUBSTRUCT(self, op, err):
return self.OP_GETFIELD(op, err, ampersand='&')
More information about the Pypy-commit
mailing list