diff --git a/centvrion/ast_nodes.py b/centvrion/ast_nodes.py index c12ba7e..fda4716 100644 --- a/centvrion/ast_nodes.py +++ b/centvrion/ast_nodes.py @@ -683,9 +683,13 @@ class SiStatement(Node): if cond: for statement in self.statements: vtable, last_val = statement.eval(vtable) + if vtable["#return"] is not None: + break elif self.else_part: for statement in self.else_part: vtable, last_val = statement.eval(vtable) + if vtable["#return"] is not None: + break return vtable, last_val @@ -713,12 +717,14 @@ class DumStatement(Node): while not cond: for statement in self.statements: vtable, val = statement.eval(vtable) - if vtable["#break"]: + if vtable["#break"] or vtable["#return"] is not None: break last_val = val if vtable["#break"]: vtable["#break"] = False break + if vtable["#return"] is not None: + break vtable, cond = self.test.eval(vtable) return vtable, last_val @@ -753,12 +759,14 @@ class PerStatement(Node): vtable[variable_name] = item for statement in self.statements: vtable, val = statement.eval(vtable) - if vtable["#break"]: + if vtable["#break"] or vtable["#return"] is not None: break last_val = val if vtable["#break"]: vtable["#break"] = False break + if vtable["#return"] is not None: + break return vtable, last_val diff --git a/tests.py b/tests.py index f84b1c7..c8f9c98 100644 --- a/tests.py +++ b/tests.py @@ -741,6 +741,30 @@ function_edge_tests = [ ]), ValInt(10), ), + # REDI inside SI exits function, skips remaining statements in block + ( + "DEFINI f () VT {\nSI VERITAS TVNC {\nREDI (I)\nREDI (II)\n}\n}\nINVOCA f ()", + None, + ValInt(1), + ), + # REDI inside DVM exits loop and function + ( + "DEFINI f () VT {\nDESIGNA x VT I\nDVM FALSITAS FACE {\nREDI (x)\n}\n}\nINVOCA f ()", + None, + ValInt(1), + ), + # REDI inside PER exits loop and function + ( + "DEFINI f () VT {\nPER x IN [I, II, III] FACE {\nSI x EST II TVNC {\nREDI (x)\n}\n}\n}\nINVOCA f ()", + None, + ValInt(2), + ), + # REDI inside nested loops exits all loops and function + ( + "DEFINI f () VT {\nDESIGNA x VT I\nDVM FALSITAS FACE {\nDVM FALSITAS FACE {\nREDI (x)\n}\n}\n}\nINVOCA f ()", + None, + ValInt(1), + ), ] class TestFunctionEdge(unittest.TestCase):