diff --git a/test/bytecode_3.6/01_named_and_kwargs.pyc b/test/bytecode_3.6/01_named_and_kwargs.pyc new file mode 100644 index 00000000..4fa92e31 Binary files /dev/null and b/test/bytecode_3.6/01_named_and_kwargs.pyc differ diff --git a/uncompyle6/semantics/make_function.py b/uncompyle6/semantics/make_function.py index 0391d368..b60811b7 100644 --- a/uncompyle6/semantics/make_function.py +++ b/uncompyle6/semantics/make_function.py @@ -491,8 +491,9 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None): else: if self.version < 3.6: defparams = node[:args_node.attr] + kw_args = 0 else: - default, kw, annotate, closure = args_node.attr + default, kw_args, annotate, closure = args_node.attr if default: assert node[0] == 'expr', "expecting mkfunc default node to be an expr" expr_node = node[0] @@ -504,8 +505,6 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None): else: defparams = [] # FIXME: handle kw, annotate and closure - - kw_args = 0 pass @@ -586,16 +585,9 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None): else: self.write(", ") - if not 3.0 <= self.version <= 3.2: - for n in node: - if n == 'pos_arg': - continue - elif self.version >= 3.4 and not (n.kind in ('kwargs', 'kwargs1', 'kwarg')): - continue - else: - self.preorder(n) - break - else: + # FIXME: this is not correct for 3.5. or 3.6 (which works different) + # and 3.7? + if 3.0 <= self.version <= 3.2: kwargs = node[0] last = len(kwargs)-1 i = 0 @@ -605,10 +597,37 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None): self.preorder(n[1]) if i < last: self.write(', ') + pass i += 1 pass pass pass + elif self.version <= 3.5: + # FIXME this is not qute right for 3.5 + for n in node: + if n == 'pos_arg': + continue + elif self.version >= 3.4 and not (n.kind in ('kwargs', 'kwargs1', 'kwarg')): + continue + else: + self.preorder(n) + break + elif self.version >= 3.6: + d = node[1] + if d == 'expr': + d = d[0] + assert d == 'dict' + defaults = [self.traverse(n, indent='') for n in d[:-2]] + names = eval(self.traverse(d[-2])) + assert len(defaults) == len(names) + sep = '' + # FIXME: possibly handle line breaks + for i, n in enumerate(names): + self.write(sep) + self.write("%s=%s" % (n, defaults[i])) + sep = ', ' + pass + pass pass if code_has_star_star_arg(code): diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 63af9414..99fdd188 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -568,8 +568,17 @@ class SourceWalker(GenericASTTraversal, object): self.n_build_tuple_unpack_with_call = build_unpack_tuple_with_call def build_unpack_map_with_call(node): - sep = '**' - for n in node[:-1]: + n = node[0] + if n == 'expr': + n = n[0] + if n == 'dict': + self.call36_dict(n) + first = 1 + sep = ', **' + else: + first = 0 + sep = '**' + for n in node[first:-1]: self.f.write(sep) self.preorder(n) sep = ', **'