diff options
Diffstat (limited to 'mesonbuild/interpreterbase')
-rw-r--r-- | mesonbuild/interpreterbase/__init__.py | 3 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/baseobjects.py | 12 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/decorators.py | 9 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/helpers.py | 12 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/interpreterbase.py | 10 |
5 files changed, 24 insertions, 22 deletions
diff --git a/mesonbuild/interpreterbase/__init__.py b/mesonbuild/interpreterbase/__init__.py index d4c4a36..0375430 100644 --- a/mesonbuild/interpreterbase/__init__.py +++ b/mesonbuild/interpreterbase/__init__.py @@ -31,7 +31,6 @@ __all__ = [ 'ContinueRequest', 'BreakRequest', - 'check_stringlist', 'default_resolve_key', 'flatten', 'resolve_second_level_holders', @@ -127,6 +126,6 @@ from .exceptions import ( ) from .disabler import Disabler, is_disabled -from .helpers import check_stringlist, default_resolve_key, flatten, resolve_second_level_holders +from .helpers import default_resolve_key, flatten, resolve_second_level_holders from .interpreterbase import InterpreterBase from .operator import MesonOperator diff --git a/mesonbuild/interpreterbase/baseobjects.py b/mesonbuild/interpreterbase/baseobjects.py index c979f7d..62a2381 100644 --- a/mesonbuild/interpreterbase/baseobjects.py +++ b/mesonbuild/interpreterbase/baseobjects.py @@ -168,12 +168,18 @@ class RangeHolder(MesonInterpreterObject): def __init__(self, start: int, stop: int, step: int, *, subproject: str) -> None: super().__init__(subproject=subproject) self.range = range(start, stop, step) + self.operators.update({ + MesonOperator.INDEX: self.op_index, + }) + + def op_index(self, other: int) -> int: + try: + return self.range[other] + except: + raise InvalidArguments(f'Index {other} out of bounds of range.') def __iter__(self) -> T.Iterator[int]: return iter(self.range) - def __getitem__(self, key: int) -> int: - return self.range[key] - def __len__(self) -> int: return len(self.range) diff --git a/mesonbuild/interpreterbase/decorators.py b/mesonbuild/interpreterbase/decorators.py index b9c4a1f..54f4be3 100644 --- a/mesonbuild/interpreterbase/decorators.py +++ b/mesonbuild/interpreterbase/decorators.py @@ -16,7 +16,6 @@ from .. import mesonlib, mlog from .baseobjects import TV_func, TYPE_var, TYPE_kwargs from .disabler import Disabler from .exceptions import InterpreterException, InvalidArguments -from .helpers import check_stringlist from .operator import MesonOperator from ._unholder import _unholder @@ -64,8 +63,12 @@ def stringArgs(f: TV_func) -> TV_func: @wraps(f) def wrapped(*wrapped_args: T.Any, **wrapped_kwargs: T.Any) -> T.Any: args = get_callee_args(wrapped_args)[1] - assert isinstance(args, list) - check_stringlist(args) + if not isinstance(args, list): + mlog.debug('Not a list:', str(args)) + raise InvalidArguments('Argument not a list.') + if not all(isinstance(s, str) for s in args): + mlog.debug('Element not a string:', str(args)) + raise InvalidArguments('Arguments must be strings.') return f(*wrapped_args, **wrapped_kwargs) return T.cast(TV_func, wrapped) diff --git a/mesonbuild/interpreterbase/helpers.py b/mesonbuild/interpreterbase/helpers.py index 3d45e1f..12fa813 100644 --- a/mesonbuild/interpreterbase/helpers.py +++ b/mesonbuild/interpreterbase/helpers.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from .. import mesonlib, mparser, mlog -from .exceptions import InvalidArguments, InterpreterException +from .. import mesonlib, mparser +from .exceptions import InterpreterException import collections.abc import typing as T @@ -49,14 +49,6 @@ def resolve_second_level_holders(args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs' return arg return [resolver(x) for x in args], {k: resolver(v) for k, v in kwargs.items()} -def check_stringlist(a: T.Any, msg: str = 'Arguments must be strings.') -> None: - if not isinstance(a, list): - mlog.debug('Not a list:', str(a)) - raise InvalidArguments('Argument not a list.') - if not all(isinstance(s, str) for s in a): - mlog.debug('Element not a string:', str(a)) - raise InvalidArguments(msg) - def default_resolve_key(key: mparser.BaseNode) -> str: if not isinstance(key, mparser.IdNode): raise InterpreterException('Invalid kwargs format.') diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py index 9ae50c8..4b4b3c0 100644 --- a/mesonbuild/interpreterbase/interpreterbase.py +++ b/mesonbuild/interpreterbase/interpreterbase.py @@ -44,7 +44,7 @@ from .exceptions import ( from .decorators import FeatureNew, noKwargs from .disabler import Disabler, is_disabled -from .helpers import check_stringlist, default_resolve_key, flatten, resolve_second_level_holders +from .helpers import default_resolve_key, flatten, resolve_second_level_holders from .operator import MesonOperator from ._unholder import _unholder @@ -579,11 +579,13 @@ class InterpreterBase: iobject = self.evaluate_statement(node.iobject) if isinstance(iobject, Disabler): return iobject + index = _unholder(self.evaluate_statement(node.index)) + + if isinstance(iobject, InterpreterObject): + return self._holderify(iobject.operator_call(MesonOperator.INDEX, index)) if not hasattr(iobject, '__getitem__'): raise InterpreterException( 'Tried to index an object that doesn\'t support indexing.') - index = _unholder(self.evaluate_statement(node.index)) - if isinstance(iobject, dict): if not isinstance(index, str): raise InterpreterException('Key is not a string') @@ -887,7 +889,7 @@ To specify a keyword argument, use : instead of =.''') raise InvalidCode('Unknown variable "%s".' % varname) def is_assignable(self, value: T.Any) -> bool: - return isinstance(value, (InterpreterObject, str, int, list, dict)) + return isinstance(value, (InterpreterObject, list, dict)) def validate_extraction(self, buildtarget: mesonlib.HoldableObject) -> None: raise InterpreterException('validate_extraction is not implemented in this context (please file a bug)') |