🐐 Various fixes

This commit is contained in:
2026-04-01 14:57:43 +02:00
parent f76a1fcfd4
commit 6d3ded49bf
2 changed files with 34 additions and 2 deletions

View File

@@ -683,9 +683,13 @@ class SiStatement(Node):
if cond: if cond:
for statement in self.statements: for statement in self.statements:
vtable, last_val = statement.eval(vtable) vtable, last_val = statement.eval(vtable)
if vtable["#return"] is not None:
break
elif self.else_part: elif self.else_part:
for statement in self.else_part: for statement in self.else_part:
vtable, last_val = statement.eval(vtable) vtable, last_val = statement.eval(vtable)
if vtable["#return"] is not None:
break
return vtable, last_val return vtable, last_val
@@ -713,12 +717,14 @@ class DumStatement(Node):
while not cond: while not cond:
for statement in self.statements: for statement in self.statements:
vtable, val = statement.eval(vtable) vtable, val = statement.eval(vtable)
if vtable["#break"]: if vtable["#break"] or vtable["#return"] is not None:
break break
last_val = val last_val = val
if vtable["#break"]: if vtable["#break"]:
vtable["#break"] = False vtable["#break"] = False
break break
if vtable["#return"] is not None:
break
vtable, cond = self.test.eval(vtable) vtable, cond = self.test.eval(vtable)
return vtable, last_val return vtable, last_val
@@ -753,12 +759,14 @@ class PerStatement(Node):
vtable[variable_name] = item vtable[variable_name] = item
for statement in self.statements: for statement in self.statements:
vtable, val = statement.eval(vtable) vtable, val = statement.eval(vtable)
if vtable["#break"]: if vtable["#break"] or vtable["#return"] is not None:
break break
last_val = val last_val = val
if vtable["#break"]: if vtable["#break"]:
vtable["#break"] = False vtable["#break"] = False
break break
if vtable["#return"] is not None:
break
return vtable, last_val return vtable, last_val

View File

@@ -741,6 +741,30 @@ function_edge_tests = [
]), ]),
ValInt(10), 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): class TestFunctionEdge(unittest.TestCase):