From 8a1fd7e127311e2dc9829d94c3dde0041bddf8ea Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 24 Feb 2024 17:41:32 -0500 Subject: [PATCH] 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 2c186bc66..e7ae174f4 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 32d2d342e..08462fa44 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 d8e87b4c9..d4393ae97 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 1fa964efe..37dd050c5 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 5ac4ab55a..3c51c3e6a 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -266,6 +266,7 @@ def bound_collection_from_inst( has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i): @@ -279,6 +280,7 @@ def bound_collection_from_inst( has_arg=True, has_extended_arg=False, opc=self.opc, + optype=insts[j].optype, ) ) new_tokens.append( @@ -291,6 +293,7 @@ def bound_collection_from_inst( has_arg=t.has_arg, has_extended_arg=False, opc=t.opc, + optype=None, ) ) return new_tokens @@ -339,6 +342,7 @@ def bound_map_from_inst( has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i, 2): @@ -364,6 +368,7 @@ def bound_map_from_inst( has_arg=True, has_extended_arg=False, opc=self.opc, + optype=insts[j + 1].optype, ) ) new_tokens.append( @@ -376,6 +381,7 @@ def bound_map_from_inst( 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 1a505e433..ea6db8ac9 100644 --- a/uncompyle6/scanners/scanner37.py +++ b/uncompyle6/scanners/scanner37.py @@ -24,12 +24,12 @@ 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 @@ def bound_collection_from_tokens( has_arg=True, has_extended_arg=False, opc=self.opc, + optype=None, ) ) for j in range(collection_start, i): @@ -103,6 +104,7 @@ def bound_collection_from_tokens( 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 7d46b56f3..dc9804ed0 100644 --- a/uncompyle6/scanners/scanner37base.py +++ b/uncompyle6/scanners/scanner37base.py @@ -355,6 +355,7 @@ def tokens_append(j, token): has_arg=True, opc=self.opc, has_extended_arg=False, + optype=inst.optype, ), ) jump_idx += 1 @@ -426,6 +427,7 @@ def tokens_append(j, token): has_arg=inst.has_arg, opc=self.opc, has_extended_arg=inst.has_extended_arg, + optype=inst.optype, ), ) continue @@ -527,6 +529,7 @@ def tokens_append(j, token): 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 43d54cf41..0e701e973 100644 --- a/uncompyle6/scanners/tok.py +++ b/uncompyle6/scanners/tok.py @@ -61,17 +61,19 @@ def __init__( 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 @@ def __init__( 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 @@ def __eq__(self, o): 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 46d39f2b9..73b57f0fa 100644 --- a/uncompyle6/semantics/consts.py +++ b/uncompyle6/semantics/consts.py @@ -136,7 +136,7 @@ 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 @@ "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 38e5e8071..a1e8d7704 100644 --- a/uncompyle6/semantics/n_actions.py +++ b/uncompyle6/semantics/n_actions.py @@ -240,10 +240,15 @@ def n_const_list(self, node: SyntaxTree): 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 @@ def n_const_list(self, node: SyntaxTree): 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