aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2014-03-17 00:00:13 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2014-03-17 00:00:13 +0200
commitd6924da0058720b63c3579c40b0715f68c1a274c (patch)
tree2ffe3f68d1d4562174f994ebc06149cfd77a15c9
parent163a31beef2488ce4ce470daaa4d28b83e5fc2e4 (diff)
downloadmeson-d6924da0058720b63c3579c40b0715f68c1a274c.zip
meson-d6924da0058720b63c3579c40b0715f68c1a274c.tar.gz
meson-d6924da0058720b63c3579c40b0715f68c1a274c.tar.bz2
If statements worky.
-rw-r--r--interpreter.py29
-rwxr-xr-xparsertest.py2
2 files changed, 12 insertions, 19 deletions
diff --git a/interpreter.py b/interpreter.py
index 8c7695e..54a92d7 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -721,7 +721,7 @@ class Interpreter():
return cur
elif isinstance(cur, mparser2.BooleanNode):
return cur
- elif isinstance(cur, mparser2.IfNode):
+ elif isinstance(cur, mparser2.IfClauseNode):
return self.evaluate_if(cur)
elif isinstance(cur, mparser2.IdNode):
return self.get_variable(cur.value)
@@ -1293,23 +1293,16 @@ class Interpreter():
return obj.method_call(method_name, args, kwargs)
def evaluate_if(self, node):
- result = self.evaluate_statement(node.clause)
- cond = None
- if isinstance(result, mparser2.BooleanNode):
- cond = result.get_value()
- if isinstance(result, bool):
- cond = result
- if cond is not None:
- if cond:
- self.evaluate_codeblock(node.trueblock)
- else:
- block = node.falseblock
- if isinstance(block, nodes.IfStatement):
- self.evaluate_if(block)
- else:
- self.evaluate_codeblock(block)
- else:
- raise InvalidCode('If clause does not evaluate to true or false.')
+ assert(isinstance(node, mparser2.IfClauseNode))
+ for i in node.ifs:
+ result = self.evaluate_statement(i.condition)
+ if not(isinstance(result, bool)):
+ raise InvalidCode('If clause does not evaluate to true or false.')
+ if result:
+ self.evaluate_codeblock(i.block)
+ return
+ if not isinstance(node.elseblock, mparser2.EmptyNode):
+ self.evaluate_codeblock(node.elseblock)
def is_elementary_type(self, v):
if isinstance(v, int) or isinstance(v, str) or isinstance(v, bool):
diff --git a/parsertest.py b/parsertest.py
index c530af0..6adb1f4 100755
--- a/parsertest.py
+++ b/parsertest.py
@@ -377,7 +377,7 @@ class Parser:
if self.accept('true'):
return BooleanNode(t, True);
if self.accept('false'):
- BooleanNode(t, False)
+ return BooleanNode(t, False)
if self.accept('id'):
return IdNode(t)
if self.accept('number'):