@@ -380,9 +380,11 @@ def write_body(self, out: Formatter, dedent: int, cache_adjust: int = 0) -> None
380
380
# Write the body, substituting a goto for ERROR_IF() and other stuff
381
381
assert dedent <= 0
382
382
extra = " " * - dedent
383
+ names_to_skip = self .unmoved_names | frozenset ({UNUSED , "null" })
383
384
for line in self .block_text :
384
385
if m := re .match (r"(\s*)ERROR_IF\((.+), (\w+)\);\s*(?://.*)?$" , line ):
385
386
space , cond , label = m .groups ()
387
+ space = extra + space
386
388
# ERROR_IF() must pop the inputs from the stack.
387
389
# The code block is responsible for DECREF()ing them.
388
390
# 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
401
403
symbolic = ""
402
404
if symbolic :
403
405
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 "
405
407
)
406
408
else :
407
- out .write_raw (f"{ extra } { space } if ({ cond } ) goto { label } ;\n " )
409
+ out .write_raw (f"{ space } if ({ cond } ) goto { label } ;\n " )
408
410
elif m := re .match (r"(\s*)DECREF_INPUTS\(\);\s*(?://.*)?$" , line ):
409
411
if not self .register :
410
- space = m .group (1 )
412
+ space = extra + m .group (1 )
411
413
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 " )
414
425
else :
415
426
out .write_raw (extra + line )
416
427
0 commit comments