[pypy-commit] pypy py3.5: Fix dict codegen
raffael_t
pypy.commits at gmail.com
Sat Jun 18 16:26:03 EDT 2016
Author: Raffael Tfirst <raffael.tfirst at gmail.com>
Branch: py3.5
Changeset: r85227:58c84b553a11
Date: 2016-06-18 22:25 +0200
http://bitbucket.org/pypy/pypy/changeset/58c84b553a11/
Log: Fix dict codegen
diff --git a/pypy/interpreter/astcompiler/codegen.py b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -1091,30 +1091,34 @@
self.update_position(d.lineno)
containers = 0
elements = 0
+ is_unpacking = False
if d.values:
for i in range(len(d.values)):
- if elements == 0xFFFF:
+ key = d.keys[i]
+ if key is None:
+ is_unpacking = True
+ if elements == 0xFFFF or (elements and is_unpacking):
self.emit_op_arg(ops.BUILD_MAP, elements)
containers += 1
elements = 0
- d.values[i].walkabout(self)
- d.keys[i].walkabout(self)
- elements += 1
+ if is_unpacking:
+ d.values[i].walkabout(self)
+ containers += 1
+ else:
+ d.values[i].walkabout(self)
+ d.keys[i].walkabout(self)
+ elements += 1
if elements or containers == 0:
self.emit_op_arg(ops.BUILD_MAP, elements)
containers += 1
# If there is more than one dict, they need to be merged into
- # a new dict.
- while containers > 1:
+ # a new dict. If there is one dict and it's an unpacking, then
+ #it needs to be copied into a new dict.
+ while containers > 1 or is_unpacking:
oparg = max(containers, 255)
self.emit_op_arg(ops.BUILD_MAP_UNPACK, oparg)
containers -= (oparg - 1)
-
- #def visit_Set(self, s):
- # self.update_position(s.lineno)
- # elt_count = len(s.elts) if s.elts is not None else 0
- # self.visit_sequence(s.elts)
- # self.emit_op_arg(ops.BUILD_SET, elt_count)
+ is_unpacking = 0
def visit_Set(self, s):
self._visit_starunpack(s, s.elts, s.ctx, ops.BUILD_SET, ops.BUILD_SET, ops.BUILD_SET_UNPACK)
More information about the pypy-commit
mailing list