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*/
|
/*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;
|
||||||
|
|
|
@ -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))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue