try to be more honest about MAKE_{FUNCTION,CLOSURE}

This commit is contained in:
rocky
2023-01-15 22:48:07 -05:00
parent 154dabfcef
commit 9a7eb0ad0a
5 changed files with 122 additions and 102 deletions

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2015-2019, 2021-2022 by Rocky Bernstein
# Copyright (c) 2015-2019, 2021-2023 by Rocky Bernstein
# Copyright (c) 2005 by Dan Pascu <dan@windowmaker.org>
# Copyright (c) 2000-2002 by hartmut Goebel <h.goebel@crazy-compilers.com>
#
@@ -41,7 +41,7 @@ from xdis import iscode, instruction_size, Instruction
from xdis.bytecode import _get_const_info
from uncompyle6.scanners.tok import Token
from uncompyle6.scanner import parse_fn_counts
from uncompyle6.scanner import parse_fn_counts_30_35
import xdis
# Get all the opcodes into globals
@@ -363,7 +363,7 @@ class Scanner3(Scanner):
)
new_tokens.append(
Token(
opname=f"BUILD_DICT_OLDER",
opname="BUILD_DICT_OLDER",
attr=t.attr,
pattr=t.pattr,
offset=t.offset,
@@ -623,32 +623,29 @@ class Scanner3(Scanner):
flags >>= 1
attr = attr[:4] # remove last value: attr[5] == False
else:
pos_args, name_pair_args, annotate_args = parse_fn_counts(
pos_args, name_pair_args, annotate_args = parse_fn_counts_30_35(
inst.argval
)
)
correct_annotate_args = annotate_args
if opname in ("MAKE_CLOSURE", "MAKE_FUNCTION") and ((3, 4) <= self.version < (3, 6)) and annotate_args > 0:
# For some reason that I don't understand, annotate_args is off by one
# when there is an EXENDED_ARG instruction from what is documented in
# https://docs.python.org/3.4/library/dis.html#opcode-MAKE_CLOSURE
# However in parsing rule, we have already adjusted for the one-fewer annotate arg
correct_annotate_args -= 1
pattr = f"{pos_args} positional, {name_pair_args} keyword only, {annotate_args} annotated"
pattr = "%d positional, %d keyword only, %d annotated" % (
pos_args,
name_pair_args,
correct_annotate_args,
)
if name_pair_args > 0:
if name_pair_args > 0 and annotate_args > 0:
# FIXME: this should probably be K_
opname = "%s_N%d" % (opname, name_pair_args)
opname += f"_N{name_pair_args}_A{annotate_args}"
pass
if annotate_args > 0:
opname = "%s_A_%d" % (opname, annotate_args)
elif annotate_args > 0:
opname += f"_A_{annotate_args}"
pass
opname = "%s_%d" % (opname, pos_args)
elif name_pair_args > 0:
opname += f"_N_{name_pair_args}"
pass
else:
# Rule customization mathics, MAKE_FUNCTION_...
# so make sure to add the "_"
opname += "_0"
attr = (pos_args, name_pair_args, annotate_args)
new_tokens.append(
Token(
opname=opname,