diff --git a/src/3rdparty/squirrel/include/squirrel.h b/src/3rdparty/squirrel/include/squirrel.h index b09d9993a1..97f24ea338 100644 --- a/src/3rdparty/squirrel/include/squirrel.h +++ b/src/3rdparty/squirrel/include/squirrel.h @@ -185,7 +185,7 @@ typedef struct tagSQRegFunction{ std::string_view name; SQFUNCTION f; SQInteger nparamscheck; - const SQChar *typemask; + std::optional typemask; }SQRegFunction; typedef struct tagSQFunctionInfo { @@ -235,7 +235,7 @@ SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size); void sq_newtable(HSQUIRRELVM v); void sq_newarray(HSQUIRRELVM v,SQInteger size); void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars); -SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask); +SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,std::optional typemask); SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx); void sq_pushstring(HSQUIRRELVM v, std::string_view str); void sq_pushfloat(HSQUIRRELVM v,SQFloat f); diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp index d99b32cfff..5345f9b21b 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp @@ -84,7 +84,7 @@ static const std::initializer_list mathlib_funcs = { _DECL_FUNC(exp,2,".n"), #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS _DECL_FUNC(srand,2,".n"), - _DECL_FUNC(rand,1,nullptr), + _DECL_FUNC(rand,1,std::nullopt), #endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */ _DECL_FUNC(fabs,2,".n"), _DECL_FUNC(abs,2,".n"), diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp index be1b9cd88d..2227ad0212 100644 --- a/src/3rdparty/squirrel/squirrel/sqapi.cpp +++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp @@ -385,16 +385,16 @@ SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,std::string_view na return sq_throwerror(v,"the object is not a nativeclosure"); } -SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask) +SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,std::optional typemask) { SQObject o = stack_get(v, -1); if(!sq_isnativeclosure(o)) return sq_throwerror(v, "native closure expected"); SQNativeClosure *nc = _nativeclosure(o); nc->_nparamscheck = nparamscheck; - if(typemask) { + if(typemask.has_value()) { SQIntVec res; - if(!CompileTypemask(res, typemask)) + if(!CompileTypemask(res, *typemask)) return sq_throwerror(v, "invalid typemask"); nc->_typecheck.copy(res); } diff --git a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp index 4bc7672191..7c71f19cff 100644 --- a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp +++ b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp @@ -241,26 +241,26 @@ static SQInteger base_type(HSQUIRRELVM v) static const std::initializer_list base_funcs={ //generic #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS - {"seterrorhandler",base_seterrorhandler,2, nullptr}, - {"setdebughook",base_setdebughook,2, nullptr}, - {"enabledebuginfo",base_enabledebuginfo,2, nullptr}, + {"seterrorhandler",base_seterrorhandler,2, std::nullopt}, + {"setdebughook",base_setdebughook,2, std::nullopt}, + {"enabledebuginfo",base_enabledebuginfo,2, std::nullopt}, {"getstackinfos",base_getstackinfos,2, ".n"}, - {"getroottable",base_getroottable,1, nullptr}, - {"setroottable",base_setroottable,2, nullptr}, - {"getconsttable",base_getconsttable,1, nullptr}, - {"setconsttable",base_setconsttable,2, nullptr}, + {"getroottable",base_getroottable,1, std::nullopt}, + {"setroottable",base_setroottable,2, std::nullopt}, + {"getconsttable",base_getconsttable,1, std::nullopt}, + {"setconsttable",base_setconsttable,2, std::nullopt}, #endif - {"assert",base_assert,2, nullptr}, - {"print",base_print,2, nullptr}, + {"assert",base_assert,2, std::nullopt}, + {"print",base_print,2, std::nullopt}, #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS {"compilestring",base_compilestring,-2, ".ss"}, {"newthread",base_newthread,2, ".c"}, - {"suspend",base_suspend,-1, nullptr}, + {"suspend",base_suspend,-1, std::nullopt}, #endif {"array",base_array,-2, ".n"}, - {"type",base_type,2, nullptr}, + {"type",base_type,2, std::nullopt}, #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS - {"dummy",base_dummy,0,nullptr}, + {"dummy",base_dummy,0,std::nullopt}, #ifndef NO_GARBAGE_COLLECTOR {"collectgarbage",base_collectgarbage,1, "t"}, #endif @@ -414,7 +414,7 @@ static SQInteger table_rawget(HSQUIRRELVM v) {"rawset",table_rawset,3, "t"}, {"rawdelete",table_rawdelete,2, "t"}, {"rawin",container_rawexists,2, "t"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, {"tostring",default_delegate_tostring,1, "."}, {"clear",obj_clear,1, "."}, }; @@ -622,7 +622,7 @@ static SQInteger array_slice(HSQUIRRELVM v) {"reverse",array_reverse,1, "a"}, {"sort",array_sort,-1, "ac"}, {"slice",array_slice,-1, "ann"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, {"tostring",default_delegate_tostring,1, "."}, {"clear",obj_clear,1, "."}, }; @@ -684,7 +684,7 @@ STRING_TOFUNCZ(toupper) {"find",string_find,-2, "s s n "}, {"tolower",string_tolower,1, "s"}, {"toupper",string_toupper,1, "s"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, }; //INTEGER DEFAULT DELEGATE////////////////////////// @@ -693,7 +693,7 @@ STRING_TOFUNCZ(toupper) {"tofloat",default_delegate_tofloat,1, "n|b"}, {"tostring",default_delegate_tostring,1, "."}, {"tochar",number_delegate_tochar,1, "n|b"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, }; //CLOSURE DEFAULT DELEGATE////////////////////////// @@ -777,7 +777,7 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) { {"pcall",closure_pcall,-1, "c"}, {"acall",closure_acall,2, "ca"}, {"pacall",closure_pacall,2, "ca"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, {"tostring",default_delegate_tostring,1, "."}, {"bindenv",closure_bindenv,2, "c x|y|t"}, {"getinfos",closure_getinfos,1, "c"}, @@ -797,7 +797,7 @@ static SQInteger generator_getstatus(HSQUIRRELVM v) /* static */ const std::initializer_list SQSharedState::_generator_default_delegate_funcz={ {"getstatus",generator_getstatus,1, "g"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, {"tostring",default_delegate_tostring,1, "."}, }; @@ -882,7 +882,7 @@ static SQInteger thread_getstatus(HSQUIRRELVM v) {"call", thread_call, -1, "v"}, {"wakeup", thread_wakeup, -1, "v"}, {"getstatus", thread_getstatus, 1, "v"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, {"tostring",default_delegate_tostring,1, "."}, }; @@ -911,7 +911,7 @@ static SQInteger class_instance(HSQUIRRELVM v) {"getattributes", class_getattributes, 2, "y."}, {"setattributes", class_setattributes, 3, "y.."}, {"rawin",container_rawexists,2, "y"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, {"tostring",default_delegate_tostring,1, "."}, {"instance",class_instance,1, "y"}, }; @@ -926,7 +926,7 @@ static SQInteger instance_getclass(HSQUIRRELVM v) /* static */ const std::initializer_list SQSharedState::_instance_default_delegate_funcz = { {"getclass", instance_getclass, 1, "x"}, {"rawin",container_rawexists,2, "x"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, {"tostring",default_delegate_tostring,1, "."}, }; @@ -939,7 +939,7 @@ static SQInteger weakref_ref(HSQUIRRELVM v) /* static */ const std::initializer_list SQSharedState::_weakref_default_delegate_funcz = { {"ref",weakref_ref,1, "r"}, - {"weakref",obj_delegate_weakref,1, nullptr }, + {"weakref",obj_delegate_weakref,1, std::nullopt }, {"tostring",default_delegate_tostring,1, "."}, }; diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp index 92725ad027..09341d84dd 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp @@ -14,6 +14,7 @@ #include "sqarray.h" #include "squserdata.h" #include "sqclass.h" +#include "../../../core/string_consumer.hpp" #include "../../../safeguards.h" @@ -32,14 +33,12 @@ SQObjectPtr _minusone_((SQInteger)-1); _table(_metamethodsmap)->NewSlot(_metamethods->back(),(SQInteger)(_metamethods->size()-1)); \ } -bool CompileTypemask(SQIntVec &res,const SQChar *typemask) +bool CompileTypemask(SQIntVec &res,std::string_view typemask) { - SQInteger i = 0; - SQInteger mask = 0; - while(typemask[i] != 0) { - - switch(typemask[i]){ + StringConsumer consumer{typemask}; + while (consumer.AnyBytesLeft()) { + switch(consumer.ReadChar()){ case 'o': mask |= _RT_NULL; break; case 'i': mask |= _RT_INTEGER; break; case 'f': mask |= _RT_FLOAT; break; @@ -56,21 +55,18 @@ bool CompileTypemask(SQIntVec &res,const SQChar *typemask) case 'x': mask |= _RT_INSTANCE; break; case 'y': mask |= _RT_CLASS; break; case 'r': mask |= _RT_WEAKREF; break; - case '.': mask = -1; res.push_back(mask); i++; mask = 0; continue; - case ' ': i++; continue; //ignores spaces + case '.': mask = -1; res.push_back(mask); mask = 0; continue; + case ' ': continue; //ignores spaces default: return false; } - i++; - if(typemask[i] == '|') { - i++; - if(typemask[i] == 0) - return false; + + if(consumer.ReadCharIf('|')) { + if(!consumer.AnyBytesLeft()) return false; continue; } res.push_back(mask); mask = 0; - } return true; } @@ -82,7 +78,7 @@ SQTable *CreateDefaultDelegate(SQSharedState *ss,const std::initializer_list_nparamscheck = func.nparamscheck; nc->_name = SQString::Create(ss,func.name); - if(func.typemask && !CompileTypemask(nc->_typecheck,func.typemask)) + if(func.typemask.has_value() && !CompileTypemask(nc->_typecheck,*func.typemask)) return nullptr; t->NewSlot(SQString::Create(ss,func.name),nc); } diff --git a/src/3rdparty/squirrel/squirrel/sqstate.h b/src/3rdparty/squirrel/squirrel/sqstate.h index 332f7dfd74..d98b903b05 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.h +++ b/src/3rdparty/squirrel/squirrel/sqstate.h @@ -129,6 +129,6 @@ extern SQObjectPtr _false_; extern SQObjectPtr _one_; extern SQObjectPtr _minusone_; -bool CompileTypemask(SQIntVec &res,const SQChar *typemask); +bool CompileTypemask(SQIntVec &res,std::string_view typemask); #endif //_SQSTATE_H_ diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index e1dd0eb13a..21623ac5fa 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -265,7 +265,7 @@ void Squirrel::AddMethod(std::string_view method_name, SQFUNCTION proc, std::str } sq_newclosure(this->vm, proc, size != 0 ? 1 : 0); - if (!params.empty()) sq_setparamscheck(this->vm, params.size(), params.data()); + if (!params.empty()) sq_setparamscheck(this->vm, params.size(), params); sq_setnativeclosurename(this->vm, -1, method_name); sq_newslot(this->vm, -3, SQFalse); }