From 11be90758f7253d6dc93dd91f48a20cc39e94f29 Mon Sep 17 00:00:00 2001 From: rocky Date: Fri, 26 Jun 2020 07:17:31 -0400 Subject: [PATCH] Workaround bug detecting MAKE_FUNCTION docstrings --- uncompyle6/semantics/pysource.py | 6 ++++++ uncompyle6/semantics/transform.py | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index f2ca9b5b..a5d4ac83 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -895,6 +895,12 @@ class SourceWalker(GenericASTTraversal, object): doc_node = node[0] if doc_node.attr: docstring = doc_node.attr + if not isinstance(docstring, str): + # FIXME: we have mistakenly tagged something as a doc + # string in transform when it isn't one. + # The rule in n_mkfunc is pretty flaky. + self.prune() + return else: docstring = node[0].pattr diff --git a/uncompyle6/semantics/transform.py b/uncompyle6/semantics/transform.py index f4b6223b..e01220ee 100644 --- a/uncompyle6/semantics/transform.py +++ b/uncompyle6/semantics/transform.py @@ -95,10 +95,18 @@ class TreeTransform(GenericASTTraversal, object): code = find_code_node(node, code_index).attr + mkfunc_pattr = node[-1].pattr + if isinstance(mkfunc_pattr, tuple): + assert len(mkfunc_pattr, 4) and isinstance(mkfunc_pattr, int) + is_closure = node[-1].pattr[3] != 0 + else: + # FIXME: This is what we had before. It is hoaky and probably wrong. + is_closure = mkfunc_pattr == "closure" + if ( - node[-1].pattr != "closure" + (not is_closure) and len(code.co_consts) > 0 - and code.co_consts[0] is not None + and isinstance(code.co_consts[0], str) ): docstring_node = SyntaxTree( "docstring", [Token("LOAD_STR", has_arg=True, pattr=code.co_consts[0])]