aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreterbase.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/interpreterbase.py')
-rw-r--r--mesonbuild/interpreterbase.py53
1 files changed, 14 insertions, 39 deletions
diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py
index 86a6b47..fb87ea2 100644
--- a/mesonbuild/interpreterbase.py
+++ b/mesonbuild/interpreterbase.py
@@ -198,8 +198,6 @@ class InterpreterBase:
def evaluate_notstatement(self, cur):
v = self.evaluate_statement(cur.value)
- if isinstance(v, mparser.BooleanNode):
- v = v.value
if not isinstance(v, bool):
raise InterpreterException('Argument to "not" is not a boolean.')
return not v
@@ -217,20 +215,21 @@ class InterpreterBase:
self.evaluate_codeblock(node.elseblock)
def evaluate_comparison(self, node):
- v1 = self.evaluate_statement(node.left)
- v2 = self.evaluate_statement(node.right)
- if self.is_elementary_type(v1):
- val1 = v1
- else:
- val1 = v1.value
- if self.is_elementary_type(v2):
- val2 = v2
- else:
- val2 = v2.value
+ val1 = self.evaluate_statement(node.left)
+ val2 = self.evaluate_statement(node.right)
if node.ctype == '==':
return val1 == val2
elif node.ctype == '!=':
return val1 != val2
+ elif not isinstance(val1, type(val2)):
+ raise InterpreterException(
+ 'Values of different types ({}, {}) cannot be compared using {}.'.format(type(val1).__name__,
+ type(val2).__name__,
+ node.ctype))
+ elif not self.is_elementary_type(val1):
+ raise InterpreterException('{} can only be compared for equality.'.format(node.left.value))
+ elif not self.is_elementary_type(val2):
+ raise InterpreterException('{} can only be compared for equality.'.format(node.right.value))
elif node.ctype == '<':
return val1 < val2
elif node.ctype == '<=':
@@ -244,45 +243,35 @@ class InterpreterBase:
def evaluate_andstatement(self, cur):
l = self.evaluate_statement(cur.left)
- if isinstance(l, mparser.BooleanNode):
- l = l.value
if not isinstance(l, bool):
raise InterpreterException('First argument to "and" is not a boolean.')
if not l:
return False
r = self.evaluate_statement(cur.right)
- if isinstance(r, mparser.BooleanNode):
- r = r.value
if not isinstance(r, bool):
raise InterpreterException('Second argument to "and" is not a boolean.')
return r
def evaluate_orstatement(self, cur):
l = self.evaluate_statement(cur.left)
- if isinstance(l, mparser.BooleanNode):
- l = l.get_value()
if not isinstance(l, bool):
raise InterpreterException('First argument to "or" is not a boolean.')
if l:
return True
r = self.evaluate_statement(cur.right)
- if isinstance(r, mparser.BooleanNode):
- r = r.get_value()
if not isinstance(r, bool):
raise InterpreterException('Second argument to "or" is not a boolean.')
return r
def evaluate_uminusstatement(self, cur):
v = self.evaluate_statement(cur.value)
- if isinstance(v, mparser.NumberNode):
- v = v.value
if not isinstance(v, int):
raise InterpreterException('Argument to negation is not an integer.')
return -v
def evaluate_arithmeticstatement(self, cur):
- l = self.to_native(self.evaluate_statement(cur.left))
- r = self.to_native(self.evaluate_statement(cur.right))
+ l = self.evaluate_statement(cur.left)
+ r = self.evaluate_statement(cur.right)
if cur.operation == 'add':
try:
@@ -382,8 +371,6 @@ class InterpreterBase:
obj = self.evaluate_statement(invokable)
method_name = node.name
args = node.args
- if isinstance(obj, mparser.StringNode):
- obj = obj.get_value()
if isinstance(obj, str):
return self.string_method_call(obj, method_name, args)
if isinstance(obj, bool):
@@ -402,7 +389,6 @@ class InterpreterBase:
return obj.method_call(method_name, self.flatten(args), kwargs)
def bool_method_call(self, obj, method_name, args):
- obj = self.to_native(obj)
(posargs, _) = self.reduce_arguments(args)
if method_name == 'to_string':
if not posargs:
@@ -426,7 +412,6 @@ class InterpreterBase:
raise InterpreterException('Unknown method "%s" for a boolean.' % method_name)
def int_method_call(self, obj, method_name, args):
- obj = self.to_native(obj)
(posargs, _) = self.reduce_arguments(args)
if method_name == 'is_even':
if not posargs:
@@ -442,7 +427,6 @@ class InterpreterBase:
raise InterpreterException('Unknown method "%s" for an integer.' % method_name)
def string_method_call(self, obj, method_name, args):
- obj = self.to_native(obj)
(posargs, _) = self.reduce_arguments(args)
if method_name == 'strip':
return obj.strip()
@@ -534,8 +518,6 @@ class InterpreterBase:
raise InvalidArguments('Keyword argument name is not a string.')
a = args.kwargs[key]
reduced_kw[key] = self.evaluate_statement(a)
- if not isinstance(reduced_pos, list):
- reduced_pos = [reduced_pos]
self.argument_depth -= 1
return reduced_pos, reduced_kw
@@ -564,7 +546,6 @@ To specify a keyword argument, use : instead of =.''')
if not isinstance(var_name, str):
raise InvalidArguments('Tried to assign value to a non-variable.')
value = self.evaluate_statement(node.value)
- value = self.to_native(value)
if not self.is_assignable(value):
raise InvalidCode('Tried to assign an invalid value to variable.')
# For mutable objects we need to make a copy on assignment
@@ -593,12 +574,6 @@ To specify a keyword argument, use : instead of =.''')
return self.variables[varname]
raise InvalidCode('Unknown variable "%s".' % varname)
- def to_native(self, arg):
- if isinstance(arg, (mparser.StringNode, mparser.NumberNode,
- mparser.BooleanNode)):
- return arg.value
- return arg
-
def is_assignable(self, value):
return isinstance(value, (InterpreterObject, dependencies.Dependency,
str, int, list, mesonlib.File))
@@ -624,7 +599,7 @@ To specify a keyword argument, use : instead of =.''')
if len(args) != 2:
raise InvalidCode('Set_variable takes two arguments.')
varname = args[0]
- value = self.to_native(args[1])
+ value = args[1]
self.set_variable(varname, value)
# @noKwargs