diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index 4f4c19da..44508b15 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -1016,26 +1016,48 @@ class Python3Parser(PythonParser): # Note order of kwargs and pos args changed between 3.3-3.4 if self.version <= 3.2: - rule = "mkfunc ::= %s%s%sload_closure LOAD_CODE %s" % ( - kwargs_str, - "expr " * args_pos, - "expr " * annotate_args, - opname, - ) + if annotate_args > 0: + rule = "mkfunc_annotate ::= %s%s%sannotate_tuple load_closure LOAD_CODE %s" % ( + kwargs_str, + "pos_arg " * args_pos, + "annotate_arg " * (annotate_args - 1), + opname, + ) + else: + rule = "mkfunc ::= %s%sload_closure LOAD_CODE %s" % ( + kwargs_str, + "pos_arg " * args_pos, + opname, + ) elif self.version == 3.3: - rule = "mkfunc ::= %s%s%sload_closure LOAD_CODE LOAD_STR %s" % ( - kwargs_str, - "expr " * args_pos, - "expr " * annotate_args, - opname, - ) + if annotate_args > 0: + rule = "mkfunc_annotate ::= %s%s%sannotate_tuple load_closure LOAD_CODE LOAD_STR %s" % ( + kwargs_str, + "pos_arg " * args_pos, + "annotate_arg " * (annotate_args - 1), + opname, + ) + else: + rule = "mkfunc ::= %s%sload_closure LOAD_CODE LOAD_STR %s" % ( + kwargs_str, + "pos_arg " * args_pos, + opname, + ) + elif self.version >= 3.4: - rule = "mkfunc ::= %s%s%s load_closure LOAD_CODE LOAD_STR %s" % ( - "expr " * args_pos, - kwargs_str, - "expr " * annotate_args, - opname, - ) + if annotate_args > 0: + rule = "mkfunc_annotate ::= %s%s%sannotate_tuple load_closure LOAD_CODE LOAD_STR %s" % ( + "pos_arg " * args_pos, + kwargs_str, + "annotate_arg " * (annotate_args - 1), + opname, + ) + else: + rule = "mkfunc ::= %s%s load_closure LOAD_CODE LOAD_STR %s" % ( + "pos_arg " * args_pos, + kwargs_str, + opname, + ) self.add_unique_rule(rule, opname, token.attr, customize) diff --git a/uncompyle6/semantics/customize3.py b/uncompyle6/semantics/customize3.py index 14987a5c..b38ac8d2 100644 --- a/uncompyle6/semantics/customize3.py +++ b/uncompyle6/semantics/customize3.py @@ -255,12 +255,17 @@ def customize_for_version3(self, version): def n_mkfunc_annotate(node): - if self.version >= 3.3 or node[-2] == 'kwargs': + # Handling EXTENDED_ARG before MAKE_FUNCTION ... + i = -1 if node[-2] == "EXTENDED_ARG" else 0 + + if self.version <= 3.2: + code = node[-2+i] + elif self.version >= 3.3 or node[-2] == 'kwargs': # LOAD_CONST code object .. # LOAD_CONST 'x0' if >= 3.3 # EXTENDED_ARG # MAKE_FUNCTION .. - code = node[-4] + code = node[-3+i] elif node[-3] == 'expr': code = node[-3][0] else: diff --git a/uncompyle6/semantics/make_function.py b/uncompyle6/semantics/make_function.py index 41a832f7..7edf0dbd 100644 --- a/uncompyle6/semantics/make_function.py +++ b/uncompyle6/semantics/make_function.py @@ -73,7 +73,7 @@ def make_function3_annotate(self, node, is_lambda, nested=1, i = -1 j = annotate_last-1 l = -len(node) - while j >= l and node[j].kind in ('annotate_arg' 'annotate_tuple'): + while j >= l and node[j].kind in ('annotate_arg', 'annotate_tuple'): annotate_args[annotate_tup[i]] = node[j][0] i -= 1 j -= 1 @@ -786,6 +786,7 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None): if flag: kw_args[i] = "%s" % kwargs[i] self.write(', '.join(kw_args)) + ends_in_comma = False elif self.version >= 3.6: # argc = node[-1].attr # co = node[-3].attr