summaryrefslogtreecommitdiffstats
path: root/Tools/cases_generator
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2023-02-08 19:40:10 (GMT)
committerGitHub <noreply@github.com>2023-02-08 19:40:10 (GMT)
commit616aec1ff148ba4570aa2d4b8ea420c715c206e4 (patch)
treea3a7dcdbe60264dd511b01e5b0ff3cda9ecb6b66 /Tools/cases_generator
parentd9de0792482d2ded364b0c7d2867b97a5da41b12 (diff)
downloadcpython-616aec1ff148ba4570aa2d4b8ea420c715c206e4.zip
cpython-616aec1ff148ba4570aa2d4b8ea420c715c206e4.tar.gz
cpython-616aec1ff148ba4570aa2d4b8ea420c715c206e4.tar.bz2
gh-98831: Modernize CALL and family (#101508)
Includes a slight improvement to `DECREF_INPUTS()`.
Diffstat (limited to 'Tools/cases_generator')
-rw-r--r--Tools/cases_generator/generate_cases.py21
1 files changed, 16 insertions, 5 deletions
diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py
index 9b5aa91..1fcfbb6 100644
--- a/Tools/cases_generator/generate_cases.py
+++ b/Tools/cases_generator/generate_cases.py
@@ -391,9 +391,11 @@ class Instruction:
# Write the body, substituting a goto for ERROR_IF() and other stuff
assert dedent <= 0
extra = " " * -dedent
+ names_to_skip = self.unmoved_names | frozenset({UNUSED, "null"})
for line in self.block_text:
if m := re.match(r"(\s*)ERROR_IF\((.+), (\w+)\);\s*(?://.*)?$", line):
space, cond, label = m.groups()
+ space = extra + space
# ERROR_IF() must pop the inputs from the stack.
# The code block is responsible for DECREF()ing them.
# NOTE: If the label doesn't exist, just add it to ceval.c.
@@ -412,16 +414,25 @@ class Instruction:
symbolic = ""
if symbolic:
out.write_raw(
- f"{extra}{space}if ({cond}) {{ STACK_SHRINK({symbolic}); goto {label}; }}\n"
+ f"{space}if ({cond}) {{ STACK_SHRINK({symbolic}); goto {label}; }}\n"
)
else:
- out.write_raw(f"{extra}{space}if ({cond}) goto {label};\n")
+ out.write_raw(f"{space}if ({cond}) goto {label};\n")
elif m := re.match(r"(\s*)DECREF_INPUTS\(\);\s*(?://.*)?$", line):
if not self.register:
- space = m.group(1)
+ space = extra + m.group(1)
for ieff in self.input_effects:
- if ieff.name not in self.unmoved_names:
- out.write_raw(f"{extra}{space}Py_DECREF({ieff.name});\n")
+ if ieff.name in names_to_skip:
+ continue
+ if ieff.size:
+ out.write_raw(
+ f"{space}for (int _i = {ieff.size}; --_i >= 0;) {{\n"
+ )
+ out.write_raw(f"{space} Py_DECREF({ieff.name}[_i]);\n")
+ out.write_raw(f"{space}}}\n")
+ else:
+ decref = "XDECREF" if ieff.cond else "DECREF"
+ out.write_raw(f"{space}Py_{decref}({ieff.name});\n")
else:
out.write_raw(extra + line)