diff options
Diffstat (limited to 'Tools/cases_generator/generators_common.py')
-rw-r--r-- | Tools/cases_generator/generators_common.py | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/Tools/cases_generator/generators_common.py b/Tools/cases_generator/generators_common.py index 9ba0767cba3..47de205c0e9 100644 --- a/Tools/cases_generator/generators_common.py +++ b/Tools/cases_generator/generators_common.py @@ -56,9 +56,7 @@ def root_relative_path(filename: str) -> str: def type_and_null(var: StackItem) -> tuple[str, str]: - if var.type: - return var.type, "NULL" - elif var.is_array(): + if var.is_array(): return "_PyStackRef *", "NULL" else: return "_PyStackRef", "PyStackRef_NULL" @@ -140,6 +138,7 @@ class Emitter: ) -> bool: if storage.spilled: raise analysis_error("stack_pointer needs reloading before dispatch", tkn) + storage.stack.flush(self.out) self.emit(tkn) return False @@ -170,12 +169,12 @@ class Emitter: exit_if = deopt_if - def goto_error(self, offset: int, label: str, storage: Storage) -> str: + def goto_error(self, offset: int, storage: Storage) -> str: if offset > 0: - return f"JUMP_TO_LABEL(pop_{offset}_{label});" + return f"JUMP_TO_LABEL(pop_{offset}_error);" if offset < 0: storage.copy().flush(self.out) - return f"JUMP_TO_LABEL({label});" + return f"JUMP_TO_LABEL(error);" def error_if( self, @@ -191,17 +190,13 @@ class Emitter: unconditional = always_true(first_tkn) if unconditional: next(tkn_iter) - comma = next(tkn_iter) - if comma.kind != "COMMA": - raise analysis_error(f"Expected comma, got '{comma.text}'", comma) + next(tkn_iter) # RPAREN self.out.start_line() else: self.out.emit_at("if ", tkn) self.emit(lparen) - emit_to(self.out, tkn_iter, "COMMA") + emit_to(self.out, tkn_iter, "RPAREN") self.out.emit(") {\n") - label = next(tkn_iter).text - next(tkn_iter) # RPAREN next(tkn_iter) # Semi colon storage.clear_inputs("at ERROR_IF") @@ -210,7 +205,7 @@ class Emitter: offset = int(c_offset) except ValueError: offset = -1 - self.out.emit(self.goto_error(offset, label, storage)) + self.out.emit(self.goto_error(offset, storage)) self.out.emit("\n") if not unconditional: self.out.emit("}\n") @@ -227,7 +222,7 @@ class Emitter: next(tkn_iter) # LPAREN next(tkn_iter) # RPAREN next(tkn_iter) # Semi colon - self.out.emit_at(self.goto_error(0, "error", storage), tkn) + self.out.emit_at(self.goto_error(0, storage), tkn) return False def decref_inputs( @@ -492,6 +487,11 @@ class Emitter: label_tkn = next(tkn_iter) self.goto_label(tkn, label_tkn, storage) reachable = False + elif tkn.kind == "RETURN": + self.emit(tkn) + semicolon = emit_to(self.out, tkn_iter, "SEMI") + self.emit(semicolon) + reachable = False elif tkn.kind == "IDENTIFIER": if tkn.text in self._replacers: if not self._replacers[tkn.text](tkn, tkn_iter, uop, storage, inst): |