X Tutup
Skip to content

Commit dcbf8d2

Browse files
committed
Bug in 3.5 constant map parsing
1 parent b52badd commit dcbf8d2

File tree

3 files changed

+42
-34
lines changed

3 files changed

+42
-34
lines changed

uncompyle6/parsers/parse3.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,12 @@ def add_custom_rules(self, tokens, customize):
615615
elif opname_base in ('BUILD_LIST', 'BUILD_TUPLE', 'BUILD_SET'):
616616
rule = 'build_list ::= ' + 'expr ' * token.attr + opname
617617
self.add_unique_rule(rule, opname, token.attr, customize)
618+
elif self.version >= 3.5 and opname_base == 'BUILD_MAP':
619+
kvlist_n = "kvlist_%s" % token.attr
620+
rule = kvlist_n + ' ::= ' + 'expr ' * (token.attr*2)
621+
self.add_unique_rule(rule, opname, token.attr, customize)
622+
rule = "mapexpr ::= %s %s" % (kvlist_n, opname)
623+
self.add_unique_rule(rule, opname, token.attr, customize)
618624
elif opname_base in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE'):
619625
rule = 'unpack ::= ' + opname + ' designator' * token.attr
620626
self.add_unique_rule(rule, opname, token.attr, customize)

uncompyle6/scanners/scanner35.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from array import array
1515
import uncompyle6.scanners.scanner3 as scan3
1616

17-
from uncompyle6 import PYTHON_VERSION
1817
from uncompyle6.code import iscode
1918
from uncompyle6.scanner import Token
2019

@@ -29,13 +28,10 @@
2928

3029
class Scanner35(scan3.Scanner3):
3130

32-
def disassemble(self, co, classname=None, code_objects={}):
33-
fn = self.disassemble_built_in if PYTHON_VERSION == 3.4 \
34-
else self.disassemble_generic
35-
return fn(co, classname, code_objects=code_objects)
36-
37-
def disassemble_built_in(self, co, classname=None,
38-
code_objects={}):
31+
# Note: we can't use built-in disassembly routines, unless
32+
# we do post-processing like we do here.
33+
def disassemble(self, co, classname=None,
34+
code_objects={}):
3935
# Container for tokens
4036
tokens = []
4137
customize = {}
@@ -116,17 +112,11 @@ def unmangle(name):
116112
pattr = const
117113
pass
118114
elif opname in ('BUILD_LIST', 'BUILD_TUPLE', 'BUILD_SET', 'BUILD_SLICE',
115+
'BUILD_MAP',
119116
'UNPACK_SEQUENCE',
120117
'MAKE_FUNCTION', 'MAKE_CLOSURE',
121118
'DUP_TOPX', 'RAISE_VARARGS'
122119
):
123-
# if opname == 'BUILD_TUPLE' and \
124-
# self.code[self.prev[offset]] == LOAD_CLOSURE:
125-
# continue
126-
# else:
127-
# op_name = '%s_%d' % (op_name, oparg)
128-
# if opname != BUILD_SLICE:
129-
# customize[op_name] = oparg
130120
opname = '%s_%d' % (opname, inst.argval)
131121
if inst.opname != 'BUILD_SLICE':
132122
customize[opname] = inst.argval

uncompyle6/semantics/pysource.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@
8181
minint = -sys.maxsize-1
8282
maxint = sys.maxsize
8383
else:
84-
from itertools import izip_longest as zip_longest
8584
from StringIO import StringIO
8685
minint = -sys.maxint-1
8786
maxint = sys.maxint
@@ -1148,29 +1147,42 @@ def n_mapexpr(self, node):
11481147
"""
11491148
p = self.prec
11501149
self.prec = 100
1151-
assert node[-1] == 'kvlist'
1152-
node = node[-1] # goto kvlist
11531150

11541151
self.indentMore(INDENT_PER_LEVEL)
11551152
line_seperator = ',\n' + self.indent
11561153
sep = INDENT_PER_LEVEL[:-1]
11571154
self.write('{')
1158-
for kv in node:
1159-
assert kv in ('kv', 'kv2', 'kv3')
1160-
# kv ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR
1161-
# kv2 ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR
1162-
# kv3 ::= expr expr STORE_MAP
1163-
if kv == 'kv':
1164-
name = self.traverse(kv[-2], indent='')
1165-
value = self.traverse(kv[1], indent=self.indent+(len(name)+2)*' ')
1166-
elif kv == 'kv2':
1167-
name = self.traverse(kv[1], indent='')
1168-
value = self.traverse(kv[-3], indent=self.indent+(len(name)+2)*' ')
1169-
elif kv == 'kv3':
1170-
name = self.traverse(kv[-2], indent='')
1171-
value = self.traverse(kv[0], indent=self.indent+(len(name)+2)*' ')
1172-
self.write(sep, name, ': ', value)
1173-
sep = line_seperator
1155+
1156+
if node[0].type.startswith('kvlist'):
1157+
# Python 3.5 style key/value list in mapexpr
1158+
l = list(node[0])
1159+
i = 0
1160+
while i < len(l):
1161+
name = self.traverse(l[i], indent='')
1162+
value = self.traverse(l[i+1], indent=self.indent+(len(name)+2)*' ')
1163+
self.write(sep, name, ': ', value)
1164+
sep = line_seperator
1165+
i += 2
1166+
else:
1167+
assert node[-1] == 'kvlist'
1168+
node = node[-1] # goto kvlist
1169+
1170+
for kv in node:
1171+
assert kv in ('kv', 'kv2', 'kv3')
1172+
# kv ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR
1173+
# kv2 ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR
1174+
# kv3 ::= expr expr STORE_MAP
1175+
if kv == 'kv':
1176+
name = self.traverse(kv[-2], indent='')
1177+
value = self.traverse(kv[1], indent=self.indent+(len(name)+2)*' ')
1178+
elif kv == 'kv2':
1179+
name = self.traverse(kv[1], indent='')
1180+
value = self.traverse(kv[-3], indent=self.indent+(len(name)+2)*' ')
1181+
elif kv == 'kv3':
1182+
name = self.traverse(kv[-2], indent='')
1183+
value = self.traverse(kv[0], indent=self.indent+(len(name)+2)*' ')
1184+
self.write(sep, name, ': ', value)
1185+
sep = line_seperator
11741186
self.write('}')
11751187
self.indentLess(INDENT_PER_LEVEL)
11761188
self.prec = p

0 commit comments

Comments
 (0)
X Tutup