diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2018-07-17 16:47:41 -0400 |
---|---|---|
committer | Xavier Claessens <xavier.claessens@collabora.com> | 2018-10-04 20:14:37 -0400 |
commit | a816e1c1fa2f70440e82b96eb027588c60de918b (patch) | |
tree | 997f9c75f93319693db04df25bc3ccde17f93744 /mesonbuild/interpreterbase.py | |
parent | fa2e096aa00175b12dd3fa9e9adf4879637ee83e (diff) | |
download | meson-a816e1c1fa2f70440e82b96eb027588c60de918b.zip meson-a816e1c1fa2f70440e82b96eb027588c60de918b.tar.gz meson-a816e1c1fa2f70440e82b96eb027588c60de918b.tar.bz2 |
Interpreter: Add 'continue' and 'break' keywords
Closes: #3601
Diffstat (limited to 'mesonbuild/interpreterbase.py')
-rw-r--r-- | mesonbuild/interpreterbase.py | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py index 22bb95b..c0064ab 100644 --- a/mesonbuild/interpreterbase.py +++ b/mesonbuild/interpreterbase.py @@ -300,6 +300,12 @@ class InvalidArguments(InterpreterException): class SubdirDoneRequest(BaseException): pass +class ContinueRequest(BaseException): + pass + +class BreakRequest(BaseException): + pass + class InterpreterObject: def __init__(self): self.methods = {} @@ -453,6 +459,10 @@ class InterpreterBase: return self.evaluate_indexing(cur) elif isinstance(cur, mparser.TernaryNode): return self.evaluate_ternary(cur) + elif isinstance(cur, mparser.ContinueNode): + raise ContinueRequest() + elif isinstance(cur, mparser.BreakNode): + raise BreakRequest() elif self.is_elementary_type(cur): return cur else: @@ -641,7 +651,12 @@ The result of this is undefined and will become a hard error in a future Meson r return items for item in items: self.set_variable(varname, item) - self.evaluate_codeblock(node.block) + try: + self.evaluate_codeblock(node.block) + except ContinueRequest: + continue + except BreakRequest: + break elif isinstance(items, dict): if len(node.varnames) != 2: raise InvalidArguments('Foreach on dict unpacks key and value') @@ -650,7 +665,12 @@ The result of this is undefined and will become a hard error in a future Meson r for key, value in items.items(): self.set_variable(node.varnames[0].value, key) self.set_variable(node.varnames[1].value, value) - self.evaluate_codeblock(node.block) + try: + self.evaluate_codeblock(node.block) + except ContinueRequest: + continue + except BreakRequest: + break else: raise InvalidArguments('Items of foreach loop must be an array or a dict') |