From 76039a229dd349076b395a754667fb85919d9769 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 24 Feb 2024 12:11:54 -0500 Subject: [PATCH 1/3] Go over 2.6 excludes --- test/stdlib/2.6-exclude.sh | 28 ++++++++++++++-------------- test/stdlib/runtests.sh | 17 +++++++++++++---- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/test/stdlib/2.6-exclude.sh b/test/stdlib/2.6-exclude.sh index 657c6cf9..5b395032 100644 --- a/test/stdlib/2.6-exclude.sh +++ b/test/stdlib/2.6-exclude.sh @@ -8,23 +8,22 @@ SKIP_TESTS=( # [test_shutil.py]=1 # OK but needs PYTHON=pytest [test___all__.py]=1 # it fails on its own - [test_aepack.py]=1 # it fails on its own - [test_al.py]=1 # it fails on its own - [test_anydbm.py]=1 # it fails on its own - [test_applesingle.py]=1 # it fails on its own - + [test_aepack.py]=1 # No module macostools + [test_al.py]=1 # No module macostools + [test_anydbm.py]=pytest + [test_applesingle.py]=1 # No module macostools [test_bsddb185.py]=1 # it fails on its own [test_bsddb3.py]=1 # it fails on its own - [test_bsddb.py]=1 # it fails on its own + [test_bsddb.py]=1 # No module _bsdb - # [test_cd.py]=1 # it fails on its own + [test_cd.py]=1 # i# No module cl [test_cl.py]=1 # it fails on its own [test_codecmaps_cn.py]=1 # it fails on its own [test_codecmaps_jp.py]=1 # it fails on its own [test_codecmaps_kr.py]=1 # it fails on its own [test_codecmaps_tw.py]=1 # it fails on its own [test_commands.py]=1 # it fails on its own - [test_curses.py]=1 # it fails on its own + [test_curses.py]=1 # needs libncurses.so.5 [test_dbm.py]=1 # it fails on its own [test_descr.py]=1 @@ -33,16 +32,16 @@ SKIP_TESTS=( [test_dl.py]=1 # it fails on its own [test_file.py]=1 # it fails on its own - [test_future5.py]=1 # it fails on its own + [test_future5.py]=pytest - # [test_generators.py]=1 # works but use PYTHON=pytest + [test_generators.py]=pytest [test_gl.py]=1 # it fails on its own - # [test_grp.py]=1 # works but use PYTHON=pytest + [test_grp.py]=pytest [test_imageop.py]=1 # it fails on its own [test_imaplib.py]=1 # it fails on its own [test_imgfile.py]=1 # it fails on its own - # [test_ioctl.py]=1 # works but use PYTHON=pytest + [test_ioctl.py]=pytest [test_kqueue.py]=1 # it fails on its own @@ -63,6 +62,7 @@ SKIP_TESTS=( [test_scriptpackages.py]=1 # it fails on its own [test_select.py]=1 # test takes too long to run: 11 seconds + [test_signal.py]=1 # takes more than 15 seconds to run [test_socket.py]=1 # test takes too long to run: 12 seconds [test_startfile.py]=1 # it fails on its own [test_structmembers.py]=1 # it fails on its own @@ -81,8 +81,8 @@ SKIP_TESTS=( [test_winreg.py]=1 # it fails on its own [test_winsound.py]=1 # it fails on its own - [test_zipimport_support.py]=1 # expected test to raise ImportError - [test_zipfile64.py]=1 # Skip Long test + [test_zipimport_support.py]=pytest # expected test to raise ImportError + [test_zipfile.py]=pytest # Skip Long test # .pyenv/versions/2.6.9/lib/python2.6/lib2to3/refactor.pyc # .pyenv/versions/2.6.9/lib/python2.6/pyclbr.pyc ) diff --git a/test/stdlib/runtests.sh b/test/stdlib/runtests.sh index b0c74644..1fa964ef 100755 --- a/test/stdlib/runtests.sh +++ b/test/stdlib/runtests.sh @@ -187,7 +187,11 @@ if [[ -n $1 ]] ; then files=$@ typeset -a files_ary=( $(echo $@) ) if (( ${#files_ary[@]} == 1 || DONT_SKIP_TESTS == 1 )) ; then - SKIP_TESTS=() + for file in $files; do + if (( SKIP_TESTS[$file] != "pytest" )); then + SKIP_TESTS[$file] = 1; + fi + done fi else files=$(echo test_*.py) @@ -201,9 +205,14 @@ NOT_INVERTED_TESTS=${NOT_INVERTED_TESTS:-1} for file in $files; do # AIX bash doesn't grok [[ -v SKIP... ]] [[ -z ${SKIP_TESTS[$file]} ]] && SKIP_TESTS[$file]=0 - if [[ ${SKIP_TESTS[$file]} == ${NOT_INVERTED_TESTS} ]] ; then - ((skipped++)) - continue + + if [[ ${SKIP_TESTS[$file]} == "pytest" ]]; then + PYTHON=pytest + else + if [[ ${SKIP_TESTS[$file]}s == ${NOT_INVERTED_TESTS} ]] ; then + ((skipped++)) + continue + fi fi # If the fails *before* decompiling, skip it! From d2a171609e3522109c031ff60e65851ac87417ca Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 24 Feb 2024 12:56:30 -0500 Subject: [PATCH 2/3] Remove messed-up show_tree call --- uncompyle6/semantics/make_function36.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/uncompyle6/semantics/make_function36.py b/uncompyle6/semantics/make_function36.py index 863c4995..a976e996 100644 --- a/uncompyle6/semantics/make_function36.py +++ b/uncompyle6/semantics/make_function36.py @@ -17,22 +17,21 @@ All the crazy things we have to do to handle Python functions in 3.6 and above. The saga of changes before 3.6 is in other files. """ from xdis import ( - iscode, + CO_ASYNC_GENERATOR, + CO_GENERATOR, code_has_star_arg, code_has_star_star_arg, - CO_GENERATOR, - CO_ASYNC_GENERATOR, + iscode, ) -from uncompyle6.scanner import Code -from uncompyle6.semantics.parser_error import ParserError + from uncompyle6.parser import ParserError as ParserError2 +from uncompyle6.scanner import Code from uncompyle6.semantics.helper import ( find_all_globals, find_globals_and_nonlocals, find_none, ) - -from uncompyle6.show import maybe_show_tree_param_default +from uncompyle6.semantics.parser_error import ParserError def make_function36(self, node, is_lambda, nested=1, code_node=None): @@ -55,7 +54,6 @@ def make_function36(self, node, is_lambda, nested=1, code_node=None): - handle format tuple parameters """ value = default - maybe_show_tree_param_default(self.showast, name, value) if annotation: result = "%s: %s=%s" % (name, annotation, value) else: @@ -150,7 +148,7 @@ def make_function36(self, node, is_lambda, nested=1, code_node=None): kwonlyargcount = code.co_kwonlyargcount paramnames = list(scanner_code.co_varnames[:argc]) - kwargs = list(scanner_code.co_varnames[argc: argc + kwonlyargcount]) + kwargs = list(scanner_code.co_varnames[argc : argc + kwonlyargcount]) paramnames.reverse() defparams.reverse() @@ -181,7 +179,7 @@ def make_function36(self, node, is_lambda, nested=1, code_node=None): ) ) - for param in paramnames[i + 1:]: + for param in paramnames[i + 1 :]: if param in annotate_dict: params.append("%s: %s" % (param, annotate_dict[param])) else: From 8a1fd7e127311e2dc9829d94c3dde0041bddf8ea Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 24 Feb 2024 17:41:32 -0500 Subject: [PATCH 3/3] Keep optype info in token... It is useful for ADD_VALUE --- test/stdlib/3.6-exclude.sh | 2 +- test/stdlib/3.7-exclude.sh | 2 +- test/stdlib/3.8-exclude.sh | 2 +- test/stdlib/runtests.sh | 2 +- uncompyle6/scanners/scanner3.py | 6 ++++++ uncompyle6/scanners/scanner37.py | 8 +++++--- uncompyle6/scanners/scanner37base.py | 3 +++ uncompyle6/scanners/tok.py | 10 ++++++---- uncompyle6/semantics/consts.py | 6 +++--- uncompyle6/semantics/n_actions.py | 22 +++++++++++++++------- 10 files changed, 42 insertions(+), 21 deletions(-) diff --git a/test/stdlib/3.6-exclude.sh b/test/stdlib/3.6-exclude.sh index 2c186bc6..e7ae174f 100644 --- a/test/stdlib/3.6-exclude.sh +++ b/test/stdlib/3.6-exclude.sh @@ -1,6 +1,6 @@ SKIP_TESTS=( [test_ast.py]=1 # FIXME: Works on c90ff51 - [test_cmath.py]=1 # FIXME: Works on c90ff51 + [test_cmath.py]=1 # fails on its own [test_format.py]=1 # FIXME: Works on c90ff51 [test_ftplib.py]=1 # FIXME: Works on c90ff51 [test_slice.py]=1 # FIXME: Works on c90ff51 diff --git a/test/stdlib/3.7-exclude.sh b/test/stdlib/3.7-exclude.sh index 32d2d342..08462fa4 100644 --- a/test/stdlib/3.7-exclude.sh +++ b/test/stdlib/3.7-exclude.sh @@ -36,7 +36,7 @@ SKIP_TESTS=( [test_bdb.py]=1 # [test_buffer.py]=1 # parse error [test_clinic.py]=1 # it fails on its own - [test_cmath.py]=1 # test assertion failure + [test_cmath.py]=pytest [test_cmd_line.py]=1 # Interactive? [test_cmd_line_script.py]=1 [test_compileall.py]=1 # fails on its own diff --git a/test/stdlib/3.8-exclude.sh b/test/stdlib/3.8-exclude.sh index d8e87b4c..d4393ae9 100644 --- a/test/stdlib/3.8-exclude.sh +++ b/test/stdlib/3.8-exclude.sh @@ -69,7 +69,7 @@ SKIP_TESTS=( [test_cgi.py]=1 # parse error [test_cgitb.py]=1 # parse error [test_clinic.py]=1 # it fails on its own - [test_cmath.py]=1 # test assertion failure + [test_cmath.py]=pytest [test_cmd.py]=1 # parse error [test_cmd_line.py]=1 # Interactive? [test_cmd_line_script.py]=1 diff --git a/test/stdlib/runtests.sh b/test/stdlib/runtests.sh index 1fa964ef..37dd050c 100755 --- a/test/stdlib/runtests.sh +++ b/test/stdlib/runtests.sh @@ -189,7 +189,7 @@ if [[ -n $1 ]] ; then if (( ${#files_ary[@]} == 1 || DONT_SKIP_TESTS == 1 )) ; then for file in $files; do if (( SKIP_TESTS[$file] != "pytest" )); then - SKIP_TESTS[$file] = 1; + SKIP_TESTS[$file]=1; fi done fi diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index 5ac4ab55..3c51c3e6 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -266,6 +266,7 @@ class Scanner3(Scanner): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i): @@ -279,6 +280,7 @@ class Scanner3(Scanner): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=insts[j].optype, ) ) new_tokens.append( @@ -291,6 +293,7 @@ class Scanner3(Scanner): has_arg=t.has_arg, has_extended_arg=False, opc=t.opc, + optype=None, ) ) return new_tokens @@ -339,6 +342,7 @@ class Scanner3(Scanner): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i, 2): @@ -364,6 +368,7 @@ class Scanner3(Scanner): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=insts[j + 1].optype, ) ) new_tokens.append( @@ -376,6 +381,7 @@ class Scanner3(Scanner): has_arg=t.has_arg, has_extended_arg=False, opc=t.opc, + optype=t.optype, ) ) return new_tokens diff --git a/uncompyle6/scanners/scanner37.py b/uncompyle6/scanners/scanner37.py index 1a505e43..ea6db8ac 100644 --- a/uncompyle6/scanners/scanner37.py +++ b/uncompyle6/scanners/scanner37.py @@ -24,12 +24,12 @@ scanner routine for Python 3. from typing import Tuple -from uncompyle6.scanner import CONST_COLLECTIONS, Token -from uncompyle6.scanners.scanner37base import Scanner37Base - # bytecode verification, verify(), uses JUMP_OPs from here from xdis.opcodes import opcode_37 as opc +from uncompyle6.scanner import CONST_COLLECTIONS, Token +from uncompyle6.scanners.scanner37base import Scanner37Base + # bytecode verification, verify(), uses JUMP_OPS from here JUMP_OPs = opc.JUMP_OPS @@ -90,6 +90,7 @@ class Scanner37(Scanner37Base): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i): @@ -103,6 +104,7 @@ class Scanner37(Scanner37Base): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=tokens[j].optype, ) ) new_tokens.append( diff --git a/uncompyle6/scanners/scanner37base.py b/uncompyle6/scanners/scanner37base.py index 7d46b56f..dc9804ed 100644 --- a/uncompyle6/scanners/scanner37base.py +++ b/uncompyle6/scanners/scanner37base.py @@ -355,6 +355,7 @@ class Scanner37Base(Scanner): has_arg=True, opc=self.opc, has_extended_arg=False, + optype=inst.optype, ), ) jump_idx += 1 @@ -426,6 +427,7 @@ class Scanner37Base(Scanner): has_arg=inst.has_arg, opc=self.opc, has_extended_arg=inst.has_extended_arg, + optype=inst.optype, ), ) continue @@ -527,6 +529,7 @@ class Scanner37Base(Scanner): has_arg=inst.has_arg, opc=self.opc, has_extended_arg=inst.has_extended_arg, + optype=inst.optype, ), ) pass diff --git a/uncompyle6/scanners/tok.py b/uncompyle6/scanners/tok.py index 43d54cf4..0e701e97 100644 --- a/uncompyle6/scanners/tok.py +++ b/uncompyle6/scanners/tok.py @@ -61,17 +61,19 @@ class Token: opname, attr=None, pattr=None, - offset:Union[int, str]=-1, + offset: Union[int, str] = -1, linestart=None, op=None, has_arg=None, opc=None, has_extended_arg=False, + optype=None, ): self.kind = intern(opname) self.has_arg = has_arg self.attr = attr self.pattr = pattr + self.optype = optype if has_extended_arg: self.offset = "%d_%d" % (offset, offset + 2) else: @@ -107,8 +109,8 @@ class Token: self.op = op def __eq__(self, o): - """ '==' on kind and "pattr" attributes. - It is okay if offsets and linestarts are different""" + """'==' on kind and "pattr" attributes. + It is okay if offsets and linestarts are different""" if isinstance(o, Token): return (self.kind == o.kind) and ( (self.pattr == o.pattr) or self.attr == o.attr @@ -118,7 +120,7 @@ class Token: return self.kind == o def __ne__(self, o): - """ '!=', but it's okay if offsets and linestarts are different""" + """'!=', but it's okay if offsets and linestarts are different""" return not self.__eq__(o) def __repr__(self): diff --git a/uncompyle6/semantics/consts.py b/uncompyle6/semantics/consts.py index 46d39f2b..73b57f0f 100644 --- a/uncompyle6/semantics/consts.py +++ b/uncompyle6/semantics/consts.py @@ -136,7 +136,7 @@ ASSIGN_DOC_STRING = lambda doc_string, doc_load: SyntaxTree( SyntaxTree( "expr", [Token(doc_load, pattr=doc_string, attr=doc_string)] ), - SyntaxTree("store", [Token("STORE_NAME", pattr="__doc__")]), + SyntaxTree("store", [Token("STORE_NAME", pattr="__doc__", optype="name")]), ], ) @@ -148,10 +148,10 @@ NAME_MODULE = SyntaxTree( "assign", [ SyntaxTree( - "expr", [Token("LOAD_NAME", pattr="__name__", offset=0, has_arg=True)] + "expr", [Token("LOAD_NAME", pattr="__name__", offset=0, has_arg=True, optype="name")] ), SyntaxTree( - "store", [Token("STORE_NAME", pattr="__module__", offset=3, has_arg=True)] + "store", [Token("STORE_NAME", pattr="__module__", offset=3, has_arg=True, optype="name")] ), ], ) diff --git a/uncompyle6/semantics/n_actions.py b/uncompyle6/semantics/n_actions.py index 38e5e807..a1e8d770 100644 --- a/uncompyle6/semantics/n_actions.py +++ b/uncompyle6/semantics/n_actions.py @@ -240,10 +240,15 @@ class NonterminalActions: assert len(keys) == len(flat_elems) - 1 for i, elem in enumerate(flat_elems[:-1]): assert elem.kind == "ADD_VALUE" - try: - value = "%r" % elem.pattr - except Exception: - value = elem.pattr + if elem.optype in ("local", "name"): + value = elem.attr + elif elem.optype == "const" and not isinstance(elem.attr, str): + value = elem.attr + else: + try: + value = "%r" % elem.pattr + except Exception: + value = elem.pattr if elem.linestart is not None: if elem.linestart != self.line_number: next_indent = self.indent + INDENT_PER_LEVEL[:-1] @@ -266,11 +271,14 @@ class NonterminalActions: for elem in flat_elems: if elem == "add_value": elem = elem[0] + if elem == "ADD_VALUE": - if self.version < (3, 0, 0): - value = "%r" % repr(elem.pattr) + if elem.optype in ("local", "name"): + value = elem.attr + elif elem.optype == "const" and not isinstance(elem.attr, str): + value = elem.attr else: - value = "%s" % str(elem.pattr) + value = "%s" % repr(elem.pattr) else: assert elem.kind == "ADD_VALUE_VAR" value = "%s" % elem.pattr