aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Tools/cases_generator/generators_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/cases_generator/generators_common.py')
-rw-r--r--Tools/cases_generator/generators_common.py28
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):