Bang on version 1.0-1.4 Python

This commit is contained in:
rocky
2022-05-02 22:03:52 -04:00
parent 5df57489b4
commit e94e9379c0
2 changed files with 27 additions and 18 deletions

View File

@@ -1,7 +1,7 @@
# Copyright (c) 2018, 2022 Rocky Bernstein # Copyright (c) 2018, 2022 Rocky Bernstein
from spark_parser import DEFAULT_DEBUG as PARSER_DEFAULT_DEBUG from spark_parser import DEFAULT_DEBUG as PARSER_DEFAULT_DEBUG
from uncompyle6.parser import PythonParserSingle from uncompyle6.parser import PythonParserSingle, nop_func
from uncompyle6.parsers.parse15 import Python15Parser from uncompyle6.parsers.parse15 import Python15Parser
class Python14Parser(Python15Parser): class Python14Parser(Python15Parser):
@@ -11,6 +11,8 @@ class Python14Parser(Python15Parser):
# Not much here yet, but will probably need to add UNARY_CALL, # Not much here yet, but will probably need to add UNARY_CALL,
# LOAD_LOCAL, SET_FUNC_ARGS # LOAD_LOCAL, SET_FUNC_ARGS
args ::= RESERVE_FAST UNPACK_ARG args_store
args_store ::= STORE_FAST*
call ::= expr tuple BINARY_CALL call ::= expr tuple BINARY_CALL
expr ::= call expr ::= call
kv ::= DUP_TOP expr ROT_TWO LOAD_CONST STORE_SUBSCR kv ::= DUP_TOP expr ROT_TWO LOAD_CONST STORE_SUBSCR
@@ -18,11 +20,11 @@ class Python14Parser(Python15Parser):
print_expr_stmt ::= expr PRINT_EXPR print_expr_stmt ::= expr PRINT_EXPR
raise_stmt2 ::= expr expr RAISE_EXCEPTION raise_stmt2 ::= expr expr RAISE_EXCEPTION
star_args ::= RESERVE_FAST UNPACK_VARARG_1 args_store star_args ::= RESERVE_FAST UNPACK_VARARG_1 args_store
args ::= RESERVE_FAST UNPACK_ARG args_store
stmt ::= print_expr_stmt
args_store ::= STORE_FAST+
stmt ::= args stmt ::= args
stmt ::= print_expr_stmt
stmt ::= star_args stmt ::= star_args
stmt ::= varargs
varargs ::= RESERVE_FAST UNPACK_VARARG_0 args_store
# Not strictly needed, but tidies up output # Not strictly needed, but tidies up output
@@ -55,7 +57,14 @@ class Python14Parser(Python15Parser):
jb_pop jb_pop
POP_BLOCK else_suitel COME_FROM POP_BLOCK else_suitel COME_FROM
""") """)
self.check_reduce['doc_junk'] = 'tokens' self.check_reduce["doc_junk"] = "tokens"
for i, token in enumerate(tokens):
opname = token.kind
opname_base = opname[:opname.rfind("_")]
if opname_base == "UNPACK_VARARG":
if token.attr > 1:
self.addRule(f"star_args ::= RESERVE_FAST {opname} args_store", nop_func)
def reduce_is_invalid(self, rule, ast, tokens, first, last): def reduce_is_invalid(self, rule, ast, tokens, first, last):

View File

@@ -45,12 +45,12 @@ def make_function1(self, node, is_lambda, nested=1, code_node=None):
args = tree[0] args = tree[0]
del tree[0] del tree[0]
params = [] params = []
assert args.kind in ("star_args", "args") assert args.kind in ("star_args", "args", "varargs")
has_star_arg = args.kind == "star_args" has_star_arg = args.kind in ("star_args", "varargs")
args_store = args[2] args_store = args[2]
assert args_store == "args_store" if args_store == "args_store":
for arg in args_store: for arg in args_store:
params.append(param_names[arg.attr]) params.append(param_names[arg.attr])
return has_star_arg, params return has_star_arg, params
# MAKE_FUNCTION_... or MAKE_CLOSURE_... # MAKE_FUNCTION_... or MAKE_CLOSURE_...
@@ -118,16 +118,16 @@ def make_function1(self, node, is_lambda, nested=1, code_node=None):
# to have something to after the yield finishes. # to have something to after the yield finishes.
# FIXME: this is a bit hoaky and not general # FIXME: this is a bit hoaky and not general
if ( if (
len(ast) > 1 len(tree) > 1
and self.traverse(ast[-1]) == "None" and self.traverse(tree[-1]) == "None"
and self.traverse(ast[-2]).strip().startswith("yield") and self.traverse(tree[-2]).strip().startswith("yield")
): ):
del ast[-1] del tree[-1]
# Now pick out the expr part of the last statement # Now pick out the expr part of the last statement
ast_expr = ast[-1] tree_expr = tree[-1]
while ast_expr.kind != "expr": while tree_expr.kind != "expr":
ast_expr = ast_expr[0] tree_expr = tree_expr[0]
ast[-1] = ast_expr tree[-1] = tree_expr
pass pass
else: else:
self.write("(", ", ".join(params)) self.write("(", ", ".join(params))