From 2cd0baf22b151325d8a493cf3fc5b96df1b8f6a9 Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Fri, 17 Oct 2025 16:04:50 +0530 Subject: [PATCH 1/4] Add Modules Request --- src/xdebugger.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/xdebugger.cpp b/src/xdebugger.cpp index 95c98e5e..ec510c20 100644 --- a/src/xdebugger.cpp +++ b/src/xdebugger.cpp @@ -369,4 +369,43 @@ namespace xpyt return std::unique_ptr(new debugger(context, config, user_name, session_id, debugger_config)); } + + nl::json debugger::modules(const nl::json& message) + { + py::module sys = py::module::import("sys"); + py::list modules = sys.attr("modules").attr("values")(); + + int start_module = message.value("startModule", 0); + int module_count = message.value("moduleCount", static_cast(py::len(modules))); + + nl::json mods = nl::json::array(); + for (int i = start_module; i < module_count && i < static_cast(py::len(modules)); ++i) + { + py::object module = modules[i]; + py::object spec = getattr(module, "__spec__", py::none()); + py::object origin = py::none(); + if (!spec.is_none()) + origin = getattr(spec, "origin", py::none()); + + if (!origin.is_none()) + { + std::string filename = py::str(origin); + if (filename.size() > 3 && filename.substr(filename.size() - 3) == ".py") + { + mods.push_back({ + {"id", i}, + {"name", py::str(module.attr("__name__"))}, + {"path", filename} + }); + } + } + } + + return { + {"body", { + {"modules", mods}, + {"totalModules", py::len(modules)} + }} + }; + } } From 9f62edd8b3686b206ca1ef37c1f47395509b38b6 Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Fri, 17 Oct 2025 17:45:19 +0530 Subject: [PATCH 2/4] Register Modules Request --- src/xdebugger.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/xdebugger.cpp b/src/xdebugger.cpp index ec510c20..f1d2af41 100644 --- a/src/xdebugger.cpp +++ b/src/xdebugger.cpp @@ -66,6 +66,8 @@ namespace xpyt register_request_handler("attach", std::bind(&debugger::attach_request, this, _1), true); register_request_handler("configurationDone", std::bind(&debugger::configuration_done_request, this, _1), true); register_request_handler("copyToGlobals", std::bind(&debugger::copy_to_globals_request, this, _1), true); + register_request_handler("modules", std::bind(&debugger::modules, this, _1), false); + } debugger::~debugger() From ac842ec00de1ea240a111eb0ee164c9d6053144b Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Fri, 17 Oct 2025 17:52:32 +0530 Subject: [PATCH 3/4] Add modules request declaration in `xdebugger.hpp` --- include/xeus-python/xdebugger.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/xeus-python/xdebugger.hpp b/include/xeus-python/xdebugger.hpp index 6a7e2056..a7268818 100644 --- a/include/xeus-python/xdebugger.hpp +++ b/include/xeus-python/xdebugger.hpp @@ -55,6 +55,7 @@ namespace xpyt nl::json attach_request(const nl::json& message); nl::json configuration_done_request(const nl::json& message); nl::json copy_to_globals_request(const nl::json& message); + nl::json modules(const nl::json& message); nl::json variables_request_impl(const nl::json& message) override; From 6d5edbcca366ea30e2b92f4d186642fa8e3363d3 Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Fri, 17 Oct 2025 18:26:57 +0530 Subject: [PATCH 4/4] Acquire GIL in modules request --- src/xdebugger.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xdebugger.cpp b/src/xdebugger.cpp index f1d2af41..700e4702 100644 --- a/src/xdebugger.cpp +++ b/src/xdebugger.cpp @@ -374,6 +374,7 @@ namespace xpyt nl::json debugger::modules(const nl::json& message) { + py::gil_scoped_acquire acquire; py::module sys = py::module::import("sys"); py::list modules = sys.attr("modules").attr("values")();