[pypy-svn] r32958 - pypy/dist/pypy/translator/cli
antocuni at codespeak.net
antocuni at codespeak.net
Fri Oct 6 15:54:57 CEST 2006
Author: antocuni
Date: Fri Oct 6 15:54:56 2006
New Revision: 32958
Modified:
pypy/dist/pypy/translator/cli/ilgenerator.py
pypy/dist/pypy/translator/cli/stackopt.py
Log:
Declare only local variables effectively used.
Modified: pypy/dist/pypy/translator/cli/ilgenerator.py
==============================================================================
--- pypy/dist/pypy/translator/cli/ilgenerator.py (original)
+++ pypy/dist/pypy/translator/cli/ilgenerator.py Fri Oct 6 15:54:56 2006
@@ -137,9 +137,9 @@
def locals(self, vars):
varlist = ', '.join(['%s %s' % var for var in vars])
- self.write('.locals init (')
- self.write(varlist)
- self.writeline(')')
+ self.code.write('.locals init (')
+ self.code.write(varlist)
+ self.code.writeline(')')
def label(self, lbl):
self.code.writeline()
Modified: pypy/dist/pypy/translator/cli/stackopt.py
==============================================================================
--- pypy/dist/pypy/translator/cli/stackopt.py (original)
+++ pypy/dist/pypy/translator/cli/stackopt.py Fri Oct 6 15:54:56 2006
@@ -29,6 +29,24 @@
def label(self, lbl):
self.pending_ops.append(('LABEL', (lbl,)))
+ def locals(self, vars):
+ self.pending_ops.append(('LOCALS', ()))
+ self.pending_locals = dict([(varname, vartype) for (vartype, varname) in vars])
+
+ def emit_locals(self):
+ # takes only locals used by at least one stloc
+ locals = {}
+ for item in self.pending_ops:
+ if item is None:
+ continue
+ if item[0] == 'stloc':
+ op, (varname,) = item
+ if varname[0] == "'" == varname[-1] == "'":
+ varname = varname[1:-1]
+ locals[varname] = self.pending_locals[varname]
+ vars = [(vartype, varname) for (varname, vartype) in locals.iteritems()]
+ self.super.locals(vars)
+
def _varname(self, op, args):
if op in ('ldloc', 'ldarg', 'stloc'):
return args[0]
@@ -104,6 +122,8 @@
getattr(self.super, method)(*args[1:])
elif opcode == 'LABEL':
self.super.label(*args)
+ elif opcode == 'LOCALS':
+ self.emit_locals()
else:
self.super.opcode(opcode, *args)
self._reset()
More information about the Pypy-commit
mailing list