[procedures] Fixed if queue flushing logic.

Any pending `if`s in the parsing queue of a procedure should also be
cleared if the current statement in the procedure is a
break/continue/return.

In such case we should terminate the current branch, and that involves
ensuring that any `if`s branches that are still being parsed are
inserted before the branch-terminating statement.
This commit is contained in:
Fabio Manganiello 2024-09-12 02:14:40 +02:00
parent 1e9f7fb2c6
commit 853fce2521
Signed by untrusted user: blacklight
GPG key ID: D90FBA7F76362774

View file

@ -5,7 +5,7 @@ from dataclasses import dataclass
from functools import wraps from functools import wraps
from queue import LifoQueue from queue import LifoQueue
from typing import Any, Optional from typing import Any, List, Optional
from ..common import exec_wrapper from ..common import exec_wrapper
from ..config import Config from ..config import Config
@ -110,6 +110,7 @@ class Procedure:
for request_config in requests: for request_config in requests:
# Check if it's a break/continue/return statement # Check if it's a break/continue/return statement
if isinstance(request_config, str): if isinstance(request_config, str):
cls._flush_if_statements(reqs, if_config)
reqs.append(Statement.build(request_config)) reqs.append(Statement.build(request_config))
continue continue
@ -118,6 +119,7 @@ class Procedure:
len(request_config.keys()) == 1 len(request_config.keys()) == 1
and list(request_config.keys())[0] == 'return' and list(request_config.keys())[0] == 'return'
): ):
cls._flush_if_statements(reqs, if_config)
reqs.append(ReturnStatement(argument=request_config['return'])) reqs.append(ReturnStatement(argument=request_config['return']))
continue continue
@ -214,9 +216,7 @@ class Procedure:
request = Request.build(request_config) request = Request.build(request_config)
reqs.append(request) reqs.append(request)
while not if_config.empty(): cls._flush_if_statements(reqs, if_config)
pending_if = if_config.get()
reqs.append(IfProcedure.build(**pending_if))
return procedure_class( return procedure_class(
name=name, name=name,
@ -227,6 +227,12 @@ class Procedure:
**kwargs, **kwargs,
) )
@staticmethod
def _flush_if_statements(requests: List, if_config: LifoQueue):
while not if_config.empty():
pending_if = if_config.get()
requests.append(IfProcedure.build(**pending_if))
@staticmethod @staticmethod
def _find_nearest_loop(stack): def _find_nearest_loop(stack):
for proc in stack[::-1]: for proc in stack[::-1]: