1
0
Fork 0

Codechange: use std::optional<std::string_view> to make the intent of function clearer

pull/14201/head
Rubidium 2025-05-03 17:05:13 +02:00 committed by rubidium42
parent ead3b96883
commit 0bc773215e
10 changed files with 33 additions and 35 deletions

View File

@ -304,8 +304,8 @@ SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx);
/*calls*/ /*calls*/
SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror, int suspend = -1); SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror, int suspend = -1);
SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror); SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx); std::optional<std::string_view> sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval); std::optional<std::string_view> sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
SQRESULT sq_throwerror(HSQUIRRELVM v,std::string_view err); SQRESULT sq_throwerror(HSQUIRRELVM v,std::string_view err);
void sq_reseterror(HSQUIRRELVM v); void sq_reseterror(HSQUIRRELVM v);
void sq_getlasterror(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); void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po); SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
void sq_resetobject(HSQOBJECT *po); void sq_resetobject(HSQOBJECT *po);
const SQChar *sq_objtostring(HSQOBJECT *o); std::optional<std::string_view> sq_objtostring(HSQOBJECT *o);
SQBool sq_objtobool(HSQOBJECT *o); SQBool sq_objtobool(HSQOBJECT *o);
SQInteger sq_objtointeger(HSQOBJECT *o); SQInteger sq_objtointeger(HSQOBJECT *o);
SQFloat sq_objtofloat(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 */ /* Limit the total number of ops that can be consumed by an operation */
struct SQOpsLimiter { struct SQOpsLimiter {
SQOpsLimiter(HSQUIRRELVM v, SQInteger ops, const char *label); SQOpsLimiter(HSQUIRRELVM v, SQInteger ops, std::string_view label);
~SQOpsLimiter(); ~SQOpsLimiter();
private: private:
HSQUIRRELVM _v; HSQUIRRELVM _v;

View File

@ -17,7 +17,6 @@ void sqstd_printcallstack(HSQUIRRELVM v)
SQBool b; SQBool b;
SQFloat f; SQFloat f;
SQInteger level=1; //1 is to skip this function that is level 0 SQInteger level=1; //1 is to skip this function that is level 0
const SQChar *name=nullptr;
SQInteger seq=0; SQInteger seq=0;
pf(v,"\nCALLSTACK\n"); pf(v,"\nCALLSTACK\n");
while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si))) while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
@ -46,8 +45,9 @@ void sqstd_printcallstack(HSQUIRRELVM v)
for(level=0;level<10;level++){ for(level=0;level<10;level++){
seq=0; seq=0;
while((name = sq_getlocal(v,level,seq))) std::optional<std::string_view> opt;
{ while ((opt = sq_getlocal(v,level,seq)).has_value()) {
std::string_view name = *opt;
seq++; seq++;
switch(sq_gettype(v,-1)) switch(sq_gettype(v,-1))
{ {

View File

@ -173,12 +173,12 @@ SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po)
#endif #endif
} }
const SQChar *sq_objtostring(HSQOBJECT *o) std::optional<std::string_view> sq_objtostring(HSQOBJECT *o)
{ {
if(sq_type(*o) == OT_STRING) { if(sq_type(*o) == OT_STRING) {
return _stringval(*o); return _stringval(*o);
} }
return nullptr; return std::nullopt;
} }
SQInteger sq_objtointeger(HSQOBJECT *o) SQInteger sq_objtointeger(HSQOBJECT *o)
@ -895,7 +895,7 @@ SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po)
return SQ_OK; return SQ_OK;
} }
const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx) std::optional<std::string_view> sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx)
{ {
SQUnsignedInteger cstksize=v->_callsstacksize; SQUnsignedInteger cstksize=v->_callsstacksize;
SQUnsignedInteger lvl=(cstksize-level)-1; SQUnsignedInteger lvl=(cstksize-level)-1;
@ -907,7 +907,7 @@ const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedIntege
} }
SQVM::CallInfo &ci=v->_callsstack[lvl]; SQVM::CallInfo &ci=v->_callsstack[lvl];
if(type(ci._closure)!=OT_CLOSURE) if(type(ci._closure)!=OT_CLOSURE)
return nullptr; return std::nullopt;
SQClosure *c=_closure(ci._closure); SQClosure *c=_closure(ci._closure);
SQFunctionProto *func=_funcproto(c->_function); SQFunctionProto *func=_funcproto(c->_function);
if(func->_noutervalues > (SQInteger)idx) { if(func->_noutervalues > (SQInteger)idx) {
@ -917,7 +917,7 @@ const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedIntege
idx -= func->_noutervalues; idx -= func->_noutervalues;
return func->GetLocal(v,stackbase,idx,(SQInteger)(ci._ip-func->_instructions)-1); return func->GetLocal(v,stackbase,idx,(SQInteger)(ci._ip-func->_instructions)-1);
} }
return nullptr; return std::nullopt;
} }
void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj) void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj)
@ -1088,19 +1088,18 @@ SQInteger sq_collectgarbage(HSQUIRRELVM v)
#endif #endif
} }
const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval) std::optional<std::string_view> sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval)
{ {
SQObjectPtr &self = stack_get(v,idx); SQObjectPtr &self = stack_get(v,idx);
const SQChar *name = nullptr;
if(type(self) == OT_CLOSURE) { if(type(self) == OT_CLOSURE) {
if(_closure(self)->_outervalues.size()>nval) { if(_closure(self)->_outervalues.size()>nval) {
v->Push(_closure(self)->_outervalues[nval]); v->Push(_closure(self)->_outervalues[nval]);
SQFunctionProto *fp = _funcproto(_closure(self)->_function); SQFunctionProto *fp = _funcproto(_closure(self)->_function);
SQOuterVar &ov = fp->_outervalues[nval]; 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) SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval)
@ -1294,7 +1293,7 @@ void sq_free(void *p,SQUnsignedInteger size)
SQ_FREE(p,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; this->_ops = v->_ops_till_suspend_error_threshold;
if (this->_ops == INT64_MIN) { if (this->_ops == INT64_MIN) {

View File

@ -102,12 +102,11 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v)
SQInteger level; SQInteger level;
SQStackInfos si; SQStackInfos si;
SQInteger seq = 0; SQInteger seq = 0;
const SQChar *name = nullptr;
sq_getinteger(v, -1, &level); sq_getinteger(v, -1, &level);
if (SQ_SUCCEEDED(sq_stackinfos(v, level, &si))) if (SQ_SUCCEEDED(sq_stackinfos(v, level, &si)))
{ {
const SQChar *fn = "unknown"; std::string_view fn = "unknown";
const SQChar *src = "unknown"; std::string_view src = "unknown";
if(si.funcname)fn = si.funcname; if(si.funcname)fn = si.funcname;
if(si.source)src = si.source; if(si.source)src = si.source;
sq_newtable(v); sq_newtable(v);
@ -123,8 +122,9 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v)
sq_pushstring(v, "locals"); sq_pushstring(v, "locals");
sq_newtable(v); sq_newtable(v);
seq=0; seq=0;
while ((name = sq_getlocal(v, level, seq))) { std::optional<std::string_view> name;
sq_pushstring(v, name); while ((name = sq_getlocal(v, level, seq)).has_value()) {
sq_pushstring(v, *name);
sq_push(v, -2); sq_push(v, -2);
sq_createslot(v, -4); sq_createslot(v, -4);
sq_pop(v, 1); sq_pop(v, 1);

View File

@ -114,7 +114,7 @@ public:
this->~SQFunctionProto(); this->~SQFunctionProto();
sq_vm_free(this,size); sq_vm_free(this,size);
} }
const SQChar* GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop); std::optional<std::string_view> GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop);
SQInteger GetLine(SQInstruction *curr); SQInteger GetLine(SQInstruction *curr);
bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write); bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret); static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret);

View File

@ -202,24 +202,21 @@ void SQArray::Extend(const SQArray *a){
Append(a->_values[i]); Append(a->_values[i]);
} }
const SQChar* SQFunctionProto::GetLocal(SQVM *vm,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop) std::optional<std::string_view> SQFunctionProto::GetLocal(SQVM *vm,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop)
{ {
SQUnsignedInteger nvars=_nlocalvarinfos; SQUnsignedInteger nvars=_nlocalvarinfos;
const SQChar *res=nullptr;
if(nvars>=nseq){ if(nvars>=nseq){
for(SQUnsignedInteger i=0;i<nvars;i++){ for(SQUnsignedInteger i=0;i<nvars;i++){
if(_localvarinfos[i]._start_op<=nop && _localvarinfos[i]._end_op>=nop) if(_localvarinfos[i]._start_op<=nop && _localvarinfos[i]._end_op>=nop) {
{
if(nseq==0){ if(nseq==0){
vm->Push(vm->_stack[stackbase+_localvarinfos[i]._pos]); vm->Push(vm->_stack[stackbase+_localvarinfos[i]._pos]);
res=_stringval(_localvarinfos[i]._name); return _stringval(_localvarinfos[i]._name);
break;
} }
nseq--; nseq--;
} }
} }
} }
return res; return std::nullopt;
} }
SQInteger SQFunctionProto::GetLine(SQInstruction *curr) SQInteger SQFunctionProto::GetLine(SQInstruction *curr)

View File

@ -117,7 +117,6 @@ SQVM::SQVM(SQSharedState *ss)
_in_stackoverflow = false; _in_stackoverflow = false;
_ops_till_suspend = 0; _ops_till_suspend = 0;
_ops_till_suspend_error_threshold = INT64_MIN; _ops_till_suspend_error_threshold = INT64_MIN;
_ops_till_suspend_error_label = nullptr;
_callsstack = nullptr; _callsstack = nullptr;
_callsstacksize = 0; _callsstacksize = 0;
_alloccallsstacksize = 0; _alloccallsstacksize = 0;

View File

@ -169,7 +169,7 @@ public:
SQBool _can_suspend; SQBool _can_suspend;
SQInteger _ops_till_suspend; SQInteger _ops_till_suspend;
SQInteger _ops_till_suspend_error_threshold; SQInteger _ops_till_suspend_error_threshold;
const char *_ops_till_suspend_error_label; std::string_view _ops_till_suspend_error_label;
SQBool _in_stackoverflow; SQBool _in_stackoverflow;
bool ShouldSuspend() bool ShouldSuspend()

View File

@ -411,8 +411,11 @@ bool Squirrel::CallStringMethod(HSQOBJECT instance, std::string_view method_name
{ {
HSQOBJECT ret; HSQOBJECT ret;
if (!this->CallMethod(instance, method_name, &ret, suspend)) return false; 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; return true;
} }

View File

@ -207,7 +207,7 @@ public:
/** /**
* Convert a Squirrel-object to a string. * Convert a Squirrel-object to a string.
*/ */
static std::string_view ObjectToString(HSQOBJECT *ptr) { return sq_objtostring(ptr); } static std::optional<std::string_view> ObjectToString(HSQOBJECT *ptr) { return sq_objtostring(ptr); }
/** /**
* Convert a Squirrel-object to an integer. * Convert a Squirrel-object to an integer.