From 5c2d0484e53e5e93bc6100c98dfa0b540e526ead Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 26 Feb 2018 09:06:02 -0500 Subject: [PATCH] 3.6 MAKE_FUNCTION workarounds Still wrong, but points to diretions for improvements --- test/bytecode_3.6/05_call_star_kw.pyc | Bin 0 -> 286 bytes test/simple_source/bug36/05_call_star_kw.py | 3 ++ uncompyle6/main.py | 1 + uncompyle6/semantics/make_function.py | 52 ++++++++++++++------ 4 files changed, 41 insertions(+), 15 deletions(-) create mode 100644 test/bytecode_3.6/05_call_star_kw.pyc create mode 100644 test/simple_source/bug36/05_call_star_kw.py diff --git a/test/bytecode_3.6/05_call_star_kw.pyc b/test/bytecode_3.6/05_call_star_kw.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcc233f48075a797cd69ca4cc7cebec37ddeb983 GIT binary patch literal 286 zcmXr!<>lHTG9_vX0|UcjAcg}LAj<)Wi^YIM3J5Z$FwJ33VNPLbVTxi%VGU-`WOFNK z1= 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 = ', ' - ends_in_comma = True + # argc = node[-1].attr + # co = node[-3].attr + # argcount = co.co_argcount + # kwonlyargcount = co.co_kwonlyargcount + + free_tup = annotate_dict = kw_dict = default_tup = None + index = 0 + # FIXME: this is woefully wrong + if argc & 8: + free_tup = node[index] + index += 1 + if argc & 4: + kw_dict = node[1] + index += 1 + if argc & 2: + kw_dict = node[index] + index += 1 + if argc & 1: + kw_dict = node[index] + + if kw_dict == 'expr': + kw_dict = kw_dict[0] + + # FIXME: handle free_tup, annotatate_dict, and default_tup + if kw_dict: + assert kw_dict == 'dict' + defaults = [self.traverse(n, indent='') for n in kw_dict[:-2]] + names = eval(self.traverse(kw_dict[-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 = ', ' + ends_in_comma = True + pass pass - pass pass if code_has_star_star_arg(code):