mirror of
https://github.com/python/cpython.git
synced 2025-09-16 13:47:31 +00:00
Bug #1586448: the compiler module now emits the same bytecode for
list comprehensions as the builtin compiler, using the LIST_APPEND opcode.
This commit is contained in:
parent
2c4fb8d601
commit
5addf70078
2 changed files with 9 additions and 7 deletions
|
@ -573,12 +573,11 @@ class CodeGenerator:
|
|||
def visitListComp(self, node):
|
||||
self.set_lineno(node)
|
||||
# setup list
|
||||
append = "$append%d" % self.__list_count
|
||||
tmpname = "$list%d" % self.__list_count
|
||||
self.__list_count = self.__list_count + 1
|
||||
self.emit('BUILD_LIST', 0)
|
||||
self.emit('DUP_TOP')
|
||||
self.emit('LOAD_ATTR', 'append')
|
||||
self._implicitNameOp('STORE', append)
|
||||
self._implicitNameOp('STORE', tmpname)
|
||||
|
||||
stack = []
|
||||
for i, for_ in zip(range(len(node.quals)), node.quals):
|
||||
|
@ -590,10 +589,9 @@ class CodeGenerator:
|
|||
self.visit(if_, cont)
|
||||
stack.insert(0, (start, cont, anchor))
|
||||
|
||||
self._implicitNameOp('LOAD', append)
|
||||
self._implicitNameOp('LOAD', tmpname)
|
||||
self.visit(node.expr)
|
||||
self.emit('CALL_FUNCTION', 1)
|
||||
self.emit('POP_TOP')
|
||||
self.emit('LIST_APPEND',)
|
||||
|
||||
for start, cont, anchor in stack:
|
||||
if cont:
|
||||
|
@ -604,7 +602,7 @@ class CodeGenerator:
|
|||
self.nextBlock(skip_one)
|
||||
self.emit('JUMP_ABSOLUTE', start)
|
||||
self.startBlock(anchor)
|
||||
self._implicitNameOp('DELETE', append)
|
||||
self._implicitNameOp('DELETE', tmpname)
|
||||
|
||||
self.__list_count = self.__list_count - 1
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue