From cd34861eace03193e10e149d2354a1a1e9c428ab Mon Sep 17 00:00:00 2001 From: John Magdy Lotfy Kamel <19735243+Zorono@users.noreply.github.com> Date: Thu, 30 Oct 2025 05:43:39 +0300 Subject: [PATCH 1/2] Refactor command array management with handles Refactor array handling to use handles instead of pointers, improving memory management and access. --- src/script.cc | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/script.cc b/src/script.cc index c0eb710..dfe6d6d 100644 --- a/src/script.cc +++ b/src/script.cc @@ -254,9 +254,15 @@ cell Script::NewCmdArray() { arr->push_back(item.first); } - cmd_arrays_.insert(arr); - - return reinterpret_cast(arr.get()); + cell handle = next_handle_++; + if (!free_handles_.empty()) { + handle = free_handles_.front(); + free_handles_.pop(); + } else { + handle = next_handle_++; + } + cmd_arrays_[handle] = arr; + return handle; } cell Script::NewAliasArray(const std::string &cmd_name) { @@ -273,23 +279,35 @@ cell Script::NewAliasArray(const std::string &cmd_name) { arr->push_back(item.first); } - cmd_arrays_.insert(arr); - - return reinterpret_cast(arr.get()); + cell handle; + if (!free_handles_.empty()) { + handle = free_handles_.front(); + free_handles_.pop(); + } else { + handle = next_handle_++; + } + cmd_arrays_[handle] = arr; + return handle; } -void Script::DeleteArray(cell arr) { cmd_arrays_.erase(GetCmdArray(arr)); } +bool Script::DeleteArray(cell handle) +{ + auto it = cmd_arrays_.find(handle); + if (it == cmd_arrays_.end()) { + return false; // invalid handle + } -const CmdArrayPtr &Script::GetCmdArray(cell ptr) { - const auto iter = std::find_if( - cmd_arrays_.begin(), cmd_arrays_.end(), - [ptr](const auto &p) { return reinterpret_cast(p.get()) == ptr; }); + // erase shared_ptr — automatically frees memory if no other refs exist + cmd_arrays_.erase(it); + return true; +} +const CmdArrayPtr &Script::GetCmdArray(cell handle) { + auto iter = cmd_arrays_.find(handle); if (iter == cmd_arrays_.end()) { throw std::runtime_error{"Invalid array handle"}; } - - return *iter; + return iter->second; } void Script::InitFlagsAndAliases() { From d4417b120e1edf51b2ce54ffa1b643a42407124c Mon Sep 17 00:00:00 2001 From: John Magdy Lotfy Kamel <19735243+Zorono@users.noreply.github.com> Date: Thu, 30 Oct 2025 05:45:14 +0300 Subject: [PATCH 2/2] Refactor DeleteArray and change cmd_arrays to map --- src/script.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/script.h b/src/script.h index fb998e7..22ea3e4 100644 --- a/src/script.h +++ b/src/script.h @@ -94,9 +94,9 @@ class Script : public ptl::AbstractScript