|
|
|
@ -793,6 +793,7 @@ class Interpreter(): |
|
|
|
|
if node is None: |
|
|
|
|
return |
|
|
|
|
if not isinstance(node, nodes.CodeBlock): |
|
|
|
|
print(node) |
|
|
|
|
e = InvalidCode('Tried to execute a non-codeblock. Possibly a bug in the parser.') |
|
|
|
|
e.lineno = node.lineno() |
|
|
|
|
raise e |
|
|
|
@ -1196,22 +1197,44 @@ class Interpreter(): |
|
|
|
|
return obj.method_call(method_name, args, kwargs) |
|
|
|
|
|
|
|
|
|
def evaluate_if(self, node): |
|
|
|
|
result = self.evaluate_statement(node.get_clause()) |
|
|
|
|
result = self.evaluate_statement(node.clause) |
|
|
|
|
cond = None |
|
|
|
|
if isinstance(result, nodes.BoolExpression) or \ |
|
|
|
|
isinstance(result, nodes.BoolStatement): |
|
|
|
|
cond = result.get_value() |
|
|
|
|
if isinstance(result, bool): |
|
|
|
|
cond = result |
|
|
|
|
|
|
|
|
|
if cond is not None: |
|
|
|
|
if cond: |
|
|
|
|
self.evaluate_codeblock(node.get_trueblock()) |
|
|
|
|
self.evaluate_codeblock(node.trueblock) |
|
|
|
|
else: |
|
|
|
|
self.evaluate_codeblock(node.get_falseblock()) |
|
|
|
|
block = node.falseblock |
|
|
|
|
if isinstance(block, nodes.ElifStatement): |
|
|
|
|
self.evaluate_elif(block) |
|
|
|
|
else: |
|
|
|
|
self.evaluate_codeblock(block) |
|
|
|
|
else: |
|
|
|
|
raise InvalidCode('If clause does not evaluate to true or false.') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def evaluate_elif(self, node): |
|
|
|
|
result = self.evaluate_statement(node.clause) |
|
|
|
|
cond = None |
|
|
|
|
if isinstance(result, nodes.BoolExpression) or \ |
|
|
|
|
isinstance(result, nodes.BoolStatement): |
|
|
|
|
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.elseblock |
|
|
|
|
if isinstance(block, nodes.ElifStatement): |
|
|
|
|
self.evaluate_elif(block) |
|
|
|
|
self.evaluate_codeblock(block) |
|
|
|
|
else: |
|
|
|
|
raise InvalidCode('Elif clause does not evaluate to true or false.') |
|
|
|
|
|
|
|
|
|
def is_elementary_type(self, v): |
|
|
|
|
if isinstance(v, int) or isinstance(v, str) or isinstance(v, bool): |
|
|
|
|
return True |
|
|
|
|