You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +08:00
Merge branch 'master' into python-2.4
This commit is contained in:
BIN
test/bytecode_3.6/03_build_tuple_call.pyc
Normal file
BIN
test/bytecode_3.6/03_build_tuple_call.pyc
Normal file
Binary file not shown.
Binary file not shown.
@@ -17,3 +17,10 @@ x = f"{k}={v!r}"
|
||||
y = f"functools.{x}({', '.join(v)})"
|
||||
assert x == "1=['2']"
|
||||
assert y == "functools.1=['2'](2)"
|
||||
|
||||
# From 3.6 http/client.py
|
||||
# Bug is in handling X
|
||||
chunk = ['a', 'b', 'c']
|
||||
chunk2 = 'd'
|
||||
chunk = f'{len(chunk):X}' + chunk2
|
||||
assert chunk == '3d'
|
||||
|
4
test/simple_source/bug36/03_build_tuple_call.py
Normal file
4
test/simple_source/bug36/03_build_tuple_call.py
Normal file
@@ -0,0 +1,4 @@
|
||||
# From Python 3.6.5 email/message.py
|
||||
# Bug is in handling 'related' parameter
|
||||
def add_related(self, *args, **kw):
|
||||
self._add_multipart('related', *args, _disp='inline', **kw)
|
@@ -40,6 +40,8 @@ class Python36Parser(Python35Parser):
|
||||
|
||||
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt
|
||||
JUMP_BACK come_froms POP_BLOCK COME_FROM_LOOP
|
||||
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt
|
||||
come_froms JUMP_BACK come_froms POP_BLOCK COME_FROM_LOOP
|
||||
|
||||
# 3.6 due to jump optimization, we sometimes add RETURN_END_IF where
|
||||
# RETURN_VALUE is meant. Specifcally this can happen in
|
||||
@@ -53,6 +55,8 @@ class Python36Parser(Python35Parser):
|
||||
and ::= expr jmp_false expr jmp_false
|
||||
|
||||
jf_cf ::= JUMP_FORWARD COME_FROM
|
||||
cf_jf_else ::= come_froms JUMP_FORWARD ELSE
|
||||
|
||||
conditional ::= expr jmp_false expr jf_cf expr COME_FROM
|
||||
|
||||
async_for_stmt ::= SETUP_LOOP expr
|
||||
@@ -102,6 +106,7 @@ class Python36Parser(Python35Parser):
|
||||
|
||||
jb_cfs ::= JUMP_BACK come_froms
|
||||
ifelsestmtl ::= testexpr c_stmts_opt jb_cfs else_suitel
|
||||
ifelsestmtl ::= testexpr c_stmts_opt cf_jf_else else_suitel
|
||||
|
||||
# In 3.6+, A sequence of statements ending in a RETURN can cause
|
||||
# JUMP_FORWARD END_FINALLY to be omitted from try middle
|
||||
@@ -178,8 +183,21 @@ class Python36Parser(Python35Parser):
|
||||
self.add_unique_doc_rules(rules_str, customize)
|
||||
elif opname == 'FORMAT_VALUE':
|
||||
rules_str = """
|
||||
expr ::= fstring_single
|
||||
fstring_single ::= expr FORMAT_VALUE
|
||||
expr ::= fstring_single
|
||||
fstring_single ::= expr FORMAT_VALUE
|
||||
expr ::= fstring_expr
|
||||
fstring_expr ::= expr FORMAT_VALUE
|
||||
|
||||
str ::= LOAD_CONST
|
||||
formatted_value ::= fstring_expr
|
||||
formatted_value ::= str
|
||||
|
||||
"""
|
||||
self.add_unique_doc_rules(rules_str, customize)
|
||||
elif opname == 'FORMAT_VALUE_ATTR':
|
||||
rules_str = """
|
||||
expr ::= fstring_single
|
||||
fstring_single ::= expr expr FORMAT_VALUE_ATTR
|
||||
"""
|
||||
self.add_unique_doc_rules(rules_str, customize)
|
||||
elif opname == 'MAKE_FUNCTION_8':
|
||||
@@ -227,12 +245,6 @@ class Python36Parser(Python35Parser):
|
||||
v = token.attr
|
||||
joined_str_n = "formatted_value_%s" % v
|
||||
rules_str = """
|
||||
expr ::= fstring_expr
|
||||
fstring_expr ::= expr FORMAT_VALUE
|
||||
str ::= LOAD_CONST
|
||||
formatted_value ::= fstring_expr
|
||||
formatted_value ::= str
|
||||
|
||||
expr ::= fstring_multi
|
||||
fstring_multi ::= joined_str BUILD_STRING
|
||||
joined_str ::= formatted_value+
|
||||
|
@@ -33,8 +33,11 @@ class Scanner36(Scanner3):
|
||||
pass
|
||||
elif t.op == self.opc.CALL_FUNCTION_KW:
|
||||
t.kind = 'CALL_FUNCTION_KW_%s' % t.attr
|
||||
elif t.op == self.opc.BUILD_MAP_UNPACK_WITH_CALL:
|
||||
t.kind = 'CALL_FUNCTION_KW_%d' % t.attr
|
||||
elif t.op == self.opc.FORMAT_VALUE:
|
||||
if (t.attr & 0x4):
|
||||
t.kind = 'FORMAT_VALUE_ATTR'
|
||||
pass
|
||||
>>>>>>> master
|
||||
elif ( not_pypy36 and
|
||||
t.op == self.opc.BUILD_MAP_UNPACK_WITH_CALL ):
|
||||
t.kind = 'BUILD_MAP_UNPACK_WITH_CALL_%d' % t.attr
|
||||
|
@@ -124,8 +124,13 @@ def customize_for_version36(self, version):
|
||||
tup = btuwc[0]
|
||||
if tup == 'expr':
|
||||
tup = tup[0]
|
||||
assert tup == 'tuple'
|
||||
self.call36_tuple(tup)
|
||||
|
||||
if tup == 'LOAD_CONST':
|
||||
self.write(', '.join(['"%s"' % t.replace('"','\\"') for t in tup.attr]))
|
||||
else:
|
||||
assert tup == 'tuple'
|
||||
self.call36_tuple(tup)
|
||||
|
||||
assert node[2] == 'build_map_unpack_with_call'
|
||||
|
||||
self.write(', ')
|
||||
@@ -319,7 +324,7 @@ def customize_for_version36(self, version):
|
||||
self.call36_dict = call36_dict
|
||||
|
||||
|
||||
FSTRING_CONVERSION_MAP = {1: '!s', 2: '!r', 3: '!a'}
|
||||
FSTRING_CONVERSION_MAP = {1: '!s', 2: '!r', 3: '!a', 'X':':X'}
|
||||
|
||||
def n_except_suite_finalize(node):
|
||||
if node[1] == 'returns' and self.hide_internal:
|
||||
@@ -346,7 +351,12 @@ def customize_for_version36(self, version):
|
||||
self.n_formatted_value = n_formatted_value
|
||||
|
||||
def f_conversion(node):
|
||||
node.conversion = FSTRING_CONVERSION_MAP.get(node.data[1].attr, '')
|
||||
fmt_node = node.data[1]
|
||||
if fmt_node == 'expr' and fmt_node[0] == 'LOAD_CONST':
|
||||
data = fmt_node[0].attr
|
||||
else:
|
||||
data = fmt_node
|
||||
node.conversion = FSTRING_CONVERSION_MAP.get(data, '')
|
||||
|
||||
def fstring_expr(node):
|
||||
f_conversion(node)
|
||||
|
Reference in New Issue
Block a user