[pypy-svn] r32349 - pypy/branch/kill-keepalives/pypy/translator/backendopt
mwh at codespeak.net
mwh at codespeak.net
Fri Sep 15 12:03:55 CEST 2006
Author: mwh
Date: Fri Sep 15 12:03:53 2006
New Revision: 32349
Modified:
pypy/branch/kill-keepalives/pypy/translator/backendopt/malloc.py
Log:
remove some code duplication
Modified: pypy/branch/kill-keepalives/pypy/translator/backendopt/malloc.py
==============================================================================
--- pypy/branch/kill-keepalives/pypy/translator/backendopt/malloc.py (original)
+++ pypy/branch/kill-keepalives/pypy/translator/backendopt/malloc.py Fri Sep 15 12:03:53 2006
@@ -285,15 +285,17 @@
flatten(STRUCT)
assert len(direct_fieldptr_key) <= 1
- def key_for_field_access(S, fldname):
+ def key_for_field_access(S, *fldnames):
if isinstance(S, lltype.FixedSizeArray):
+ assert len(fldnames) == 1, "embedded FixedSizeArrays should be accessed by getinteriorfield"
+ fldname, = fldnames
if not isinstance(fldname, str): # access by index
fldname = 'item%d' % (fldname,)
try:
return direct_fieldptr_key[S, fldname]
except KeyError:
pass
- return S, fldname
+ return (S,) + fldnames
variables_by_block = {}
for block, var in info.variables:
@@ -320,10 +322,10 @@
for arg in op.args[1:]: # should be the first arg only
assert arg not in vars
if op.args and op.args[0] in vars:
- if op.opname in ("getfield", "getarrayitem"):
+ if op.opname in ("getfield", "getarrayitem", "getinteriorfield"):
S = op.args[0].concretetype.TO
- fldname = op.args[1].value
- key = key_for_field_access(S, fldname)
+ fldnames = [a.value for a in op.args[1:]]
+ key = key_for_field_access(S, *fldnames)
if key in accessed_substructs:
c_name = Constant('data', lltype.Void)
newop = SpaceOperation("getfield",
@@ -335,23 +337,10 @@
op.result)
newops.append(newop)
last_removed_access = len(newops)
- elif op.opname == "getinteriorfield":
- S = op.args[0].concretetype.TO
- key = tuple([S] + [a.value for a in op.args[1:]])
- newop = SpaceOperation("same_as",
- [newvarsmap[key]],
- op.result)
- newops.append(newop)
- last_removed_access = len(newops)
- elif op.opname == "setinteriorfield":
+ elif op.opname in ("setfield", "setarrayitem", "setinteriorfield"):
S = op.args[0].concretetype.TO
- key = tuple([S] + [a.value for a in op.args[1:-1]])
- newvarsmap[key] = op.args[-1]
- last_removed_access = len(newops)
- elif op.opname in ("setfield", "setarrayitem"):
- S = op.args[0].concretetype.TO
- fldname = op.args[1].value
- key = key_for_field_access(S, fldname)
+ fldnames = [a.value for a in op.args[1:-1]]
+ key = key_for_field_access(S, *fldnames)
assert key in newvarsmap
if key in accessed_substructs:
c_name = Constant('data', lltype.Void)
@@ -360,7 +349,7 @@
op.result)
newops.append(newop)
else:
- newvarsmap[key] = op.args[2]
+ newvarsmap[key] = op.args[-1]
last_removed_access = len(newops)
elif op.opname in ("same_as", "cast_pointer"):
assert op.result not in vars
More information about the Pypy-commit
mailing list