3636from .operator import MesonOperator
3737from ._unholder import _unholder
3838
39- import os , copy , hashlib , re , pathlib
39+ import contextlib , copy , hashlib , os , pathlib , re
4040import typing as T
4141import textwrap
4242
@@ -103,6 +103,20 @@ def handle_meson_version_from_ast(self) -> None:
103103 # do nothing in an AST interpreter
104104 return
105105
106+ @contextlib .contextmanager
107+ def set_tmp_project_meson_version (self ) -> T .Iterator [None ]:
108+ prev_meson_version = mesonlib .project_meson_versions [self .subproject ]
109+ if self .tmp_meson_version and isinstance (prev_meson_version , mesonlib .Range ):
110+ always = prev_meson_version .always (self .tmp_meson_version )
111+ if always is not None :
112+ mlog .warning (f"Conditional on version '{ self .tmp_meson_version } ' always evaluates to { str (always ).lower ()} " ,
113+ location = self .current_node )
114+ mesonlib .project_meson_versions [self .subproject ] = prev_meson_version .intersect (self .tmp_meson_version )
115+ try :
116+ yield
117+ finally :
118+ mesonlib .project_meson_versions [self .subproject ] = prev_meson_version
119+
106120 def read_buildfile (self , fname : str , errname : str ) -> str :
107121 try :
108122 with open (fname , encoding = 'utf-8' ) as f :
@@ -311,19 +325,10 @@ def evaluate_if(self, node: mparser.IfClauseNode) -> T.Optional[Disabler]:
311325 res = result .operator_call (MesonOperator .BOOL , None )
312326 if not isinstance (res , bool ):
313327 raise InvalidCode (f'If clause { result !r} does not evaluate to true or false.' )
314- prev_meson_version = mesonlib .project_meson_versions [self .subproject ]
315- if self .tmp_meson_version and isinstance (prev_meson_version , mesonlib .Range ):
316- always = prev_meson_version .always (self .tmp_meson_version )
317- if always is not None :
318- mlog .warning (f"Conditional on version '{ self .tmp_meson_version } ' always evaluates to { str (always ).lower ()} " ,
319- location = self .current_node )
320- mesonlib .project_meson_versions [self .subproject ] = prev_meson_version .intersect (self .tmp_meson_version )
321- try :
328+ with self .set_tmp_project_meson_version ():
322329 if res :
323330 self .evaluate_codeblock (i .block )
324331 return None
325- finally :
326- mesonlib .project_meson_versions [self .subproject ] = prev_meson_version
327332 if not isinstance (node .elseblock , mparser .EmptyNode ):
328333 self .evaluate_codeblock (node .elseblock .block )
329334 return None
@@ -415,6 +420,9 @@ def evaluate_arithmeticstatement(self, cur: mparser.ArithmeticNode) -> Interpret
415420 return self ._holderify (res )
416421
417422 def evaluate_ternary (self , node : mparser .TernaryNode ) -> T .Optional [InterpreterObject ]:
423+ # Reset self.tmp_meson_version to know if it gets set during this
424+ # statement evaluation.
425+ self .tmp_meson_version = None
418426 result = self .evaluate_statement (node .condition )
419427 if result is None :
420428 raise mesonlib .MesonException ('Cannot use a void statement as condition for ternary operator.' )
@@ -423,7 +431,8 @@ def evaluate_ternary(self, node: mparser.TernaryNode) -> T.Optional[InterpreterO
423431 result .current_node = node
424432 result_bool = result .operator_call (MesonOperator .BOOL , None )
425433 if result_bool :
426- return self .evaluate_statement (node .trueblock )
434+ with self .set_tmp_project_meson_version ():
435+ return self .evaluate_statement (node .trueblock )
427436 else :
428437 return self .evaluate_statement (node .falseblock )
429438
0 commit comments