You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +08:00
Add Python 3.6 setcomp and another call bug
This commit is contained in:
BIN
test/bytecode_3.6/05_set_comprehension.pyc
Normal file
BIN
test/bytecode_3.6/05_set_comprehension.pyc
Normal file
Binary file not shown.
@@ -54,3 +54,7 @@ def merge(*iterables, key=None, reverse=False):
|
|||||||
|
|
||||||
def __call__(self, *args, **kwds):
|
def __call__(self, *args, **kwds):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# From 3.6.4 shutil
|
||||||
|
def unpack_archive(func, filename, dict, format_info, extract_dir=None):
|
||||||
|
func(filename, extract_dir, **dict(format_info[2]))
|
||||||
|
@@ -165,6 +165,7 @@ def main(in_base, out_base, files, codes, outfile=None,
|
|||||||
|
|
||||||
for filename in files:
|
for filename in files:
|
||||||
infile = os.path.join(in_base, filename)
|
infile = os.path.join(in_base, filename)
|
||||||
|
# print("XXX", infile)
|
||||||
if not os.path.exists(infile):
|
if not os.path.exists(infile):
|
||||||
sys.stderr.write("File '%s' doesn't exist. Skipped\n"
|
sys.stderr.write("File '%s' doesn't exist. Skipped\n"
|
||||||
% infile)
|
% infile)
|
||||||
|
@@ -571,6 +571,7 @@ class Python3Parser(PythonParser):
|
|||||||
|
|
||||||
# This is used in parse36.py as well as here
|
# This is used in parse36.py as well as here
|
||||||
self.seen_LOAD_DICTCOMP = False
|
self.seen_LOAD_DICTCOMP = False
|
||||||
|
self.seen_LOAD_SETCOMP = False
|
||||||
|
|
||||||
|
|
||||||
# Loop over instructions adding custom grammar rules based on
|
# Loop over instructions adding custom grammar rules based on
|
||||||
@@ -806,6 +807,7 @@ class Python3Parser(PythonParser):
|
|||||||
elif opname == 'LOAD_LISTCOMP':
|
elif opname == 'LOAD_LISTCOMP':
|
||||||
self.add_unique_rule("expr ::= listcomp", opname, token.attr, customize)
|
self.add_unique_rule("expr ::= listcomp", opname, token.attr, customize)
|
||||||
elif opname == 'LOAD_SETCOMP':
|
elif opname == 'LOAD_SETCOMP':
|
||||||
|
self.seen_LOAD_SETCOMP = True
|
||||||
# Should this be generalized and put under MAKE_FUNCTION?
|
# Should this be generalized and put under MAKE_FUNCTION?
|
||||||
if has_get_iter_call_function1:
|
if has_get_iter_call_function1:
|
||||||
self.addRule("expr ::= set_comp", nop_func)
|
self.addRule("expr ::= set_comp", nop_func)
|
||||||
|
@@ -107,14 +107,23 @@ class Python36Parser(Python35Parser):
|
|||||||
fstring_single ::= expr FORMAT_VALUE
|
fstring_single ::= expr FORMAT_VALUE
|
||||||
"""
|
"""
|
||||||
self.add_unique_doc_rules(rules_str, customize)
|
self.add_unique_doc_rules(rules_str, customize)
|
||||||
elif opname == 'MAKE_FUNCTION_8' and self.seen_LOAD_DICTCOMP:
|
elif opname == 'MAKE_FUNCTION_8':
|
||||||
# Is there something general going on here?
|
if self.seen_LOAD_DICTCOMP:
|
||||||
rule = """
|
# Is there something general going on here?
|
||||||
dict_comp ::= load_closure LOAD_DICTCOMP LOAD_CONST
|
rule = """
|
||||||
MAKE_FUNCTION_8 expr
|
dict_comp ::= load_closure LOAD_DICTCOMP LOAD_CONST
|
||||||
GET_ITER CALL_FUNCTION_1
|
MAKE_FUNCTION_8 expr
|
||||||
"""
|
GET_ITER CALL_FUNCTION_1
|
||||||
self.addRule(rule, nop_func)
|
"""
|
||||||
|
self.addRule(rule, nop_func)
|
||||||
|
elif self.seen_LOAD_SETCOMP:
|
||||||
|
rule = """
|
||||||
|
set_comp ::= load_closure LOAD_SETCOMP LOAD_CONST
|
||||||
|
MAKE_FUNCTION_8 expr
|
||||||
|
GET_ITER CALL_FUNCTION_1
|
||||||
|
"""
|
||||||
|
self.addRule(rule, nop_func)
|
||||||
|
|
||||||
elif opname == 'BEFORE_ASYNC_WITH':
|
elif opname == 'BEFORE_ASYNC_WITH':
|
||||||
rules_str = """
|
rules_str = """
|
||||||
stmt ::= async_with_stmt
|
stmt ::= async_with_stmt
|
||||||
|
@@ -28,6 +28,7 @@ from xdis.code import iscode
|
|||||||
from uncompyle6.parsers.astnode import AST
|
from uncompyle6.parsers.astnode import AST
|
||||||
from uncompyle6.scanners.tok import Token
|
from uncompyle6.scanners.tok import Token
|
||||||
from uncompyle6.semantics.helper import flatten_list
|
from uncompyle6.semantics.helper import flatten_list
|
||||||
|
from spark_parser.ast import GenericASTTraversalPruningException
|
||||||
|
|
||||||
def customize_for_version(self, is_pypy, version):
|
def customize_for_version(self, is_pypy, version):
|
||||||
if is_pypy:
|
if is_pypy:
|
||||||
@@ -672,7 +673,11 @@ def customize_for_version(self, is_pypy, version):
|
|||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
assert False, "Don't know how to untangle dictionary"
|
self.write("**")
|
||||||
|
try:
|
||||||
|
self.default(node)
|
||||||
|
except GenericASTTraversalPruningException:
|
||||||
|
pass
|
||||||
|
|
||||||
self.prec = p
|
self.prec = p
|
||||||
self.indent_less(INDENT_PER_LEVEL)
|
self.indent_less(INDENT_PER_LEVEL)
|
||||||
|
@@ -536,8 +536,10 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None):
|
|||||||
else:
|
else:
|
||||||
default, kw_args, annotate, closure = args_node.attr
|
default, kw_args, annotate, closure = args_node.attr
|
||||||
if default:
|
if default:
|
||||||
assert node[0] == 'expr', "expecting mkfunc default node to be an expr"
|
|
||||||
expr_node = node[0]
|
expr_node = node[0]
|
||||||
|
if node[0] == 'pos_arg':
|
||||||
|
expr_node = expr_node[0]
|
||||||
|
assert expr_node == 'expr', "expecting mkfunc default node to be an expr"
|
||||||
if (expr_node[0] == 'LOAD_CONST' and
|
if (expr_node[0] == 'LOAD_CONST' and
|
||||||
isinstance(expr_node[0].attr, tuple)):
|
isinstance(expr_node[0].attr, tuple)):
|
||||||
defparams = [repr(a) for a in expr_node[0].attr]
|
defparams = [repr(a) for a in expr_node[0].attr]
|
||||||
|
Reference in New Issue
Block a user