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/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 b0c74644..37dd050c 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! diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index c9de0237..46250792 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -265,6 +265,7 @@ class Scanner3(Scanner): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i): @@ -278,6 +279,7 @@ class Scanner3(Scanner): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=insts[j].optype, ) ) new_tokens.append( @@ -290,6 +292,7 @@ class Scanner3(Scanner): has_arg=t.has_arg, has_extended_arg=False, opc=t.opc, + optype=None, ) ) return new_tokens @@ -338,6 +341,7 @@ class Scanner3(Scanner): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i, 2): @@ -363,6 +367,7 @@ class Scanner3(Scanner): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=insts[j + 1].optype, ) ) new_tokens.append( @@ -375,6 +380,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 4a4f74b7..51da0766 100644 --- a/uncompyle6/scanners/scanner37.py +++ b/uncompyle6/scanners/scanner37.py @@ -89,6 +89,7 @@ class Scanner37(Scanner37Base): has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i): @@ -102,6 +103,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 4bdcd831..a9ae8151 100644 --- a/uncompyle6/scanners/scanner37base.py +++ b/uncompyle6/scanners/scanner37base.py @@ -352,6 +352,7 @@ class Scanner37Base(Scanner): has_arg=True, opc=self.opc, has_extended_arg=False, + optype=inst.optype, ), ) jump_idx += 1 @@ -423,6 +424,7 @@ class Scanner37Base(Scanner): has_arg=inst.has_arg, opc=self.opc, has_extended_arg=inst.has_extended_arg, + optype=inst.optype, ), ) continue @@ -524,6 +526,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 ace74a02..efa93a8a 100644 --- a/uncompyle6/scanners/tok.py +++ b/uncompyle6/scanners/tok.py @@ -66,11 +66,13 @@ class Token: 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: @@ -106,8 +108,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 @@ -117,7 +119,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/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: diff --git a/uncompyle6/semantics/n_actions.py b/uncompyle6/semantics/n_actions.py index 40854779..92044a70 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