[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