[pypy-svn] r32246 - in pypy/branch/more-gckinds/pypy: rpython/memory translator/c
mwh at codespeak.net
mwh at codespeak.net
Wed Sep 13 11:21:30 CEST 2006
Author: mwh
Date: Wed Sep 13 11:21:29 2006
New Revision: 32246
Modified:
pypy/branch/more-gckinds/pypy/rpython/memory/gctransform.py
pypy/branch/more-gckinds/pypy/translator/c/funcgen.py
Log:
gctransform and genc support for {get,set}interiorfield.
only 5 genc tests fail, not bad.
i think i may have actually made gctransform cleaner in the process...
Modified: pypy/branch/more-gckinds/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/branch/more-gckinds/pypy/rpython/memory/gctransform.py (original)
+++ pypy/branch/more-gckinds/pypy/rpython/memory/gctransform.py Wed Sep 13 11:21:29 2006
@@ -258,28 +258,18 @@
raise NotImplementedError("gc_protect does not make sense for this gc")
def replace_setfield(self, op, livevars, block):
- if not var_ispyobj(op.args[2]):
- return [op]
- oldval = varoftype(op.args[2].concretetype)
- getoldvalop = SpaceOperation("getfield",
- [op.args[0], op.args[1]], oldval)
- result = [getoldvalop]
- result.extend(self.push_alive(op.args[2]))
- result.append(op)
- result.extend(self.pop_alive(oldval))
- return result
-
- def replace_setarrayitem(self, op, livevars, block):
- if not var_ispyobj(op.args[2]):
- return [op]
- oldval = varoftype(op.args[2].concretetype)
- getoldvalop = SpaceOperation("getarrayitem",
- [op.args[0], op.args[1]], oldval)
- result = [getoldvalop]
- result.extend(self.push_alive(op.args[2]))
- result.append(op)
+ if not var_ispyobj(op.args[-1]):
+ return [SpaceOperation("bare_" + op.opname, op.args, op.result)]
+ oldval = varoftype(op.args[-1].concretetype)
+ result = []
+ result.append(SpaceOperation("g" + op.opname[1:],
+ op.args[:-1], oldval))
+ result.extend(self.push_alive(op.args[-1]))
+ result.append(SpaceOperation("bare_" + op.opname, op.args, op.result))
result.extend(self.pop_alive(oldval))
return result
+ replace_setinteriorfield = replace_setfield
+ replace_setarrayitem = replace_setfield
def replace_safe_call(self, op, livevars, block):
return [SpaceOperation("direct_call", op.args, op.result)]
@@ -502,29 +492,20 @@
newops[-1].result = op.result
return newops
- def replace_setfield(self, op, livevars, block):
- if not var_needsgc(op.args[2]):
- return [op]
- oldval = varoftype(op.args[2].concretetype)
- getoldvalop = SpaceOperation("getfield",
- [op.args[0], op.args[1]], oldval)
- result = [getoldvalop]
- result.extend(self.push_alive(op.args[2]))
- result.append(op)
- result.extend(self.pop_alive(oldval))
- return result
- def replace_setarrayitem(self, op, livevars, block):
- if not var_needsgc(op.args[2]):
- return [op]
- oldval = varoftype(op.args[2].concretetype)
- getoldvalop = SpaceOperation("getarrayitem",
- [op.args[0], op.args[1]], oldval)
- result = [getoldvalop]
- result.extend(self.push_alive(op.args[2]))
- result.append(op)
+ def replace_setfield(self, op, livevars, block):
+ if not var_needsgc(op.args[-1]):
+ return [SpaceOperation("bare_" + op.opname, op.args, op.result)]
+ oldval = varoftype(op.args[-1].concretetype)
+ result = []
+ result.append(SpaceOperation("g" + op.opname[1:],
+ op.args[:-1], oldval))
+ result.extend(self.push_alive(op.args[-1]))
+ result.append(SpaceOperation("bare_" + op.opname, op.args, op.result))
result.extend(self.pop_alive(oldval))
return result
+ replace_setinteriorfield = replace_setfield
+ replace_setarrayitem = replace_setfield
## -- maybe add this for tests and for consistency --
## def consider_constant(self, TYPE, value):
Modified: pypy/branch/more-gckinds/pypy/translator/c/funcgen.py
==============================================================================
--- pypy/branch/more-gckinds/pypy/translator/c/funcgen.py (original)
+++ pypy/branch/more-gckinds/pypy/translator/c/funcgen.py Wed Sep 13 11:21:29 2006
@@ -416,9 +416,9 @@
return result
def generic_set(self, op, targetexpr):
- newvalue = self.expr(op.args[2], special_case_void=False)
+ newvalue = self.expr(op.args[-1], special_case_void=False)
result = ['%s = %s;' % (targetexpr, newvalue)]
- T = self.lltypemap(op.args[2])
+ T = self.lltypemap(op.args[-1])
result = '\n'.join(result)
if T is Void:
result = '/* %s */' % result
@@ -432,7 +432,7 @@
op.args[1].value)
return self.generic_get(op, expr)
- def OP_SETFIELD(self, op):
+ def OP_BARE_SETFIELD(self, op):
assert isinstance(op.args[1], Constant)
STRUCT = self.lltypemap(op.args[0]).TO
structdef = self.db.gettypedefnode(STRUCT)
@@ -440,7 +440,7 @@
op.args[1].value)
return self.generic_set(op, expr)
- OP_BARE_SETFIELD = OP_SETFIELD
+ #OP_SETFIELD = OP_BARE_SETFIELD
def OP_GETSUBSTRUCT(self, op):
RESULT = self.lltypemap(op.result).TO
@@ -466,7 +466,7 @@
return self.generic_get(op, '%s[%s]' % (items,
self.expr(op.args[1])))
- def OP_SETARRAYITEM(self, op):
+ def OP_BARE_SETARRAYITEM(self, op):
ARRAY = self.lltypemap(op.args[0]).TO
items = self.expr(op.args[0])
if not isinstance(ARRAY, FixedSizeArray):
@@ -474,6 +474,35 @@
return self.generic_set(op, '%s[%s]' % (items,
self.expr(op.args[1])))
+ def interior_expr(self, args):
+ TYPE = args[0].concretetype.TO
+ expr = '(*(' + self.expr(args[0]) + '))'
+ for arg in args[1:]:
+ defnode = self.db.gettypedefnode(TYPE)
+ if arg.concretetype is Void:
+ fieldname = arg.value
+ expr = defnode.access_expr(expr, fieldname)
+ TYPE = getattr(TYPE, fieldname)
+ else:
+ if not isinstance(TYPE, FixedSizeArray):
+ expr = '(%s).items[%s]'%(expr, self.expr(arg))
+ else:
+ expr = '(%s)[%s]'%(expr, self.expr(arg))
+ TYPE = TYPE.OF
+ return expr
+
+ def OP_GETINTERIORFIELD(self, op):
+ return self.generic_get(op, self.interior_expr(op.args))
+
+ def OP_BARE_SETINTERIORFIELD(self, op):
+ return self.generic_set(op, self.interior_expr(op.args[:-1]))
+
+ def OP_GETINTERIORARRAYSIZE(self, op):
+ expr = self.interior_expr(op.args)
+ return '%s = %s.length;'%(self.expr(op.result), expr)
+
+ #OP_SETINTERIORFIELD = OP_BARE_SETINTERIORFIELD
+
def OP_GETARRAYSUBSTRUCT(self, op):
ARRAY = self.lltypemap(op.args[0]).TO
items = self.expr(op.args[0])
More information about the Pypy-commit
mailing list