From 6ef2b434ba872d89449af2f15ad39b72f001ce1c Mon Sep 17 00:00:00 2001 From: Ben Deane Date: Tue, 14 Apr 2026 08:59:18 -0600 Subject: [PATCH] :bug: Fix parser imports in `regs2groov.py` Problem: - `regs2groov` uses `exec` which is a poor way to import functionality. Solution: - Use `importlib` instead. --- test/tools/CMakeLists.txt | 1 - test/tools/test_regs.py | 2 ++ tools/regs2groov.py | 21 +++++++++++++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/test/tools/CMakeLists.txt b/test/tools/CMakeLists.txt index a68be33..e7fcb17 100644 --- a/test/tools/CMakeLists.txt +++ b/test/tools/CMakeLists.txt @@ -12,7 +12,6 @@ generate_register_group( stdx INCLUDES "stdx/tuple.hpp" - "stdx/compiler.hpp" BUS "groov::mmio_bus<>" NAMESPACE diff --git a/test/tools/test_regs.py b/test/tools/test_regs.py index 1f81603..97106b1 100644 --- a/test/tools/test_regs.py +++ b/test/tools/test_regs.py @@ -1,3 +1,5 @@ +import groov + def test_parse(t): return { "test_regs": groov.Group( diff --git a/tools/regs2groov.py b/tools/regs2groov.py index 3c35b91..cbbd9a4 100644 --- a/tools/regs2groov.py +++ b/tools/regs2groov.py @@ -1,5 +1,8 @@ import argparse import groov +import importlib.util +from pathlib import Path +import sys def select_name_func(choice): @@ -15,7 +18,6 @@ def keep(s): return dict(keep=keep, lower=to_lower, upper=to_upper)[choice] -# def generate_groups(groups, ): def generate_groups(groups, config): namespace = config.namespace name_func = select_name_func(config.naming) @@ -52,11 +54,13 @@ def generate_group(g): with open(f"{config.output}", "w") as f: print("#pragma once", file=f) + print("", file=f) for include in includes: print(f"#include <{include}>", file=f) - + print("", file=f) print("#include ", file=f) print("#include ", file=f) + print("", file=f) print("#include ", file=f) print("", file=f) @@ -66,9 +70,17 @@ def generate_group(g): print(f"}} // namespace {namespace}", file=f) +def import_parser_modules(modules): + for m in modules: + module_name = Path(m).stem + spec = importlib.util.spec_from_file_location(module_name, m) + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + spec.loader.exec_module(module) + globals().update(vars(module)) + + def generate(config): - for f in config.parser_modules: - exec(open(f).read()) parse_fn = eval(config.parse_fn) groups = parse_fn(config.input) generate_groups(groups, config) @@ -139,6 +151,7 @@ def parse_cmdline(): def main(): args = parse_cmdline() + import_parser_modules(args.parser_modules) generate(args)