diff options
Diffstat (limited to 'mesonbuild/interpreterbase')
-rw-r--r-- | mesonbuild/interpreterbase/__init__.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/_unholder.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/decorators.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/interpreterbase.py | 5 |
4 files changed, 11 insertions, 6 deletions
diff --git a/mesonbuild/interpreterbase/__init__.py b/mesonbuild/interpreterbase/__init__.py index 298a034..8e45cdb 100644 --- a/mesonbuild/interpreterbase/__init__.py +++ b/mesonbuild/interpreterbase/__init__.py @@ -41,7 +41,7 @@ __all__ = [ 'stringArgs', 'noArgsFlattening', 'noSecondLevelHolderResolving', - 'unholder_return', + 'permissive_unholder_return', 'disablerIfNotFound', 'permittedKwargs', 'typed_pos_args', @@ -94,7 +94,7 @@ from .decorators import ( stringArgs, noArgsFlattening, noSecondLevelHolderResolving, - unholder_return, + permissive_unholder_return, disablerIfNotFound, permittedKwargs, typed_pos_args, diff --git a/mesonbuild/interpreterbase/_unholder.py b/mesonbuild/interpreterbase/_unholder.py index b5663a5..7e95232 100644 --- a/mesonbuild/interpreterbase/_unholder.py +++ b/mesonbuild/interpreterbase/_unholder.py @@ -18,7 +18,7 @@ from ..mesonlib import HoldableObject, MesonBugException import typing as T -def _unholder(obj: T.Union[TYPE_var, InterpreterObject]) -> TYPE_var: +def _unholder(obj: T.Union[TYPE_var, InterpreterObject], *, permissive: bool = False) -> TYPE_var: if isinstance(obj, (int, bool, str)): return obj elif isinstance(obj, list): @@ -30,6 +30,8 @@ def _unholder(obj: T.Union[TYPE_var, InterpreterObject]) -> TYPE_var: return obj.held_object elif isinstance(obj, MesonInterpreterObject): return obj + elif isinstance(obj, HoldableObject) and permissive: + return obj elif isinstance(obj, HoldableObject): raise MesonBugException(f'Argument {obj} of type {type(obj).__name__} is not held by an ObjectHolder.') elif isinstance(obj, InterpreterObject): diff --git a/mesonbuild/interpreterbase/decorators.py b/mesonbuild/interpreterbase/decorators.py index b91e9d5..eabc6d8 100644 --- a/mesonbuild/interpreterbase/decorators.py +++ b/mesonbuild/interpreterbase/decorators.py @@ -72,11 +72,11 @@ def noSecondLevelHolderResolving(f: TV_func) -> TV_func: setattr(f, 'no-second-level-holder-flattening', True) # noqa: B010 return f -def unholder_return(f: TV_func) -> T.Callable[..., TYPE_var]: +def permissive_unholder_return(f: TV_func) -> T.Callable[..., TYPE_var]: @wraps(f) def wrapped(*wrapped_args: T.Any, **wrapped_kwargs: T.Any) -> T.Any: res = f(*wrapped_args, **wrapped_kwargs) - return _unholder(res) + return _unholder(res, permissive=True) return T.cast(T.Callable[..., TYPE_var], wrapped) def disablerIfNotFound(f: TV_func) -> TV_func: diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py index d66fb9c..91cb7aa 100644 --- a/mesonbuild/interpreterbase/interpreterbase.py +++ b/mesonbuild/interpreterbase/interpreterbase.py @@ -268,7 +268,7 @@ class InterpreterBase: return True def evaluate_in(self, val1: T.Any, val2: T.Any) -> bool: - if not isinstance(val1, (str, int, float, ObjectHolder)): + if not isinstance(val1, (str, int, float, mesonlib.HoldableObject)): raise InvalidArguments('lvalue of "in" operator must be a string, integer, float, or object') if not isinstance(val2, (list, dict)): raise InvalidArguments('rvalue of "in" operator must be an array or a dict') @@ -281,6 +281,9 @@ class InterpreterBase: val2 = self.evaluate_statement(node.right) if isinstance(val2, Disabler): return val2 + # Do not compare the ObjectHolders but the actual held objects + val1 = _unholder(val1) + val2 = _unholder(val2) if node.ctype == 'in': return self.evaluate_in(val1, val2) elif node.ctype == 'notin': |