diff --git a/test/bytecode_3.3/02_pos_args.pyc b/test/bytecode_3.3/02_pos_args.pyc new file mode 100644 index 00000000..9ababfe6 Binary files /dev/null and b/test/bytecode_3.3/02_pos_args.pyc differ diff --git a/test/bytecode_3.3/03_func_params.pyc b/test/bytecode_3.3/03_func_params.pyc new file mode 100644 index 00000000..3dc04484 Binary files /dev/null and b/test/bytecode_3.3/03_func_params.pyc differ diff --git a/test/simple_source/bug33/02_pos_args.py b/test/simple_source/bug33/02_pos_args.py new file mode 100644 index 00000000..4eb8cc0a --- /dev/null +++ b/test/simple_source/bug33/02_pos_args.py @@ -0,0 +1,3 @@ +# From Python 3.3.6 hmac.py +# Problem was getting wrong placement of positional args +digest_cons = lambda d=b'': 5 diff --git a/test/simple_source/bug33/03_func_params.py b/test/simple_source/bug33/03_func_params.py new file mode 100644 index 00000000..a9356400 --- /dev/null +++ b/test/simple_source/bug33/03_func_params.py @@ -0,0 +1,6 @@ +# Bug from Python 3.3 codecs.py +# Bug is in 3.3 handling of this complicated parameter list +def __new__(cls, encode, decode, streamreader=None, streamwriter=None, + incrementalencoder=None, incrementaldecoder=None, name=None, + *, _is_text_encoding=None): + return diff --git a/uncompyle6/semantics/fragments.py b/uncompyle6/semantics/fragments.py index f1d79132..eec043dc 100644 --- a/uncompyle6/semantics/fragments.py +++ b/uncompyle6/semantics/fragments.py @@ -1609,16 +1609,16 @@ class FragmentsWalker(pysource.SourceWalker, object): args_node = node[-1] if isinstance(args_node.attr, tuple): - if self.version == 3.3: + if self.version <= 3.3 and len(node) > 2 and node[-3] != 'LOAD_LAMBDA': # positional args are after kwargs defparams = node[1:args_node.attr[0]+1] else: # positional args are before kwargs defparams = node[:args_node.attr[0]] - pos_aargs, kw_args, annotate_args = args_node.attr + pos_args, kw_args, annotate_argc = args_node.attr else: defparams = node[:args_node.attr] - kw_args, annotate_args = (0, 0) + kw_args, annotate_argc = (0, 0) pass if self.version > 3.0 and isLambda and iscode(node[-3].attr): diff --git a/uncompyle6/semantics/make_function.py b/uncompyle6/semantics/make_function.py index 5d207ca9..6cdde29c 100644 --- a/uncompyle6/semantics/make_function.py +++ b/uncompyle6/semantics/make_function.py @@ -395,7 +395,7 @@ def make_function3(self, node, isLambda, nested=1, codeNode=None): args_node = node[-1] if isinstance(args_node.attr, tuple): - if self.version <= 3.3: + if self.version <= 3.3 and len(node) > 2 and node[-3] != 'LOAD_LAMBDA': # positional args are after kwargs defparams = node[1:args_node.attr[0]+1] else: