From 0bc773215ed21e1a6c3b590319d8afac647f23f6 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 May 2025 17:05:13 +0200 Subject: [PATCH] Codechange: use std::optional to make the intent of function clearer --- src/3rdparty/squirrel/include/squirrel.h | 8 ++++---- src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp | 6 +++--- src/3rdparty/squirrel/squirrel/sqapi.cpp | 19 +++++++++---------- src/3rdparty/squirrel/squirrel/sqbaselib.cpp | 10 +++++----- src/3rdparty/squirrel/squirrel/sqfuncproto.h | 2 +- src/3rdparty/squirrel/squirrel/sqobject.cpp | 11 ++++------- src/3rdparty/squirrel/squirrel/sqvm.cpp | 1 - src/3rdparty/squirrel/squirrel/sqvm.h | 2 +- src/script/squirrel.cpp | 7 +++++-- src/script/squirrel.hpp | 2 +- 10 files changed, 33 insertions(+), 35 deletions(-) diff --git a/src/3rdparty/squirrel/include/squirrel.h b/src/3rdparty/squirrel/include/squirrel.h index f2d9623627..bbda8f72da 100644 --- a/src/3rdparty/squirrel/include/squirrel.h +++ b/src/3rdparty/squirrel/include/squirrel.h @@ -304,8 +304,8 @@ SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx); /*calls*/ SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror, int suspend = -1); SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror); -const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx); -const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval); +std::optional sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx); +std::optional sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval); SQRESULT sq_throwerror(HSQUIRRELVM v,std::string_view err); void sq_reseterror(HSQUIRRELVM v); void sq_getlasterror(HSQUIRRELVM v); @@ -316,7 +316,7 @@ void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj); void sq_addref(HSQUIRRELVM v,HSQOBJECT *po); SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po); void sq_resetobject(HSQOBJECT *po); -const SQChar *sq_objtostring(HSQOBJECT *o); +std::optional sq_objtostring(HSQOBJECT *o); SQBool sq_objtobool(HSQOBJECT *o); SQInteger sq_objtointeger(HSQOBJECT *o); SQFloat sq_objtofloat(HSQOBJECT *o); @@ -361,7 +361,7 @@ void sq_setdebughook(HSQUIRRELVM v); /* Limit the total number of ops that can be consumed by an operation */ struct SQOpsLimiter { - SQOpsLimiter(HSQUIRRELVM v, SQInteger ops, const char *label); + SQOpsLimiter(HSQUIRRELVM v, SQInteger ops, std::string_view label); ~SQOpsLimiter(); private: HSQUIRRELVM _v; diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp index 78c3dc6cc4..a8abf8be79 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp @@ -17,7 +17,6 @@ void sqstd_printcallstack(HSQUIRRELVM v) SQBool b; SQFloat f; SQInteger level=1; //1 is to skip this function that is level 0 - const SQChar *name=nullptr; SQInteger seq=0; pf(v,"\nCALLSTACK\n"); while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si))) @@ -46,8 +45,9 @@ void sqstd_printcallstack(HSQUIRRELVM v) for(level=0;level<10;level++){ seq=0; - while((name = sq_getlocal(v,level,seq))) - { + std::optional opt; + while ((opt = sq_getlocal(v,level,seq)).has_value()) { + std::string_view name = *opt; seq++; switch(sq_gettype(v,-1)) { diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp index bce5aa89d0..21d3312d2f 100644 --- a/src/3rdparty/squirrel/squirrel/sqapi.cpp +++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp @@ -173,12 +173,12 @@ SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po) #endif } -const SQChar *sq_objtostring(HSQOBJECT *o) +std::optional sq_objtostring(HSQOBJECT *o) { if(sq_type(*o) == OT_STRING) { return _stringval(*o); } - return nullptr; + return std::nullopt; } SQInteger sq_objtointeger(HSQOBJECT *o) @@ -895,7 +895,7 @@ SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po) return SQ_OK; } -const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx) +std::optional sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx) { SQUnsignedInteger cstksize=v->_callsstacksize; SQUnsignedInteger lvl=(cstksize-level)-1; @@ -907,7 +907,7 @@ const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedIntege } SQVM::CallInfo &ci=v->_callsstack[lvl]; if(type(ci._closure)!=OT_CLOSURE) - return nullptr; + return std::nullopt; SQClosure *c=_closure(ci._closure); SQFunctionProto *func=_funcproto(c->_function); if(func->_noutervalues > (SQInteger)idx) { @@ -917,7 +917,7 @@ const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedIntege idx -= func->_noutervalues; return func->GetLocal(v,stackbase,idx,(SQInteger)(ci._ip-func->_instructions)-1); } - return nullptr; + return std::nullopt; } void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj) @@ -1088,19 +1088,18 @@ SQInteger sq_collectgarbage(HSQUIRRELVM v) #endif } -const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval) +std::optional sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval) { SQObjectPtr &self = stack_get(v,idx); - const SQChar *name = nullptr; if(type(self) == OT_CLOSURE) { if(_closure(self)->_outervalues.size()>nval) { v->Push(_closure(self)->_outervalues[nval]); SQFunctionProto *fp = _funcproto(_closure(self)->_function); SQOuterVar &ov = fp->_outervalues[nval]; - name = _stringval(ov._name); + return _stringval(ov._name); } } - return name; + return std::nullopt; } SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval) @@ -1294,7 +1293,7 @@ void sq_free(void *p,SQUnsignedInteger size) SQ_FREE(p,size); } -SQOpsLimiter::SQOpsLimiter(HSQUIRRELVM v, SQInteger ops, const char *label) : _v(v) +SQOpsLimiter::SQOpsLimiter(HSQUIRRELVM v, SQInteger ops, std::string_view label) : _v(v) { this->_ops = v->_ops_till_suspend_error_threshold; if (this->_ops == INT64_MIN) { diff --git a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp index a8aaf21672..6214380bfd 100644 --- a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp +++ b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp @@ -102,12 +102,11 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v) SQInteger level; SQStackInfos si; SQInteger seq = 0; - const SQChar *name = nullptr; sq_getinteger(v, -1, &level); if (SQ_SUCCEEDED(sq_stackinfos(v, level, &si))) { - const SQChar *fn = "unknown"; - const SQChar *src = "unknown"; + std::string_view fn = "unknown"; + std::string_view src = "unknown"; if(si.funcname)fn = si.funcname; if(si.source)src = si.source; sq_newtable(v); @@ -123,8 +122,9 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v) sq_pushstring(v, "locals"); sq_newtable(v); seq=0; - while ((name = sq_getlocal(v, level, seq))) { - sq_pushstring(v, name); + std::optional name; + while ((name = sq_getlocal(v, level, seq)).has_value()) { + sq_pushstring(v, *name); sq_push(v, -2); sq_createslot(v, -4); sq_pop(v, 1); diff --git a/src/3rdparty/squirrel/squirrel/sqfuncproto.h b/src/3rdparty/squirrel/squirrel/sqfuncproto.h index b65b040b49..a2cdb94fd1 100644 --- a/src/3rdparty/squirrel/squirrel/sqfuncproto.h +++ b/src/3rdparty/squirrel/squirrel/sqfuncproto.h @@ -114,7 +114,7 @@ public: this->~SQFunctionProto(); sq_vm_free(this,size); } - const SQChar* GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop); + std::optional GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop); SQInteger GetLine(SQInstruction *curr); bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write); static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret); diff --git a/src/3rdparty/squirrel/squirrel/sqobject.cpp b/src/3rdparty/squirrel/squirrel/sqobject.cpp index eead382ea5..016207f60c 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.cpp +++ b/src/3rdparty/squirrel/squirrel/sqobject.cpp @@ -202,24 +202,21 @@ void SQArray::Extend(const SQArray *a){ Append(a->_values[i]); } -const SQChar* SQFunctionProto::GetLocal(SQVM *vm,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop) +std::optional SQFunctionProto::GetLocal(SQVM *vm,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop) { SQUnsignedInteger nvars=_nlocalvarinfos; - const SQChar *res=nullptr; if(nvars>=nseq){ for(SQUnsignedInteger i=0;i=nop) - { + if(_localvarinfos[i]._start_op<=nop && _localvarinfos[i]._end_op>=nop) { if(nseq==0){ vm->Push(vm->_stack[stackbase+_localvarinfos[i]._pos]); - res=_stringval(_localvarinfos[i]._name); - break; + return _stringval(_localvarinfos[i]._name); } nseq--; } } } - return res; + return std::nullopt; } SQInteger SQFunctionProto::GetLine(SQInstruction *curr) diff --git a/src/3rdparty/squirrel/squirrel/sqvm.cpp b/src/3rdparty/squirrel/squirrel/sqvm.cpp index 76bd56529d..3bdd661efc 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.cpp +++ b/src/3rdparty/squirrel/squirrel/sqvm.cpp @@ -117,7 +117,6 @@ SQVM::SQVM(SQSharedState *ss) _in_stackoverflow = false; _ops_till_suspend = 0; _ops_till_suspend_error_threshold = INT64_MIN; - _ops_till_suspend_error_label = nullptr; _callsstack = nullptr; _callsstacksize = 0; _alloccallsstacksize = 0; diff --git a/src/3rdparty/squirrel/squirrel/sqvm.h b/src/3rdparty/squirrel/squirrel/sqvm.h index b083cf3bdd..34554678a5 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.h +++ b/src/3rdparty/squirrel/squirrel/sqvm.h @@ -169,7 +169,7 @@ public: SQBool _can_suspend; SQInteger _ops_till_suspend; SQInteger _ops_till_suspend_error_threshold; - const char *_ops_till_suspend_error_label; + std::string_view _ops_till_suspend_error_label; SQBool _in_stackoverflow; bool ShouldSuspend() diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index caacbeade3..e1dd0eb13a 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -411,8 +411,11 @@ bool Squirrel::CallStringMethod(HSQOBJECT instance, std::string_view method_name { HSQOBJECT ret; if (!this->CallMethod(instance, method_name, &ret, suspend)) return false; - if (ret._type != OT_STRING) return false; - *res = StrMakeValid(ObjectToString(&ret)); + + auto str = ObjectToString(&ret); + if (!str.has_value()) return false; + + *res = StrMakeValid(*str); return true; } diff --git a/src/script/squirrel.hpp b/src/script/squirrel.hpp index 8feb22e8d9..415f75ca10 100644 --- a/src/script/squirrel.hpp +++ b/src/script/squirrel.hpp @@ -207,7 +207,7 @@ public: /** * Convert a Squirrel-object to a string. */ - static std::string_view ObjectToString(HSQOBJECT *ptr) { return sq_objtostring(ptr); } + static std::optional ObjectToString(HSQOBJECT *ptr) { return sq_objtostring(ptr); } /** * Convert a Squirrel-object to an integer.