🐐 Various fixes
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
24
tests.py
24
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):
|
||||
|
||||
Reference in New Issue
Block a user