From 72ca962b84b63242b6266b345b2beb0e0853f659 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 24 Mar 2025 10:24:39 +0000 Subject: [PATCH] Codechange: Pass ScriptInstance by reference. --- src/script/api/script_asyncmode.cpp | 2 +- src/script/api/script_bridge.cpp | 4 +- src/script/api/script_controller.cpp | 14 +++---- src/script/api/script_execmode.cpp | 2 +- src/script/api/script_object.cpp | 16 +++---- src/script/api/script_object.hpp | 4 +- src/script/api/script_order.cpp | 2 +- src/script/api/script_priorityqueue.cpp | 6 +-- src/script/api/script_testmode.cpp | 2 +- src/script/api/script_tunnel.cpp | 4 +- src/script/script_instance.cpp | 56 ++++++++++++------------- src/script/script_instance.hpp | 18 ++++---- src/script/script_suspend.hpp | 2 +- src/tests/test_script_admin.cpp | 2 +- 14 files changed, 67 insertions(+), 67 deletions(-) diff --git a/src/script/api/script_asyncmode.cpp b/src/script/api/script_asyncmode.cpp index 4e95460e72..144d7c666b 100644 --- a/src/script/api/script_asyncmode.cpp +++ b/src/script/api/script_asyncmode.cpp @@ -49,7 +49,7 @@ void ScriptAsyncMode::FinalRelease() { if (this->GetDoCommandAsyncModeInstance() != this) { /* Ignore this error if the script is not alive. */ - if (ScriptObject::GetActiveInstance()->IsAlive()) { + if (ScriptObject::GetActiveInstance().IsAlive()) { throw Script_FatalError("Asyncmode object was removed while it was not the latest *Mode object created."); } } diff --git a/src/script/api/script_bridge.cpp b/src/script/api/script_bridge.cpp index 97bd0637f0..f96aaca887 100644 --- a/src/script/api/script_bridge.cpp +++ b/src/script/api/script_bridge.cpp @@ -43,7 +43,7 @@ * Helper function to connect a just built bridge to nearby roads. * @param instance The script instance we have to built the road for. */ -static void _DoCommandReturnBuildBridge2(class ScriptInstance *instance) +static void _DoCommandReturnBuildBridge2(class ScriptInstance &instance) { if (!ScriptBridge::_BuildBridgeRoad2()) { ScriptInstance::DoCommandReturn(instance); @@ -59,7 +59,7 @@ static void _DoCommandReturnBuildBridge2(class ScriptInstance *instance) * Helper function to connect a just built bridge to nearby roads. * @param instance The script instance we have to built the road for. */ -static void _DoCommandReturnBuildBridge1(class ScriptInstance *instance) +static void _DoCommandReturnBuildBridge1(class ScriptInstance &instance) { if (!ScriptBridge::_BuildBridgeRoad1()) { ScriptInstance::DoCommandReturn(instance); diff --git a/src/script/api/script_controller.cpp b/src/script/api/script_controller.cpp index 0f4160c8b4..4a09df2a1b 100644 --- a/src/script/api/script_controller.cpp +++ b/src/script/api/script_controller.cpp @@ -49,7 +49,7 @@ { if (_network_dedicated || !_settings_client.gui.ai_developer_tools) return; - ScriptObject::GetActiveInstance()->Pause(); + ScriptObject::GetActiveInstance().Pause(); ScriptLog::Log(ScriptLogTypes::LOG_SQ_ERROR, fmt::format("Break: {}", message)); @@ -76,17 +76,17 @@ ScriptController::ScriptController(::CompanyID company) : /* static */ uint ScriptController::GetTick() { - return ScriptObject::GetActiveInstance()->GetController()->ticks; + return ScriptObject::GetActiveInstance().GetController()->ticks; } /* static */ int ScriptController::GetOpsTillSuspend() { - return ScriptObject::GetActiveInstance()->GetOpsTillSuspend(); + return ScriptObject::GetActiveInstance().GetOpsTillSuspend(); } /* static */ int ScriptController::GetSetting(const std::string &name) { - return ScriptObject::GetActiveInstance()->GetSetting(name); + return ScriptObject::GetActiveInstance().GetSetting(name); } /* static */ uint ScriptController::GetVersion() @@ -96,11 +96,11 @@ ScriptController::ScriptController(::CompanyID company) : /* static */ HSQOBJECT ScriptController::Import(const std::string &library, const std::string &class_name, int version) { - ScriptController *controller = ScriptObject::GetActiveInstance()->GetController(); - Squirrel *engine = ScriptObject::GetActiveInstance()->engine; + ScriptController *controller = ScriptObject::GetActiveInstance().GetController(); + Squirrel *engine = ScriptObject::GetActiveInstance().engine; HSQUIRRELVM vm = engine->GetVM(); - ScriptInfo *lib = ScriptObject::GetActiveInstance()->FindLibrary(library, version); + ScriptInfo *lib = ScriptObject::GetActiveInstance().FindLibrary(library, version); if (lib == nullptr) { throw sq_throwerror(vm, fmt::format("couldn't find library '{}' with version {}", library, version)); } diff --git a/src/script/api/script_execmode.cpp b/src/script/api/script_execmode.cpp index 007dd1ef58..81275cb49d 100644 --- a/src/script/api/script_execmode.cpp +++ b/src/script/api/script_execmode.cpp @@ -32,7 +32,7 @@ void ScriptExecMode::FinalRelease() { if (this->GetDoCommandModeInstance() != this) { /* Ignore this error if the script is not alive. */ - if (ScriptObject::GetActiveInstance()->IsAlive()) { + if (ScriptObject::GetActiveInstance().IsAlive()) { throw Script_FatalError("ScriptExecMode object was removed while it was not the latest *Mode object created."); } } diff --git a/src/script/api/script_object.cpp b/src/script/api/script_object.cpp index a423f450a2..c801449b5b 100644 --- a/src/script/api/script_object.cpp +++ b/src/script/api/script_object.cpp @@ -46,16 +46,16 @@ void SimpleCountedObject::Release() */ static ScriptStorage *GetStorage() { - return ScriptObject::GetActiveInstance()->GetStorage(); + return ScriptObject::GetActiveInstance().GetStorage(); } /* static */ ScriptInstance *ScriptObject::ActiveInstance::active = nullptr; -ScriptObject::ActiveInstance::ActiveInstance(ScriptInstance *instance) : alc_scope(instance->engine) +ScriptObject::ActiveInstance::ActiveInstance(ScriptInstance &instance) : alc_scope(instance.engine) { this->last_active = ScriptObject::ActiveInstance::active; - ScriptObject::ActiveInstance::active = instance; + ScriptObject::ActiveInstance::active = &instance; } ScriptObject::ActiveInstance::~ActiveInstance() @@ -63,10 +63,10 @@ ScriptObject::ActiveInstance::~ActiveInstance() ScriptObject::ActiveInstance::active = this->last_active; } -/* static */ ScriptInstance *ScriptObject::GetActiveInstance() +/* static */ ScriptInstance &ScriptObject::GetActiveInstance() { assert(ScriptObject::ActiveInstance::active != nullptr); - return ScriptObject::ActiveInstance::active; + return *ScriptObject::ActiveInstance::active; } @@ -235,7 +235,7 @@ ScriptObject::ActiveInstance::~ActiveInstance() /* static */ bool ScriptObject::CanSuspend() { - Squirrel *squirrel = ScriptObject::GetActiveInstance()->engine; + Squirrel *squirrel = ScriptObject::GetActiveInstance().engine; return GetStorage()->allow_do_command && squirrel->CanSuspend(); } @@ -262,7 +262,7 @@ ScriptObject::ActiveInstance::~ActiveInstance() /* static */ CommandCallbackData *ScriptObject::GetDoCommandCallback() { - return ScriptObject::GetActiveInstance()->GetDoCommandCallback(); + return ScriptObject::GetActiveInstance().GetDoCommandCallback(); } std::tuple ScriptObject::DoCommandPrep() @@ -315,7 +315,7 @@ bool ScriptObject::DoCommandProcessResult(const CommandCost &res, Script_Suspend IncreaseDoCommandCosts(res.GetCost()); if (!_generating_world) { /* Charge a nominal fee for asynchronously executed commands */ - Squirrel *engine = ScriptObject::GetActiveInstance()->engine; + Squirrel *engine = ScriptObject::GetActiveInstance().engine; Squirrel::DecreaseOps(engine->GetVM(), 100); } if (callback != nullptr) { diff --git a/src/script/api/script_object.hpp b/src/script/api/script_object.hpp index 9f1ccd8227..6eef5537c8 100644 --- a/src/script/api/script_object.hpp +++ b/src/script/api/script_object.hpp @@ -75,7 +75,7 @@ protected: class ActiveInstance { friend class ScriptObject; public: - ActiveInstance(ScriptInstance *instance); + ActiveInstance(ScriptInstance &instance); ~ActiveInstance(); private: ScriptInstance *last_active; ///< The active instance before we go instantiated. @@ -117,7 +117,7 @@ public: * Get the currently active instance. * @return The instance. */ - static class ScriptInstance *GetActiveInstance(); + static class ScriptInstance &GetActiveInstance(); /** * Get a reference of the randomizer that brings this script random values. diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index bab0603ea5..6f9a018459 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -579,7 +579,7 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle * between the wanted and the current order. * @param instance The script instance we are doing the callback for. */ -static void _DoCommandReturnSetOrderFlags(class ScriptInstance *instance) +static void _DoCommandReturnSetOrderFlags(class ScriptInstance &instance) { ScriptObject::SetLastCommandRes(ScriptOrder::_SetOrderFlags()); ScriptInstance::DoCommandReturn(instance); diff --git a/src/script/api/script_priorityqueue.cpp b/src/script/api/script_priorityqueue.cpp index c9cdc82862..14fe6d59f2 100644 --- a/src/script/api/script_priorityqueue.cpp +++ b/src/script/api/script_priorityqueue.cpp @@ -26,9 +26,9 @@ static bool operator==(const ScriptPriorityQueue::PriorityItem &lhs, const HSQOB ScriptPriorityQueue::~ScriptPriorityQueue() { /* Release reference to stored objects. */ - auto inst = ScriptObject::GetActiveInstance(); - if (!inst->InShutdown()) { - for (auto &i : this->queue) inst->ReleaseSQObject(const_cast(&i.second)); + auto &inst = ScriptObject::GetActiveInstance(); + if (!inst.InShutdown()) { + for (auto &i : this->queue) inst.ReleaseSQObject(const_cast(&i.second)); } } diff --git a/src/script/api/script_testmode.cpp b/src/script/api/script_testmode.cpp index a38deff548..5d7e2eadd8 100644 --- a/src/script/api/script_testmode.cpp +++ b/src/script/api/script_testmode.cpp @@ -32,7 +32,7 @@ void ScriptTestMode::FinalRelease() { if (this->GetDoCommandModeInstance() != this) { /* Ignore this error if the script is not alive. */ - if (ScriptObject::GetActiveInstance()->IsAlive()) { + if (ScriptObject::GetActiveInstance().IsAlive()) { throw Script_FatalError("Testmode object was removed while it was not the latest *Mode object created."); } } diff --git a/src/script/api/script_tunnel.cpp b/src/script/api/script_tunnel.cpp index 2703922d27..ce7877dd8a 100644 --- a/src/script/api/script_tunnel.cpp +++ b/src/script/api/script_tunnel.cpp @@ -51,7 +51,7 @@ * Helper function to connect a just built tunnel to nearby roads. * @param instance The script instance we have to built the road for. */ -static void _DoCommandReturnBuildTunnel2(class ScriptInstance *instance) +static void _DoCommandReturnBuildTunnel2(class ScriptInstance &instance) { if (!ScriptTunnel::_BuildTunnelRoad2()) { ScriptInstance::DoCommandReturn(instance); @@ -67,7 +67,7 @@ static void _DoCommandReturnBuildTunnel2(class ScriptInstance *instance) * Helper function to connect a just built tunnel to nearby roads. * @param instance The script instance we have to built the road for. */ -static void _DoCommandReturnBuildTunnel1(class ScriptInstance *instance) +static void _DoCommandReturnBuildTunnel1(class ScriptInstance &instance) { if (!ScriptTunnel::_BuildTunnelRoad1()) { ScriptInstance::DoCommandReturn(instance); diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp index 878ea3d694..53fa244c0d 100644 --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -55,7 +55,7 @@ ScriptInstance::ScriptInstance(std::string_view api_name) void ScriptInstance::Initialize(const std::string &main_script, const std::string &instance_name, CompanyID company) { - ScriptObject::ActiveInstance active(this); + ScriptObject::ActiveInstance active(*this); this->controller = new ScriptController(company); @@ -142,7 +142,7 @@ bool ScriptInstance::LoadCompatibilityScripts(Subdirectory dir, std::spanin_shutdown = true; if (instance != nullptr) this->engine->ReleaseObject(this->instance); @@ -175,7 +175,7 @@ void ScriptInstance::Died() void ScriptInstance::GameLoop() { - ScriptObject::ActiveInstance active(this); + ScriptObject::ActiveInstance active(*this); if (this->IsDead()) return; if (this->engine->HasScriptCrashed()) { @@ -199,7 +199,7 @@ void ScriptInstance::GameLoop() this->is_save_data_on_stack = false; } try { - this->callback(this); + this->callback(*this); } catch (Script_Suspend &e) { this->suspend = e.GetSuspendTime(); this->callback = e.GetSuspendCallback(); @@ -265,54 +265,54 @@ void ScriptInstance::GameLoop() void ScriptInstance::CollectGarbage() { if (this->is_started && !this->IsDead()) { - ScriptObject::ActiveInstance active(this); + ScriptObject::ActiveInstance active(*this); this->engine->CollectGarbage(); } } -/* static */ void ScriptInstance::DoCommandReturn(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturn(ScriptInstance &instance) { - instance->engine->InsertResult(ScriptObject::GetLastCommandRes()); + instance.engine->InsertResult(ScriptObject::GetLastCommandRes()); } -/* static */ void ScriptInstance::DoCommandReturnVehicleID(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturnVehicleID(ScriptInstance &instance) { - instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); + instance.engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } -/* static */ void ScriptInstance::DoCommandReturnSignID(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturnSignID(ScriptInstance &instance) { - instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); + instance.engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } -/* static */ void ScriptInstance::DoCommandReturnGroupID(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturnGroupID(ScriptInstance &instance) { - instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); + instance.engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } -/* static */ void ScriptInstance::DoCommandReturnGoalID(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturnGoalID(ScriptInstance &instance) { - instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); + instance.engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } -/* static */ void ScriptInstance::DoCommandReturnStoryPageID(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturnStoryPageID(ScriptInstance &instance) { - instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); + instance.engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } -/* static */ void ScriptInstance::DoCommandReturnStoryPageElementID(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturnStoryPageElementID(ScriptInstance &instance) { - instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); + instance.engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } -/* static */ void ScriptInstance::DoCommandReturnLeagueTableElementID(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturnLeagueTableElementID(ScriptInstance &instance) { - instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); + instance.engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } -/* static */ void ScriptInstance::DoCommandReturnLeagueTableID(ScriptInstance *instance) +/* static */ void ScriptInstance::DoCommandReturnLeagueTableID(ScriptInstance &instance) { - instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); + instance.engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } @@ -323,7 +323,7 @@ ScriptStorage *ScriptInstance::GetStorage() ScriptLogTypes::LogData &ScriptInstance::GetLogData() { - ScriptObject::ActiveInstance active(this); + ScriptObject::ActiveInstance active(*this); return ScriptObject::GetLogData(); } @@ -501,7 +501,7 @@ static const SaveLoad _script_byte[] = { void ScriptInstance::Save() { - ScriptObject::ActiveInstance active(this); + ScriptObject::ActiveInstance active(*this); /* Don't save data if the script didn't start yet or if it crashed. */ if (this->engine == nullptr || this->engine->HasScriptCrashed()) { @@ -739,7 +739,7 @@ bool ScriptInstance::IsPaused() void ScriptInstance::LoadOnStack(ScriptData *data) { - ScriptObject::ActiveInstance active(this); + ScriptObject::ActiveInstance active(*this); if (this->IsDead() || data == nullptr) return; @@ -803,7 +803,7 @@ SQInteger ScriptInstance::GetOpsTillSuspend() bool ScriptInstance::DoCommandCallback(const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data, Commands cmd) { - ScriptObject::ActiveInstance active(this); + ScriptObject::ActiveInstance active(*this); if (!ScriptObject::CheckLastCommand(data, cmd)) { Debug(script, 1, "DoCommandCallback terminating a script, last command does not match expected command"); @@ -827,7 +827,7 @@ bool ScriptInstance::DoCommandCallback(const CommandCost &result, const CommandD void ScriptInstance::InsertEvent(class ScriptEvent *event) { - ScriptObject::ActiveInstance active(this); + ScriptObject::ActiveInstance active(*this); ScriptEventController::InsertEvent(event); } diff --git a/src/script/script_instance.hpp b/src/script/script_instance.hpp index c5f0746fb0..247d89363a 100644 --- a/src/script/script_instance.hpp +++ b/src/script/script_instance.hpp @@ -101,47 +101,47 @@ public: /** * Return a true/false reply for a DoCommand. */ - static void DoCommandReturn(ScriptInstance *instance); + static void DoCommandReturn(ScriptInstance &instance); /** * Return a VehicleID reply for a DoCommand. */ - static void DoCommandReturnVehicleID(ScriptInstance *instance); + static void DoCommandReturnVehicleID(ScriptInstance &instance); /** * Return a SignID reply for a DoCommand. */ - static void DoCommandReturnSignID(ScriptInstance *instance); + static void DoCommandReturnSignID(ScriptInstance &instance); /** * Return a GroupID reply for a DoCommand. */ - static void DoCommandReturnGroupID(ScriptInstance *instance); + static void DoCommandReturnGroupID(ScriptInstance &instance); /** * Return a GoalID reply for a DoCommand. */ - static void DoCommandReturnGoalID(ScriptInstance *instance); + static void DoCommandReturnGoalID(ScriptInstance &instance); /** * Return a StoryPageID reply for a DoCommand. */ - static void DoCommandReturnStoryPageID(ScriptInstance *instance); + static void DoCommandReturnStoryPageID(ScriptInstance &instance); /** * Return a StoryPageElementID reply for a DoCommand. */ - static void DoCommandReturnStoryPageElementID(ScriptInstance *instance); + static void DoCommandReturnStoryPageElementID(ScriptInstance &instance); /** * Return a LeagueTableID reply for a DoCommand. */ - static void DoCommandReturnLeagueTableID(ScriptInstance *instance); + static void DoCommandReturnLeagueTableID(ScriptInstance &instance); /** * Return a LeagueTableElementID reply for a DoCommand. */ - static void DoCommandReturnLeagueTableElementID(ScriptInstance *instance); + static void DoCommandReturnLeagueTableElementID(ScriptInstance &instance); /** * Get the controller attached to the instance. diff --git a/src/script/script_suspend.hpp b/src/script/script_suspend.hpp index c8a4501f30..1692c5b408 100644 --- a/src/script/script_suspend.hpp +++ b/src/script/script_suspend.hpp @@ -13,7 +13,7 @@ /** * The callback function when a script suspends. */ -typedef void (Script_SuspendCallbackProc)(class ScriptInstance *instance); +typedef void (Script_SuspendCallbackProc)(class ScriptInstance &instance); /** * A throw-class that is given when the script wants to suspend. diff --git a/src/tests/test_script_admin.cpp b/src/tests/test_script_admin.cpp index b498ca2200..c8bf48c584 100644 --- a/src/tests/test_script_admin.cpp +++ b/src/tests/test_script_admin.cpp @@ -37,7 +37,7 @@ class TestScriptController { public: GameInstance game{}; - ScriptObject::ActiveInstance active{&game}; + ScriptObject::ActiveInstance active{game}; Squirrel engine{"test"}; ScriptAllocatorScope scope{&engine};