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