aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.py')
-rw-r--r--interpreter.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/interpreter.py b/interpreter.py
index 3c66f86..cbc1e08 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -1054,6 +1054,8 @@ class Interpreter():
return self.evaluate_arithmeticstatement(cur)
elif isinstance(cur, mparser.ForeachClauseNode):
return self.evaluate_foreach(cur)
+ elif isinstance(cur, mparser.PlusAssignmentNode):
+ return self.evaluate_plusassign(cur)
elif self.is_elementary_type(cur):
return cur
else:
@@ -1839,6 +1841,8 @@ class Interpreter():
def array_method_call(self, obj, method_name, args):
if method_name == 'contains':
return self.check_contains(obj, args)
+ elif method_name == 'length':
+ return len(obj)
elif method_name == 'get':
index = args[0]
if not isinstance(index, int):
@@ -1887,6 +1891,23 @@ class Interpreter():
self.set_variable(varname, item)
self.evaluate_codeblock(node.block)
+ def evaluate_plusassign(self, node):
+ assert(isinstance(node, mparser.PlusAssignmentNode))
+ varname = node.var_name
+ addition = self.evaluate_statement(node.value)
+ # Remember that all variables are immutable. We must always create a
+ # full new variable and then assign it.
+ old_variable = self.get_variable(varname)
+ if not isinstance(old_variable, list):
+ raise InvalidArguments('The += operator currently only works with arrays.')
+ # Add other data types here.
+ else:
+ if isinstance(addition, list):
+ new_value = old_variable + addition
+ else:
+ new_value = old_variable + [addition]
+ self.set_variable(varname, new_value)
+
def is_elementary_type(self, v):
if isinstance(v, (int, float, str, bool, list)):
return True