From 242ace928a7ad6671d8284c742722d723c146fd9 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Mon, 13 May 2024 16:27:43 -0400 Subject: [PATCH] msetup: fix regression under py3.13 causing profile.runctx to not write locals() "PEP 667: Consistent views of namespaces" caused locals() to be inconsistent between uses since it is now created afresh every time you invoke it and writes to it are dropped. `sys._getframe().f_locals` is equivalent but preserves writes (it doesn't create a new dict) and unfortunately doesn't help at all as it's documented to be a private implementation detail of CPython that "should be used for internal and specialized purposes only". Work around this by saving locals to a variable reference and both passing it into runctx and reusing it in lookups of the result. This works okay for both new and older versions of python. Bug: https://github.com/python/cpython/pull/115153 --- mesonbuild/msetup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mesonbuild/msetup.py b/mesonbuild/msetup.py index c1d71e2e55e2..fa4f34556067 100644 --- a/mesonbuild/msetup.py +++ b/mesonbuild/msetup.py @@ -242,10 +242,11 @@ def _generate(self, env: environment.Environment, capture: bool, vslite_ctx: T.O self.finalize_postconf_hooks(b, intr) if self.options.profile: + localvars = locals() fname = f'profile-{intr.backend.name}-backend.log' fname = os.path.join(self.build_dir, 'meson-logs', fname) - profile.runctx('gen_result = intr.backend.generate(capture, vslite_ctx)', globals(), locals(), filename=fname) - captured_compile_args = locals()['gen_result'] + profile.runctx('gen_result = intr.backend.generate(capture, vslite_ctx)', globals(), localvars, filename=fname) + captured_compile_args = localvars['gen_result'] assert captured_compile_args is None or isinstance(captured_compile_args, dict) else: captured_compile_args = intr.backend.generate(capture, vslite_ctx)