diff options
author | Mathieu Duponchelle <mathieu@centricular.com> | 2018-04-27 00:33:20 +0200 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek.chauhan@gmail.com> | 2018-05-04 15:24:21 +0000 |
commit | f1c92d7c9cafd13877f34746d2cb7d1f79d853dd (patch) | |
tree | 951b2a03dfae8b293a6fd04c0a11568e495092df /mesonbuild/interpreterbase.py | |
parent | 8b9fe0efffae288e83b60fb722a3ec25f96a335a (diff) | |
download | meson-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.py | 49 |
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: |