1
0
Fork 0

Add: [Scripts] "_typeof" metamethod

pull/13610/head
glx22 2025-02-17 16:39:14 +01:00 committed by Loïc Guilloux
parent 35e58f68e4
commit d7bd67cda3
6 changed files with 16 additions and 19 deletions

View File

@ -340,7 +340,7 @@ foreach(LINE IN LISTS SOURCE_LINES)
endif() endif()
string(APPEND SQUIRREL_EXPORT "\n") 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") string(APPEND SQUIRREL_EXPORT "\n")
# Then do the registration functions of the class. # 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}\");") string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.DefSQStaticMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\",${SPACES}${ARGC}, \"${TYPES}\");")
endif() endif()
endforeach() endforeach()
if(MLEN) string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.DefSQAdvancedStaticMethod(engine, &PushClassName<${CLS}, ScriptType::${APIUC}>, \"_typeof\");")
string(APPEND SQUIRREL_EXPORT "\n") string(APPEND SQUIRREL_EXPORT "\n")
endif()
# Non-static methods # Non-static methods
set(MLEN 0) set(MLEN 0)

View File

@ -27,10 +27,7 @@ static bool CheckAPIVersion(const std::string &api_version)
return std::ranges::find(AIInfo::ApiVersions, api_version) != std::end(AIInfo::ApiVersions); return std::ranges::find(AIInfo::ApiVersions, api_version) != std::end(AIInfo::ApiVersions);
} }
#if defined(_WIN32) template <> SQInteger PushClassName<AIInfo, ScriptType::AI>(HSQUIRRELVM vm) { sq_pushstring(vm, "AIInfo", -1); return 1; }
#undef GetClassName
#endif /* _WIN32 */
template <> const char *GetClassName<AIInfo, ScriptType::AI>() { return "AIInfo"; }
/* static */ void AIInfo::RegisterAPI(Squirrel *engine) /* static */ void AIInfo::RegisterAPI(Squirrel *engine)
{ {
@ -38,6 +35,7 @@ template <> const char *GetClassName<AIInfo, ScriptType::AI>() { return "AIInfo"
DefSQClass<AIInfo, ScriptType::AI> SQAIInfo("AIInfo"); DefSQClass<AIInfo, ScriptType::AI> SQAIInfo("AIInfo");
SQAIInfo.PreRegister(engine); SQAIInfo.PreRegister(engine);
SQAIInfo.AddConstructor<void (AIInfo::*)(), 1>(engine, "x"); SQAIInfo.AddConstructor<void (AIInfo::*)(), 1>(engine, "x");
SQAIInfo.DefSQAdvancedStaticMethod(engine, &PushClassName<AIInfo, ScriptType::AI>, "_typeof");
SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddSetting, "AddSetting"); SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddSetting, "AddSetting");
SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddLabels, "AddLabels"); SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddLabels, "AddLabels");
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE");

View File

@ -25,10 +25,7 @@ static bool CheckAPIVersion(const std::string &api_version)
return std::ranges::find(GameInfo::ApiVersions, api_version) != std::end(GameInfo::ApiVersions); return std::ranges::find(GameInfo::ApiVersions, api_version) != std::end(GameInfo::ApiVersions);
} }
#if defined(_WIN32) template <> SQInteger PushClassName<GameInfo, ScriptType::GS>(HSQUIRRELVM vm) { sq_pushstring(vm, "GSInfo", -1); return 1; }
#undef GetClassName
#endif /* _WIN32 */
template <> const char *GetClassName<GameInfo, ScriptType::GS>() { return "GSInfo"; }
/* static */ void GameInfo::RegisterAPI(Squirrel *engine) /* static */ void GameInfo::RegisterAPI(Squirrel *engine)
{ {
@ -36,6 +33,7 @@ template <> const char *GetClassName<GameInfo, ScriptType::GS>() { return "GSInf
DefSQClass<GameInfo, ScriptType::GS> SQGSInfo("GSInfo"); DefSQClass<GameInfo, ScriptType::GS> SQGSInfo("GSInfo");
SQGSInfo.PreRegister(engine); SQGSInfo.PreRegister(engine);
SQGSInfo.AddConstructor<void (GameInfo::*)(), 1>(engine, "x"); SQGSInfo.AddConstructor<void (GameInfo::*)(), 1>(engine, "x");
SQGSInfo.DefSQAdvancedStaticMethod(engine, &PushClassName<GameInfo, ScriptType::GS>, "_typeof");
SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddSetting, "AddSetting"); SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddSetting, "AddSetting");
SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddLabels, "AddLabels"); SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddLabels, "AddLabels");
SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE"); SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE");

View File

@ -7,13 +7,15 @@
#include "../script_controller.hpp" #include "../script_controller.hpp"
template <> const char *GetClassName<ScriptController, ScriptType::AI>() { return "AIController"; } template <> SQInteger PushClassName<ScriptController, ScriptType::AI>(HSQUIRRELVM vm) { sq_pushstring(vm, "AIController", -1); return 1; }
void SQAIController_Register(Squirrel *engine) void SQAIController_Register(Squirrel *engine)
{ {
DefSQClass<ScriptController, ScriptType::AI> SQAIController("AIController"); DefSQClass<ScriptController, ScriptType::AI> SQAIController("AIController");
SQAIController.PreRegister(engine); SQAIController.PreRegister(engine);
SQAIController.DefSQAdvancedStaticMethod(engine, &PushClassName<ScriptController, ScriptType::AI>, "_typeof");
SQAIController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, "."); SQAIController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, ".");
SQAIController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, "."); SQAIController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, ".");
SQAIController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i"); SQAIController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i");

View File

@ -7,13 +7,15 @@
#include "../script_controller.hpp" #include "../script_controller.hpp"
template <> const char *GetClassName<ScriptController, ScriptType::GS>() { return "GSController"; } template <> SQInteger PushClassName<ScriptController, ScriptType::GS>(HSQUIRRELVM vm) { sq_pushstring(vm, "GSController", -1); return 1; }
void SQGSController_Register(Squirrel *engine) void SQGSController_Register(Squirrel *engine)
{ {
DefSQClass<ScriptController, ScriptType::GS> SQGSController("GSController"); DefSQClass<ScriptController, ScriptType::GS> SQGSController("GSController");
SQGSController.PreRegister(engine); SQGSController.PreRegister(engine);
SQGSController.DefSQAdvancedStaticMethod(engine, &PushClassName<ScriptController, ScriptType::GS>, "_typeof");
SQGSController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, "."); SQGSController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, ".");
SQGSController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, "."); SQGSController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, ".");
SQGSController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i"); SQGSController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i");

View File

@ -16,7 +16,7 @@
#include "../core/convertible_through_base.hpp" #include "../core/convertible_through_base.hpp"
#include "squirrel_helper_type.hpp" #include "squirrel_helper_type.hpp"
template <class CL, ScriptType ST> const char *GetClassName(); template <class CL, ScriptType ST> SQInteger PushClassName(HSQUIRRELVM);
/** /**
* The Squirrel convert routines * The Squirrel convert routines
@ -240,8 +240,7 @@ namespace SQConvert {
/* Protect against calls to a non-static method in a static way */ /* Protect against calls to a non-static method in a static way */
sq_pushroottable(vm); sq_pushroottable(vm);
const char *className = GetClassName<Tcls, Ttype>(); PushClassName<Tcls, Ttype>(vm);
sq_pushstring(vm, className, -1);
sq_get(vm, -2); sq_get(vm, -2);
sq_pushobject(vm, instance); sq_pushobject(vm, instance);
if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static"); 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 */ /* Protect against calls to a non-static method in a static way */
sq_pushroottable(vm); sq_pushroottable(vm);
const char *className = GetClassName<Tcls, Ttype>(); PushClassName<Tcls, Ttype>(vm);
sq_pushstring(vm, className, -1);
sq_get(vm, -2); sq_get(vm, -2);
sq_pushobject(vm, instance); sq_pushobject(vm, instance);
if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static"); if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static");