diff --git a/cmake/scripts/SquirrelExport.cmake b/cmake/scripts/SquirrelExport.cmake index f76a637fcc..9a12e74ed5 100644 --- a/cmake/scripts/SquirrelExport.cmake +++ b/cmake/scripts/SquirrelExport.cmake @@ -340,7 +340,7 @@ foreach(LINE IN LISTS SOURCE_LINES) endif() string(APPEND SQUIRREL_EXPORT "\n") - string(APPEND SQUIRREL_EXPORT "\ntemplate <> const char *GetClassName<${CLS}, ScriptType::${APIUC}>() { return \"${API_CLS}\"; }") + string(APPEND SQUIRREL_EXPORT "\ntemplate <> SQInteger PushClassName<${CLS}, ScriptType::${APIUC}>(HSQUIRRELVM vm) { sq_pushstring(vm, \"${API_CLS}\", -1); return 1; }") string(APPEND SQUIRREL_EXPORT "\n") # Then do the registration functions of the class. @@ -484,9 +484,8 @@ foreach(LINE IN LISTS SOURCE_LINES) string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.DefSQStaticMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\",${SPACES}${ARGC}, \"${TYPES}\");") endif() endforeach() - if(MLEN) - string(APPEND SQUIRREL_EXPORT "\n") - endif() + string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.DefSQAdvancedStaticMethod(engine, &PushClassName<${CLS}, ScriptType::${APIUC}>, \"_typeof\");") + string(APPEND SQUIRREL_EXPORT "\n") # Non-static methods set(MLEN 0) diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp index e05c97ab1e..dee74ea9b8 100644 --- a/src/ai/ai_info.cpp +++ b/src/ai/ai_info.cpp @@ -27,10 +27,7 @@ static bool CheckAPIVersion(const std::string &api_version) return std::ranges::find(AIInfo::ApiVersions, api_version) != std::end(AIInfo::ApiVersions); } -#if defined(_WIN32) -#undef GetClassName -#endif /* _WIN32 */ -template <> const char *GetClassName() { return "AIInfo"; } +template <> SQInteger PushClassName(HSQUIRRELVM vm) { sq_pushstring(vm, "AIInfo", -1); return 1; } /* static */ void AIInfo::RegisterAPI(Squirrel *engine) { @@ -38,6 +35,7 @@ template <> const char *GetClassName() { return "AIInfo" DefSQClass SQAIInfo("AIInfo"); SQAIInfo.PreRegister(engine); SQAIInfo.AddConstructor(engine, "x"); + SQAIInfo.DefSQAdvancedStaticMethod(engine, &PushClassName, "_typeof"); SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddSetting, "AddSetting"); SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddLabels, "AddLabels"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE"); diff --git a/src/game/game_info.cpp b/src/game/game_info.cpp index 03756e6e8f..0932077a8c 100644 --- a/src/game/game_info.cpp +++ b/src/game/game_info.cpp @@ -25,10 +25,7 @@ static bool CheckAPIVersion(const std::string &api_version) return std::ranges::find(GameInfo::ApiVersions, api_version) != std::end(GameInfo::ApiVersions); } -#if defined(_WIN32) -#undef GetClassName -#endif /* _WIN32 */ -template <> const char *GetClassName() { return "GSInfo"; } +template <> SQInteger PushClassName(HSQUIRRELVM vm) { sq_pushstring(vm, "GSInfo", -1); return 1; } /* static */ void GameInfo::RegisterAPI(Squirrel *engine) { @@ -36,6 +33,7 @@ template <> const char *GetClassName() { return "GSInf DefSQClass SQGSInfo("GSInfo"); SQGSInfo.PreRegister(engine); SQGSInfo.AddConstructor(engine, "x"); + SQGSInfo.DefSQAdvancedStaticMethod(engine, &PushClassName, "_typeof"); SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddSetting, "AddSetting"); SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddLabels, "AddLabels"); SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE"); diff --git a/src/script/api/ai/ai_controller.hpp.sq b/src/script/api/ai/ai_controller.hpp.sq index d37cb75b51..aea9e34aaa 100644 --- a/src/script/api/ai/ai_controller.hpp.sq +++ b/src/script/api/ai/ai_controller.hpp.sq @@ -7,13 +7,15 @@ #include "../script_controller.hpp" -template <> const char *GetClassName() { return "AIController"; } +template <> SQInteger PushClassName(HSQUIRRELVM vm) { sq_pushstring(vm, "AIController", -1); return 1; } void SQAIController_Register(Squirrel *engine) { DefSQClass SQAIController("AIController"); SQAIController.PreRegister(engine); + SQAIController.DefSQAdvancedStaticMethod(engine, &PushClassName, "_typeof"); + SQAIController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, "."); SQAIController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, "."); SQAIController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i"); diff --git a/src/script/api/game/game_controller.hpp.sq b/src/script/api/game/game_controller.hpp.sq index cbf61b89cd..e8d1831dea 100644 --- a/src/script/api/game/game_controller.hpp.sq +++ b/src/script/api/game/game_controller.hpp.sq @@ -7,13 +7,15 @@ #include "../script_controller.hpp" -template <> const char *GetClassName() { return "GSController"; } +template <> SQInteger PushClassName(HSQUIRRELVM vm) { sq_pushstring(vm, "GSController", -1); return 1; } void SQGSController_Register(Squirrel *engine) { DefSQClass SQGSController("GSController"); SQGSController.PreRegister(engine); + SQGSController.DefSQAdvancedStaticMethod(engine, &PushClassName, "_typeof"); + SQGSController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, "."); SQGSController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, "."); SQGSController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i"); diff --git a/src/script/squirrel_helper.hpp b/src/script/squirrel_helper.hpp index 3f93d8983a..fc4d1e4ad3 100644 --- a/src/script/squirrel_helper.hpp +++ b/src/script/squirrel_helper.hpp @@ -16,7 +16,7 @@ #include "../core/convertible_through_base.hpp" #include "squirrel_helper_type.hpp" -template const char *GetClassName(); +template SQInteger PushClassName(HSQUIRRELVM); /** * The Squirrel convert routines @@ -240,8 +240,7 @@ namespace SQConvert { /* Protect against calls to a non-static method in a static way */ sq_pushroottable(vm); - const char *className = GetClassName(); - sq_pushstring(vm, className, -1); + PushClassName(vm); sq_get(vm, -2); sq_pushobject(vm, instance); if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static"); @@ -284,8 +283,7 @@ namespace SQConvert { /* Protect against calls to a non-static method in a static way */ sq_pushroottable(vm); - const char *className = GetClassName(); - sq_pushstring(vm, className, -1); + PushClassName(vm); sq_get(vm, -2); sq_pushobject(vm, instance); if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static");