From f5ebc767ab10beb9d5fdb0ba1bece5805f741771 Mon Sep 17 00:00:00 2001 From: CHatingPython Date: Sat, 4 Jul 2026 13:20:08 +0200 Subject: [PATCH] fix: fix module's function serialization Refs: #23 --- furvm/include/furvm/handle.hpp | 19 +++++++++++++++++++ furvm/src/module.cpp | 10 ++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/furvm/include/furvm/handle.hpp b/furvm/include/furvm/handle.hpp index 0dbcda1..0230ef2 100644 --- a/furvm/include/furvm/handle.hpp +++ b/furvm/include/furvm/handle.hpp @@ -308,6 +308,17 @@ public: delete it->second; m_pairs.erase(it); } + + /** + * @brief Checks whether a handle exists inside. + * + * @param id Identifier of the handle. + * @return true if the handle exists insdie of this container. + */ + template + constexpr bool contains(IdFwd&& id) const { + return m_pairs.find(std::forward(id)) != m_pairs.end(); + } private: std::unordered_map m_pairs; }; @@ -395,6 +406,14 @@ public: delete m_pairs[id]; m_pairs[id] = nullptr; } + + /** + * @brief Checks whether a handle exists inside. + * + * @param id Identifier of the handle. + * @return true if the handle exists insdie of this container. + */ + constexpr bool contains(id_type id) const { return id < m_pairs.size() && m_pairs[id] != nullptr; } public: auto begin() { return m_pairs.begin(); } auto begin() const { return m_pairs.begin(); } diff --git a/furvm/src/module.cpp b/furvm/src/module.cpp index 2267d0f..fcd272f 100644 --- a/furvm/src/module.cpp +++ b/furvm/src/module.cpp @@ -12,8 +12,14 @@ std::ostream& mod::serialize(std::ostream& os) const { detail::serialize(os, std::uint32_t(0)); // version detail::serialize(os, function_id(m_functionMap.size())); - for (auto* pair : m_functions) { - function_h func = { pair }; + for (function_id id = 0; id < m_functions.cend() - m_functions.cbegin(); ++id) { + if (!m_functions.contains(id)) { + detail::serialize(os, ""); + detail::serialize(os, std::uint8_t(0xFF)); // null function + continue; + } + + function_h func = m_functions.at(id); bool isPublic = m_publicFunctions.find(func->name()) != m_publicFunctions.end(); detail::serialize(os, isPublic ? func->name() : ""); // private functions have empty names detail::serialize(os, std::uint8_t(func->type()));