summaryrefslogtreecommitdiffstats
path: root/Lib/compiler
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2008-12-17 00:38:28 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2008-12-17 00:38:28 (GMT)
commitd0c3515bc5b31a19d00bfc685d7657ad7d79fa94 (patch)
tree299253e76cf9b66349bdaf0cca8c95da19671c74 /Lib/compiler
parent43caaa09ea364aab6cbd7ede2aa9c3d004a129a5 (diff)
downloadcpython-d0c3515bc5b31a19d00bfc685d7657ad7d79fa94.zip
cpython-d0c3515bc5b31a19d00bfc685d7657ad7d79fa94.tar.gz
cpython-d0c3515bc5b31a19d00bfc685d7657ad7d79fa94.tar.bz2
Issue #2183: Simplify and optimize bytecode for list comprehensions.
Diffstat (limited to 'Lib/compiler')
-rw-r--r--Lib/compiler/pycodegen.py12
1 files changed, 1 insertions, 11 deletions
diff --git a/Lib/compiler/pycodegen.py b/Lib/compiler/pycodegen.py
index 61b9fe9..5d5dca0 100644
--- a/Lib/compiler/pycodegen.py
+++ b/Lib/compiler/pycodegen.py
@@ -570,16 +570,10 @@ class CodeGenerator:
self.nextBlock(end)
# list comprehensions
- __list_count = 0
-
def visitListComp(self, node):
self.set_lineno(node)
# setup list
- tmpname = "$list%d" % self.__list_count
- self.__list_count = self.__list_count + 1
self.emit('BUILD_LIST', 0)
- self.emit('DUP_TOP')
- self._implicitNameOp('STORE', tmpname)
stack = []
for i, for_ in zip(range(len(node.quals)), node.quals):
@@ -591,9 +585,8 @@ class CodeGenerator:
self.visit(if_, cont)
stack.insert(0, (start, cont, anchor))
- self._implicitNameOp('LOAD', tmpname)
self.visit(node.expr)
- self.emit('LIST_APPEND')
+ self.emit('LIST_APPEND', len(node.quals) + 1)
for start, cont, anchor in stack:
if cont:
@@ -604,9 +597,6 @@ class CodeGenerator:
self.nextBlock(skip_one)
self.emit('JUMP_ABSOLUTE', start)
self.startBlock(anchor)
- self._implicitNameOp('DELETE', tmpname)
-
- self.__list_count = self.__list_count - 1
def visitListCompFor(self, node):
start = self.newBlock()