diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2021-06-28 17:22:14 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2021-07-02 17:14:44 +0300 |
commit | 971a0b1775ef80fc0877b3b90f75803f197c866b (patch) | |
tree | 40f206fa6112707dfc0600546c072e104a55c5e1 | |
parent | 5bb93490c4c15198bcd230ecf64d3e5c5ef17951 (diff) | |
download | meson-971a0b1775ef80fc0877b3b90f75803f197c866b.zip meson-971a0b1775ef80fc0877b3b90f75803f197c866b.tar.gz meson-971a0b1775ef80fc0877b3b90f75803f197c866b.tar.bz2 |
fix: get_variable default variables are not ObjectHolders (fixes #8936)
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 4 | ||||
-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 | ||||
-rw-r--r-- | test cases/common/242 set and get variable/meson.build | 6 |
7 files changed, 21 insertions, 10 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 693924f..d37d5f7 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -26,7 +26,7 @@ from ..programs import ExternalProgram, NonExistingExternalProgram from ..dependencies import Dependency from ..depfile import DepFile from ..interpreterbase import ContainerTypeInfo, InterpreterBase, KwargInfo, typed_kwargs, typed_pos_args -from ..interpreterbase import noPosargs, noKwargs, stringArgs, permittedKwargs, noArgsFlattening, noSecondLevelHolderResolving, unholder_return +from ..interpreterbase import noPosargs, noKwargs, stringArgs, permittedKwargs, noArgsFlattening, noSecondLevelHolderResolving, permissive_unholder_return from ..interpreterbase import InterpreterException, InvalidArguments, InvalidCode, SubdirDoneRequest from ..interpreterbase import Disabler, disablerIfNotFound from ..interpreterbase import FeatureNew, FeatureDeprecated, FeatureNewKwargs, FeatureDeprecatedKwargs @@ -2722,7 +2722,7 @@ This will become a hard error in the future.''', location=self.current_node) @noKwargs @noArgsFlattening - @unholder_return + @permissive_unholder_return def func_get_variable(self, node, args, kwargs): if len(args) < 1 or len(args) > 2: raise InvalidCode('Get_variable takes one or two arguments.') diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index 03725b9..76d5b16 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -18,7 +18,7 @@ from ..interpreterbase import ( InterpreterObject, MesonInterpreterObject, ObjectHolder, MutableInterpreterObject, FeatureCheckBase, FeatureNewKwargs, FeatureNew, FeatureDeprecated, typed_pos_args, typed_kwargs, KwargInfo, stringArgs, permittedKwargs, - noArgsFlattening, noPosargs, noKwargs, unholder_return, TYPE_var, TYPE_kwargs, TYPE_nvar, TYPE_nkwargs, + noArgsFlattening, noPosargs, noKwargs, permissive_unholder_return, TYPE_var, TYPE_kwargs, TYPE_nvar, TYPE_nkwargs, flatten, resolve_second_level_holders, InterpreterException, InvalidArguments, InvalidCode) from ..dependencies import Dependency, ExternalLibrary, InternalDependency from ..programs import ExternalProgram @@ -727,7 +727,7 @@ class SubprojectHolder(MesonInterpreterObject): @noKwargs @noArgsFlattening - @unholder_return + @permissive_unholder_return def get_variable_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> T.Union[TYPE_var, InterpreterObject]: if len(args) < 1 or len(args) > 2: raise InterpreterException('Get_variable takes one or two arguments.') 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': diff --git a/test cases/common/242 set and get variable/meson.build b/test cases/common/242 set and get variable/meson.build index 6023e88..7c8dcf7 100644 --- a/test cases/common/242 set and get variable/meson.build +++ b/test cases/common/242 set and get variable/meson.build @@ -14,6 +14,10 @@ set_variable('var4', files('test2.txt')[0]) assert(var3 == 'test2.txt') assert(not is_disabler(var4)) +# Test Equality +assert(var1 == get_variable('var1')) +assert(var2 == get_variable('var2')) + # Test get_variable directly assert(get_variable('var1') == 'test1.txt') assert(not is_disabler(get_variable('var2'))) @@ -35,6 +39,8 @@ assert(var7 == 'test2.txt') assert(not is_disabler(var8)) assert(get_variable('var9') == 'test2.txt') assert(not is_disabler(get_variable('var0'))) +assert(not is_disabler(get_variable('var0', var8))) +assert(not is_disabler(get_variable('----', var8))) # test dict get dict = {'a': var2} |