Commit 5addf700 authored by Georg Brandl's avatar Georg Brandl

Bug #1586448: the compiler module now emits the same bytecode for

list comprehensions as the builtin compiler, using the LIST_APPEND
opcode.
parent 2c4fb8d6
...@@ -573,12 +573,11 @@ class CodeGenerator: ...@@ -573,12 +573,11 @@ class CodeGenerator:
def visitListComp(self, node): def visitListComp(self, node):
self.set_lineno(node) self.set_lineno(node)
# setup list # setup list
append = "$append%d" % self.__list_count tmpname = "$list%d" % self.__list_count
self.__list_count = self.__list_count + 1 self.__list_count = self.__list_count + 1
self.emit('BUILD_LIST', 0) self.emit('BUILD_LIST', 0)
self.emit('DUP_TOP') self.emit('DUP_TOP')
self.emit('LOAD_ATTR', 'append') self._implicitNameOp('STORE', tmpname)
self._implicitNameOp('STORE', append)
stack = [] stack = []
for i, for_ in zip(range(len(node.quals)), node.quals): for i, for_ in zip(range(len(node.quals)), node.quals):
...@@ -590,10 +589,9 @@ class CodeGenerator: ...@@ -590,10 +589,9 @@ class CodeGenerator:
self.visit(if_, cont) self.visit(if_, cont)
stack.insert(0, (start, cont, anchor)) stack.insert(0, (start, cont, anchor))
self._implicitNameOp('LOAD', append) self._implicitNameOp('LOAD', tmpname)
self.visit(node.expr) self.visit(node.expr)
self.emit('CALL_FUNCTION', 1) self.emit('LIST_APPEND',)
self.emit('POP_TOP')
for start, cont, anchor in stack: for start, cont, anchor in stack:
if cont: if cont:
...@@ -604,7 +602,7 @@ class CodeGenerator: ...@@ -604,7 +602,7 @@ class CodeGenerator:
self.nextBlock(skip_one) self.nextBlock(skip_one)
self.emit('JUMP_ABSOLUTE', start) self.emit('JUMP_ABSOLUTE', start)
self.startBlock(anchor) self.startBlock(anchor)
self._implicitNameOp('DELETE', append) self._implicitNameOp('DELETE', tmpname)
self.__list_count = self.__list_count - 1 self.__list_count = self.__list_count - 1
......
...@@ -89,6 +89,10 @@ Core and builtins ...@@ -89,6 +89,10 @@ Core and builtins
Library Library
------- -------
- Bug #1586448: the compiler module now emits the same bytecode for
list comprehensions as the builtin compiler, using the LIST_APPEND
opcode.
- Fix codecs.EncodedFile which did not use file_encoding in 2.5.0, and - Fix codecs.EncodedFile which did not use file_encoding in 2.5.0, and
fix all codecs file wrappers to work correctly with the "with" fix all codecs file wrappers to work correctly with the "with"
statement (bug #1586513). statement (bug #1586513).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment