]> granicus.if.org Git - python/commitdiff
Fix _convert_NAME() so that it doesn't store locals for class bodies.
authorJeremy Hylton <jeremy@alum.mit.edu>
Thu, 30 Aug 2001 20:25:55 +0000 (20:25 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Thu, 30 Aug 2001 20:25:55 +0000 (20:25 +0000)
Fix list comp code generation -- emit GET_ITER instead of Const(0)
after the list.

Add CO_GENERATOR flag to generators.

Get CO_xxx flags from the new module

Lib/compiler/consts.py
Lib/compiler/pyassem.py
Lib/compiler/pycodegen.py
Tools/compiler/compiler/consts.py
Tools/compiler/compiler/pyassem.py
Tools/compiler/compiler/pycodegen.py

index ae3d18d35dcdf1ed2f2e854bcceb3566064a175d..c4a48683db01df220d461273a074ad835e8e45e6 100644 (file)
@@ -1,6 +1,5 @@
-# code flags
-CO_VARARGS = 1
-CO_VARKEYWORDS = 2
+from new import * # import all the CO_xxx flags
+del classobj, code, function, instance, instancemethod, module
 
 # operation flags
 OP_ASSIGN = 'OP_ASSIGN'
index dc016560690e1ed5225a79e230bc8a79d38b128f..c3fa7b7b97e47d2b01e5303b59d76b25c31f08a4 100644 (file)
@@ -7,6 +7,8 @@ import sys
 import types
 
 from compiler import misc
+from compiler.consts import CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, \
+     CO_VARKEYWORDS
 
 def xxx_sort(l):
     l = l[:]
@@ -311,11 +313,6 @@ class Block:
         return contained
 
 # flags for code objects
-CO_OPTIMIZED = 0x0001
-CO_NEWLOCALS = 0x0002
-CO_VARARGS = 0x0004
-CO_VARKEYWORDS = 0x0008
-CO_NESTED = 0x0010
 
 # the FlowGraph is transformed in place; it exists in one of these states
 RAW = "RAW"
@@ -503,7 +500,8 @@ class PyFlowGraph(FlowGraph):
         return self._lookupName(arg, self.names)
 
     def _convert_NAME(self, arg):
-        self._lookupName(arg, self.varnames)
+        if self.klass is None:
+            self._lookupName(arg, self.varnames)
         return self._lookupName(arg, self.names)
     _convert_STORE_NAME = _convert_NAME
     _convert_DELETE_NAME = _convert_NAME
@@ -739,9 +737,8 @@ class StackDepthTracker:
         'DELETE_SUBSCR': -2,
         # PRINT_EXPR?
         'PRINT_ITEM': -1,
-        'LOAD_LOCALS': 1,
         'RETURN_VALUE': -1,
-        'EXEC_STMT': -2,
+        'EXEC_STMT': -3,
         'BUILD_CLASS': -2,
         'STORE_NAME': -1,
         'STORE_ATTR': -2,
@@ -756,6 +753,7 @@ class StackDepthTracker:
         # close enough...
         'SETUP_EXCEPT': 3,
         'SETUP_FINALLY': 3,
+        'FOR_ITER': 1,
         }
     # use pattern match
     patterns = [
index 7a089f09b35a7400198562f5afe7f54ae2f93ae3..4f7603d4a0fe89e338ac0fe64fe003b7eac34b47 100644 (file)
@@ -11,8 +11,9 @@ from cStringIO import StringIO
 from compiler import ast, parse, walk
 from compiler import pyassem, misc, future, symbols
 from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL
-from compiler.pyassem import CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS,\
-     CO_NESTED, TupleArg
+from compiler.consts import CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS,\
+     CO_NESTED, CO_GENERATOR
+from compiler.pyassem import TupleArg
 
 # Do we have Python 1.x or Python 2.x?
 try:
@@ -495,10 +496,10 @@ class CodeGenerator:
         anchor = self.newBlock()
 
         self.visit(node.list)
-        self.visit(ast.Const(0))
+        self.emit('GET_ITER')
         self.nextBlock(start)
         self.emit('SET_LINENO', node.lineno)
-        self.emit('FOR_LOOP', anchor)
+        self.emit('FOR_ITER', anchor)
         self.nextBlock()
         self.visit(node.assign)
         return start, anchor
@@ -1199,6 +1200,8 @@ class NestedFunctionCodeGenerator(AbstractFunctionCode,
         self.__super_init(func, filename, scopes, isLambda, class_name)
         self.graph.setFreeVars(self.scope.get_free_vars())
         self.graph.setCellVars(self.scope.get_cell_vars())
+        if self.scope.generator is not None:
+            self.graph.setFlag(CO_GENERATOR)
 ##        self.graph.setFlag(CO_NESTED)
 
 class AbstractClassCode:
index ae3d18d35dcdf1ed2f2e854bcceb3566064a175d..c4a48683db01df220d461273a074ad835e8e45e6 100644 (file)
@@ -1,6 +1,5 @@
-# code flags
-CO_VARARGS = 1
-CO_VARKEYWORDS = 2
+from new import * # import all the CO_xxx flags
+del classobj, code, function, instance, instancemethod, module
 
 # operation flags
 OP_ASSIGN = 'OP_ASSIGN'
index dc016560690e1ed5225a79e230bc8a79d38b128f..c3fa7b7b97e47d2b01e5303b59d76b25c31f08a4 100644 (file)
@@ -7,6 +7,8 @@ import sys
 import types
 
 from compiler import misc
+from compiler.consts import CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, \
+     CO_VARKEYWORDS
 
 def xxx_sort(l):
     l = l[:]
@@ -311,11 +313,6 @@ class Block:
         return contained
 
 # flags for code objects
-CO_OPTIMIZED = 0x0001
-CO_NEWLOCALS = 0x0002
-CO_VARARGS = 0x0004
-CO_VARKEYWORDS = 0x0008
-CO_NESTED = 0x0010
 
 # the FlowGraph is transformed in place; it exists in one of these states
 RAW = "RAW"
@@ -503,7 +500,8 @@ class PyFlowGraph(FlowGraph):
         return self._lookupName(arg, self.names)
 
     def _convert_NAME(self, arg):
-        self._lookupName(arg, self.varnames)
+        if self.klass is None:
+            self._lookupName(arg, self.varnames)
         return self._lookupName(arg, self.names)
     _convert_STORE_NAME = _convert_NAME
     _convert_DELETE_NAME = _convert_NAME
@@ -739,9 +737,8 @@ class StackDepthTracker:
         'DELETE_SUBSCR': -2,
         # PRINT_EXPR?
         'PRINT_ITEM': -1,
-        'LOAD_LOCALS': 1,
         'RETURN_VALUE': -1,
-        'EXEC_STMT': -2,
+        'EXEC_STMT': -3,
         'BUILD_CLASS': -2,
         'STORE_NAME': -1,
         'STORE_ATTR': -2,
@@ -756,6 +753,7 @@ class StackDepthTracker:
         # close enough...
         'SETUP_EXCEPT': 3,
         'SETUP_FINALLY': 3,
+        'FOR_ITER': 1,
         }
     # use pattern match
     patterns = [
index 7a089f09b35a7400198562f5afe7f54ae2f93ae3..4f7603d4a0fe89e338ac0fe64fe003b7eac34b47 100644 (file)
@@ -11,8 +11,9 @@ from cStringIO import StringIO
 from compiler import ast, parse, walk
 from compiler import pyassem, misc, future, symbols
 from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL
-from compiler.pyassem import CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS,\
-     CO_NESTED, TupleArg
+from compiler.consts import CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS,\
+     CO_NESTED, CO_GENERATOR
+from compiler.pyassem import TupleArg
 
 # Do we have Python 1.x or Python 2.x?
 try:
@@ -495,10 +496,10 @@ class CodeGenerator:
         anchor = self.newBlock()
 
         self.visit(node.list)
-        self.visit(ast.Const(0))
+        self.emit('GET_ITER')
         self.nextBlock(start)
         self.emit('SET_LINENO', node.lineno)
-        self.emit('FOR_LOOP', anchor)
+        self.emit('FOR_ITER', anchor)
         self.nextBlock()
         self.visit(node.assign)
         return start, anchor
@@ -1199,6 +1200,8 @@ class NestedFunctionCodeGenerator(AbstractFunctionCode,
         self.__super_init(func, filename, scopes, isLambda, class_name)
         self.graph.setFreeVars(self.scope.get_free_vars())
         self.graph.setCellVars(self.scope.get_cell_vars())
+        if self.scope.generator is not None:
+            self.graph.setFlag(CO_GENERATOR)
 ##        self.graph.setFlag(CO_NESTED)
 
 class AbstractClassCode: