8000 Improve DECREF_INPUTS() · python/cpython@e437dfd · GitHub
[go: up one dir, main page]

Skip to content

Commit e437dfd

Browse files
committed
Improve DECREF_INPUTS()
- Support arrays - Support conditional inputs - Skip 'unused' and 'null'
1 parent a9905b3 commit e437dfd

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

Tools/cases_generator/generate_cases.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -380,9 +380,11 @@ def write_body(self, out: Formatter, dedent: int, cache_adjust: int = 0) -> None
380380
# Write the body, substituting a goto for ERROR_IF() and other stuff
381381
assert dedent <= 0
382382
extra = " " * -dedent
383+
names_to_skip = self.unmoved_names | frozenset({UNUSED, "null"})
383384
for line in self.block_text:
384385
if m := re.match(r"(\s*)ERROR_IF\((.+), (\w+)\);\s*(?://.*)?$", line):
385386
space, cond, label = m.groups()
387+
space = extra + space
386388
# ERROR_IF() must pop the inputs from the stack.
387389
# The code block is responsible for DECREF()ing them.
388390
# NOTE: If the label doesn't exist, just add it to ceval.c.
@@ -401,16 +403,25 @@ def write_body(self, out: Formatter, dedent: int, cache_adjust: int = 0) -> None
401403
symbolic = ""
402404
if symbolic:
403405
out.write_raw(
404-
f"{extra}{space}if ({cond}) {{ STACK_SHRINK({symbolic}); goto {label}; }}\n"
406+
f"{space}if ({cond}) {{ STACK_SHRINK({symbolic}); goto {label}; }}\n"
405407
)
406408
else:
407-
out.write_raw(f"{extra}{space}if ({cond}) goto {label};\n")
409+
out.write_raw(f"{space}if ({cond}) goto {label};\n")
408410
elif m := re.match(r"(\s*)DECREF_INPUTS\(\);\s*(?://.*)?$", line):
409411
if not self.register:
410-
space = m.group(1)
412+
space = extra + m.group(1)
411413
for ieff in self.input_effects:
412-
if ieff.name not in self.unmoved_names:
413-
out.write_raw(f"{extra}{space}Py_DECREF({ieff.name});\n")
414+
if ieff.name in names_to_skip:
415+
continue
416+
if ieff.size:
417+
out.write_raw(
418+
f"{space}for (int _i = {ieff.size}; --_i >= 0;) {{\n"
419+
)
420+
out.write_raw(f"{space} Py_DECREF({ieff.name}[_i]);\n")
421+
out.write_raw(f"{space}}}\n")
422+
else:
423+
decref = "XDECREF" if ieff.cond else "DECREF"
424+
out.write_raw(f"{space}Py_{decref}({ieff.name});\n")
414425
else:
415426
out.write_raw(extra + line)
416427

0 commit comments

Comments
 (0)
0