From cf0fecfcef77235257546a43811559aa08b6c5de Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Thu, 18 Apr 2024 14:20:07 -0700 Subject: [PATCH] backend/ninja: Fix bug in NinjaRule.length_estimate The code would create a dictionary that was of type `str : list[str] | str | None`. Then would later try to call `len(' '.join(dict[key]))`. This would result in two different bugs: 1. If the value is `None` it would except, since None isn't iterable and cannot be converted to a string 2. If the value was a string, then it would double the length of the actual string and return that, by adding a space between each character --- mesonbuild/backend/ninjabackend.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 885a97e00..32a36a9ba 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -278,14 +278,13 @@ class NinjaRule: # determine variables # this order of actions only approximates ninja's scoping rules, as # documented at: https://ninja-build.org/manual.html#ref_scope - ninja_vars: T.Dict[str, T.Union[T.List[str], T.Optional[str]]] = {} - for e in elems: - name, value = e - ninja_vars[name] = value - ninja_vars['deps'] = self.deps - ninja_vars['depfile'] = self.depfile - ninja_vars['in'] = infiles - ninja_vars['out'] = outfiles + ninja_vars = dict(elems) + if self.deps is not None: + ninja_vars['deps'] = [self.deps] + if self.depfile is not None: + ninja_vars['depfile'] = [self.depfile] + ninja_vars['in'] = [infiles] + ninja_vars['out'] = [outfiles] # expand variables in command command = ' '.join([self._quoter(x) for x in self.command + self.args])