summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-01-08 13:09:25 +0100
committerEli Schwartz <eschwartz93@gmail.com>2025-01-08 13:45:26 -0500
commitff5b5e66c9a759573af5f265a3404c3a144489de (patch)
treea66c6f9a43b0e8958260edb5c571dd4eb4185da9
parenta3679a64eec7c312c81d657880f34f015426c7db (diff)
downloadmeson-ff5b5e66c9a759573af5f265a3404c3a144489de.tar.gz
optimize variable assignments
Except for set_variable(), the variable name is certainly an identifier because it comes from the parser; thus, the check is unnecessary. Move the regular expression match to func_set_variable(). Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--mesonbuild/interpreter/interpreter.py2
-rw-r--r--mesonbuild/interpreterbase/interpreterbase.py2
-rw-r--r--mesonbuild/mparser.py5
3 files changed, 6 insertions, 3 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 4933ba65a..4a878e54d 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -3520,6 +3520,8 @@ class Interpreter(InterpreterBase, HoldableObject):
@noSecondLevelHolderResolving
def func_set_variable(self, node: mparser.BaseNode, args: T.Tuple[str, object], kwargs: 'TYPE_kwargs') -> None:
varname, value = args
+ if mparser.IDENT_RE.fullmatch(varname) is None:
+ raise InvalidCode('Invalid variable name: ' + varname)
self.set_variable(varname, value, holderify=True)
@typed_pos_args('get_variable', (str, Disabler), optargs=[object])
diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py
index 5f9df4cb5..5849e9ca9 100644
--- a/mesonbuild/interpreterbase/interpreterbase.py
+++ b/mesonbuild/interpreterbase/interpreterbase.py
@@ -655,8 +655,6 @@ class InterpreterBase:
raise mesonlib.MesonBugException(f'set_variable in InterpreterBase called with a non InterpreterObject {variable} of type {type(variable).__name__}')
if not isinstance(varname, str):
raise InvalidCode('First argument to set_variable must be a string.')
- if re.match('[_a-zA-Z][_0-9a-zA-Z]*$', varname) is None:
- raise InvalidCode('Invalid variable name: ' + varname)
if varname in self.builtin:
raise InvalidCode(f'Tried to overwrite internal variable "{varname}"')
self.variables[varname] = variable
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py
index 4f4345546..0ffaceb7c 100644
--- a/mesonbuild/mparser.py
+++ b/mesonbuild/mparser.py
@@ -94,6 +94,9 @@ class Token(T.Generic[TV_TokenTypes]):
return self.tid == other.tid
return NotImplemented
+
+IDENT_RE = re.compile('[_a-zA-Z][_0-9a-zA-Z]*')
+
class Lexer:
def __init__(self, code: str):
if code.startswith(codecs.BOM_UTF8.decode('utf-8')):
@@ -113,7 +116,7 @@ class Lexer:
('whitespace', re.compile(r'[ \t]+')),
('multiline_fstring', re.compile(r"f'''(.|\n)*?'''", re.M)),
('fstring', re.compile(r"f'([^'\\]|(\\.))*'")),
- ('id', re.compile('[_a-zA-Z][_0-9a-zA-Z]*')),
+ ('id', IDENT_RE),
('number', re.compile(r'0[bB][01]+|0[oO][0-7]+|0[xX][0-9a-fA-F]+|0|[1-9]\d*')),
('eol_cont', re.compile(r'\\[ \t]*(#.*)?\n')),
('eol', re.compile(r'\n')),