mirror of https://github.com/OpenTTD/OpenTTD
Codechange: use std::optional<std::string_view> to make the intent of function clearer
parent
ead3b96883
commit
0bc773215e
|
@ -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<std::string_view> sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
|
||||
std::optional<std::string_view> 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<std::string_view> 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;
|
||||
|
|
|
@ -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<std::string_view> opt;
|
||||
while ((opt = sq_getlocal(v,level,seq)).has_value()) {
|
||||
std::string_view name = *opt;
|
||||
seq++;
|
||||
switch(sq_gettype(v,-1))
|
||||
{
|
||||
|
|
|
@ -173,12 +173,12 @@ SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po)
|
|||
#endif
|
||||
}
|
||||
|
||||
const SQChar *sq_objtostring(HSQOBJECT *o)
|
||||
std::optional<std::string_view> 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<std::string_view> 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<std::string_view> 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) {
|
||||
|
|
|
@ -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<std::string_view> 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);
|
||||
|
|
|
@ -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<std::string_view> 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);
|
||||
|
|
|
@ -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<std::string_view> 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<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){
|
||||
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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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<std::string_view> ObjectToString(HSQOBJECT *ptr) { return sq_objtostring(ptr); }
|
||||
|
||||
/**
|
||||
* Convert a Squirrel-object to an integer.
|
||||
|
|
Loading…
Reference in New Issue