summaryrefslogtreecommitdiffstats
path: root/Tools/cases_generator/analyzer.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/cases_generator/analyzer.py')
-rw-r--r--Tools/cases_generator/analyzer.py22
1 files changed, 17 insertions, 5 deletions
diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py
index 3497b7f..bcffd75 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -21,6 +21,7 @@ class Properties:
uses_co_names: bool
uses_locals: bool
has_free: bool
+ side_exit: bool
pure: bool
passthrough: bool
@@ -48,6 +49,7 @@ class Properties:
uses_co_names=any(p.uses_co_names for p in properties),
uses_locals=any(p.uses_locals for p in properties),
has_free=any(p.has_free for p in properties),
+ side_exit=any(p.side_exit for p in properties),
pure=all(p.pure for p in properties),
passthrough=all(p.passthrough for p in properties),
)
@@ -69,6 +71,7 @@ SKIP_PROPERTIES = Properties(
uses_co_names=False,
uses_locals=False,
has_free=False,
+ side_exit=False,
pure=False,
passthrough=False,
)
@@ -269,9 +272,7 @@ def override_error(
def convert_stack_item(item: parser.StackEffect) -> StackItem:
- return StackItem(
- item.name, item.type, item.cond, (item.size or "1")
- )
+ return StackItem(item.name, item.type, item.cond, (item.size or "1"))
def analyze_stack(op: parser.InstDef) -> StackEffect:
@@ -448,13 +449,24 @@ def compute_properties(op: parser.InstDef) -> Properties:
or variable_used(op, "PyCell_GET")
or variable_used(op, "PyCell_SET")
)
+ deopts_if = variable_used(op, "DEOPT_IF")
+ exits_if = variable_used(op, "EXIT_IF")
+ if deopts_if and exits_if:
+ tkn = op.tokens[0]
+ raise lexer.make_syntax_error(
+ "Op cannot contain both EXIT_IF and DEOPT_IF",
+ tkn.filename,
+ tkn.line,
+ tkn.column,
+ op.name,
+ )
infallible = is_infallible(op)
- deopts = variable_used(op, "DEOPT_IF")
passthrough = stack_effect_only_peeks(op) and infallible
return Properties(
escapes=makes_escaping_api_call(op),
infallible=infallible,
- deopts=deopts,
+ deopts=deopts_if or exits_if,
+ side_exit=exits_if,
oparg=variable_used(op, "oparg"),
jumps=variable_used(op, "JUMPBY"),
eval_breaker=variable_used(op, "CHECK_EVAL_BREAKER"),