diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2025-01-08 13:09:25 +0100 |
|---|---|---|
| committer | Eli Schwartz <eschwartz93@gmail.com> | 2025-01-08 13:45:26 -0500 |
| commit | ff5b5e66c9a759573af5f265a3404c3a144489de (patch) | |
| tree | a66c6f9a43b0e8958260edb5c571dd4eb4185da9 | |
| parent | a3679a64eec7c312c81d657880f34f015426c7db (diff) | |
| download | meson-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.py | 2 | ||||
| -rw-r--r-- | mesonbuild/interpreterbase/interpreterbase.py | 2 | ||||
| -rw-r--r-- | mesonbuild/mparser.py | 5 |
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')), |
