aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2013-01-01 17:01:49 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2013-01-01 17:01:49 +0200
commit67b33229c3df8c191f86a87f232b6f7ca9c9d7ec (patch)
treeed584ae1dabe72b87bbaf8691ee19e312d5073ec /interpreter.py
parent409ba33f485dca1c62b50c0fa87b14ae1eda2753 (diff)
downloadmeson-67b33229c3df8c191f86a87f232b6f7ca9c9d7ec.zip
meson-67b33229c3df8c191f86a87f232b6f7ca9c9d7ec.tar.gz
meson-67b33229c3df8c191f86a87f232b6f7ca9c9d7ec.tar.bz2
Created argument reducer.
Diffstat (limited to 'interpreter.py')
-rwxr-xr-xinterpreter.py30
1 files changed, 22 insertions, 8 deletions
diff --git a/interpreter.py b/interpreter.py
index 559c9ee..b998bdc 100755
--- a/interpreter.py
+++ b/interpreter.py
@@ -29,7 +29,7 @@ class InvalidArguments(InterpreterException):
class InterpreterObject():
- def method_call(self, method_name, *args, **kwargs):
+ def method_call(self, method_name):
raise InvalidCode('Object does not have method %s.' % method_name)
class BuildTarget(InterpreterObject):
@@ -55,10 +55,9 @@ class BuildTarget(InterpreterObject):
def get_external_deps(self):
return self.external_deps
- def method_call(self, method_name, *args, **kwargs):
+ def method_call(self, method_name, args):
if method_name == 'add_dep':
- dep = args[0]
- self.add_external_dep(dep)
+ [self.add_external_dep(dep) for dep in args]
return
raise InvalidCode('Unknown method "%s" in BuildTarget.' % method_name)
@@ -193,6 +192,24 @@ class Interpreter():
self.variables[var_name] = value
return value
+ def reduce_arguments(self, args):
+ assert(isinstance(args, nodes.Arguments))
+ reduced = []
+ for arg in args.arguments:
+ if isinstance(arg, nodes.AtomExpression) or isinstance(arg, nodes.AtomStatement):
+ r = self.variables[arg.value]
+ elif isinstance(arg, nodes.StringExpression) or isinstance(arg, nodes.StringStatement):
+ r = arg.get_string()
+ elif isinstance(arg, nodes.FunctionCall):
+ r = self.function_call(arg)
+ elif isinstance(arg, nodes.MethodCall):
+ r = self.method_call(arg)
+ else:
+ raise InvalidCode('Line %d: Irreducable argument.' % args.lineno())
+ reduced.append(r)
+ assert(len(reduced) == len(args))
+ return reduced
+
def method_call(self, node):
object_name = node.object_name.get_value()
method_name = node.method_name.get_value()
@@ -202,10 +219,7 @@ class Interpreter():
obj = self.variables[object_name]
if not isinstance(obj, InterpreterObject):
raise InvalidArguments('Line %d: variable %s can not be called.' % (node.lineno(), object_name))
- # Fixme, write argument list reducer function.
- var_name = args.arguments[0].get_value()
- tmpargs = self.variables[var_name]
- return obj.method_call(method_name, tmpargs)
+ return obj.method_call(method_name, self.reduce_arguments(args))
if __name__ == '__main__':
code = """project('myawesomeproject')