(self, out: CWriter)
| 656 | out.emit(self.as_comment() + "\n") |
| 657 | |
| 658 | def close_inputs(self, out: CWriter) -> None: |
| 659 | |
| 660 | tmp_defined = False |
| 661 | def close_named(close: str, name: str, overwrite: str) -> None: |
| 662 | nonlocal tmp_defined |
| 663 | if overwrite: |
| 664 | if not tmp_defined: |
| 665 | out.emit("_PyStackRef ") |
| 666 | tmp_defined = True |
| 667 | out.emit(f"tmp = {name};\n") |
| 668 | out.emit(f"{name} = {overwrite};\n") |
| 669 | self.stack.save_variables(out) |
| 670 | out.emit(f"{close}(tmp);\n") |
| 671 | else: |
| 672 | out.emit(f"{close}({name});\n") |
| 673 | |
| 674 | def close_variable(var: Local, overwrite: str) -> None: |
| 675 | nonlocal tmp_defined |
| 676 | close = "PyStackRef_CLOSE" |
| 677 | if "null" in var.name: |
| 678 | close = "PyStackRef_XCLOSE" |
| 679 | var.memory_offset = None |
| 680 | self.save(out) |
| 681 | out.start_line() |
| 682 | if var.size: |
| 683 | if var.size == "1": |
| 684 | close_named(close, f"{var.name}[0]", overwrite) |
| 685 | else: |
| 686 | if overwrite and not tmp_defined: |
| 687 | out.emit("_PyStackRef tmp;\n") |
| 688 | tmp_defined = True |
| 689 | out.emit(f"for (int _i = {var.size}; --_i >= 0;) {{\n") |
| 690 | close_named(close, f"{var.name}[_i]", overwrite) |
| 691 | out.emit("}\n") |
| 692 | else: |
| 693 | close_named(close, var.name, overwrite) |
| 694 | self.reload(out) |
| 695 | |
| 696 | self.clear_dead_inputs() |
| 697 | if not self.inputs: |
| 698 | return |
| 699 | lowest = self.inputs[0] |
| 700 | output: Local | None = None |
| 701 | for var in self.outputs: |
| 702 | if var.is_array(): |
| 703 | if len(self.inputs) > 1: |
| 704 | raise StackError("Cannot call DECREF_INPUTS with array output and more than one input") |
| 705 | output = var |
| 706 | elif var.in_local: |
| 707 | if output is not None: |
| 708 | raise StackError("Cannot call DECREF_INPUTS with more than one live output") |
| 709 | output = var |
| 710 | if output is not None: |
| 711 | if output.is_array(): |
| 712 | assert len(self.inputs) == 1 |
| 713 | self.stack.drop(self.inputs[0].item, False) |
| 714 | self.stack.push(output) |
| 715 | self.stack.flush(out) |
no test coverage detected