aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreterbase.py
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2018-04-27 00:33:20 +0200
committerNirbheek Chauhan <nirbheek.chauhan@gmail.com>2018-05-04 15:24:21 +0000
commitf1c92d7c9cafd13877f34746d2cb7d1f79d853dd (patch)
tree951b2a03dfae8b293a6fd04c0a11568e495092df /mesonbuild/interpreterbase.py
parent8b9fe0efffae288e83b60fb722a3ec25f96a335a (diff)
downloadmeson-f1c92d7c9cafd13877f34746d2cb7d1f79d853dd.zip
meson-f1c92d7c9cafd13877f34746d2cb7d1f79d853dd.tar.gz
meson-f1c92d7c9cafd13877f34746d2cb7d1f79d853dd.tar.bz2
Interpreter: don't flatten the arguments of various methods
this fixes eg set_variable('foo', ['bar', 'baz']), which was previously erroring out complaining about the number of arguments. Closes #1481
Diffstat (limited to 'mesonbuild/interpreterbase.py')
-rw-r--r--mesonbuild/interpreterbase.py49
1 files changed, 30 insertions, 19 deletions
diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py
index bedcf26..60b0465 100644
--- a/mesonbuild/interpreterbase.py
+++ b/mesonbuild/interpreterbase.py
@@ -51,6 +51,22 @@ def _get_callee_args(wrapped_args):
kwargs = kwargs if kwargs is not None else {}
return s, node_or_state, args, kwargs
+def flatten(args):
+ if isinstance(args, mparser.StringNode):
+ return args.value
+ if isinstance(args, (int, str, mesonlib.File, InterpreterObject)):
+ return args
+ result = []
+ for a in args:
+ if isinstance(a, list):
+ rest = flatten(a)
+ result = result + rest
+ elif isinstance(a, mparser.StringNode):
+ result.append(a.value)
+ else:
+ result.append(a)
+ return result
+
def noPosargs(f):
@wraps(f)
def wrapped(*wrapped_args, **wrapped_kwargs):
@@ -78,6 +94,10 @@ def stringArgs(f):
return f(*wrapped_args, **wrapped_kwargs)
return wrapped
+def noArgsFlattening(f):
+ setattr(f, 'no-args-flattening', True)
+ return f
+
class permittedKwargs:
def __init__(self, permitted):
@@ -121,7 +141,10 @@ class InterpreterObject:
def method_call(self, method_name, args, kwargs):
if method_name in self.methods:
- return self.methods[method_name](args, kwargs)
+ method = self.methods[method_name]
+ if not getattr(method, 'no-args-flattening', False):
+ args = flatten(args)
+ return method(args, kwargs)
raise InvalidCode('Unknown method "%s" in object.' % method_name)
class MutableInterpreterObject(InterpreterObject):
@@ -481,7 +504,11 @@ The result of this is undefined and will become a hard error in a future Meson r
if is_disabled(posargs, kwargs):
return Disabler()
if func_name in self.funcs:
- return self.funcs[func_name](node, self.flatten(posargs), kwargs)
+ func = self.funcs[func_name]
+ if not getattr(func, 'no-args-flattening', False):
+ posargs = flatten(posargs)
+
+ return func(node, posargs, kwargs)
else:
self.unknown_function_called(func_name)
@@ -515,7 +542,7 @@ The result of this is undefined and will become a hard error in a future Meson r
return Disabler()
if method_name == 'extract_objects':
self.validate_extraction(obj.held_object)
- return obj.method_call(method_name, self.flatten(args), kwargs)
+ return obj.method_call(method_name, args, kwargs)
def bool_method_call(self, obj, method_name, args):
(posargs, kwargs) = self.reduce_arguments(args)
@@ -675,22 +702,6 @@ The result of this is undefined and will become a hard error in a future Meson r
self.argument_depth -= 1
return reduced_pos, reduced_kw
- def flatten(self, args):
- if isinstance(args, mparser.StringNode):
- return args.value
- if isinstance(args, (int, str, mesonlib.File, InterpreterObject)):
- return args
- result = []
- for a in args:
- if isinstance(a, list):
- rest = self.flatten(a)
- result = result + rest
- elif isinstance(a, mparser.StringNode):
- result.append(a.value)
- else:
- result.append(a)
- return result
-
def assignment(self, node):
assert(isinstance(node, mparser.AssignmentNode))
if self.argument_depth != 0: