mirror of https://github.com/OpenTTD/OpenTTD
Codechange: make sq_scratchpad use std::span<char>
parent
b4d9682f21
commit
fca99967a7
|
@ -259,7 +259,7 @@ SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPoint
|
|||
SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
|
||||
SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
|
||||
void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
|
||||
SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
|
||||
std::span<char> sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
|
||||
SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger idx,SQFunctionInfo *fi);
|
||||
SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
|
||||
SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,std::string_view name);
|
||||
|
|
|
@ -1074,7 +1074,7 @@ SQRESULT sq_readclosure(HSQUIRRELVM v,SQREADFUNC r,SQUserPointer up)
|
|||
return SQ_OK;
|
||||
}
|
||||
|
||||
SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize)
|
||||
std::span<char> sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize)
|
||||
{
|
||||
return _ss(v)->GetScratchPad(minsize);
|
||||
}
|
||||
|
|
|
@ -669,9 +669,9 @@ static SQInteger string_find(HSQUIRRELVM v)
|
|||
SQObject str=stack_get(v,1); \
|
||||
SQInteger len=_string(str)->_len; \
|
||||
const SQChar *sThis=_stringval(str); \
|
||||
SQChar *sNew=(_ss(v)->GetScratchPad(len)); \
|
||||
std::span<char> sNew=(_ss(v)->GetScratchPad(len)); \
|
||||
for(SQInteger i=0;i<len;i++) sNew[i]=func(sThis[i]); \
|
||||
v->Push(SQString::Create(_ss(v),sNew,len)); \
|
||||
v->Push(SQString::Create(_ss(v),std::string_view(sNew.data(), len))); \
|
||||
return 1; \
|
||||
}
|
||||
|
||||
|
|
|
@ -298,8 +298,8 @@ bool ReadObject(HSQUIRRELVM v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &o)
|
|||
case OT_STRING:{
|
||||
SQInteger len;
|
||||
_CHECK_IO(SafeRead(v,read,up,&len,sizeof(SQInteger)));
|
||||
_CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(len),len));
|
||||
o=SQString::Create(_ss(v),_ss(v)->GetScratchPad(-1),len);
|
||||
_CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(len).data(),len));
|
||||
o=SQString::Create(_ss(v),std::string_view(_ss(v)->GetScratchPad(-1).data(),len));
|
||||
}
|
||||
break;
|
||||
case OT_INTEGER:{
|
||||
|
|
|
@ -97,8 +97,6 @@ SQSharedState::SQSharedState()
|
|||
_printfunc = nullptr;
|
||||
_debuginfo = false;
|
||||
_notifyallexceptions = false;
|
||||
_scratchpad=nullptr;
|
||||
_scratchpadsize=0;
|
||||
_collectable_free_processing = false;
|
||||
#ifndef NO_GARBAGE_COLLECTOR
|
||||
_gc_chain=nullptr;
|
||||
|
@ -212,7 +210,6 @@ SQSharedState::~SQSharedState()
|
|||
sq_delete(_systemstrings,SQObjectPtrVec);
|
||||
sq_delete(_metamethods,SQObjectPtrVec);
|
||||
sq_delete(_stringtable,SQStringTable);
|
||||
if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize);
|
||||
}
|
||||
|
||||
|
||||
|
@ -357,19 +354,16 @@ void SQCollectable::RemoveFromChain(SQCollectable **chain,SQCollectable *c)
|
|||
}
|
||||
#endif
|
||||
|
||||
SQChar* SQSharedState::GetScratchPad(SQInteger size)
|
||||
std::span<char> SQSharedState::GetScratchPad(SQInteger size)
|
||||
{
|
||||
SQInteger newsize;
|
||||
if(size>0) {
|
||||
if(_scratchpadsize < size) {
|
||||
if(_scratchpad.size() < static_cast<size_t>(size)) {
|
||||
newsize = size + (size>>1);
|
||||
_scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
|
||||
_scratchpadsize = newsize;
|
||||
|
||||
}else if(_scratchpadsize >= (size<<5)) {
|
||||
newsize = _scratchpadsize >> 1;
|
||||
_scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
|
||||
_scratchpadsize = newsize;
|
||||
_scratchpad.resize(newsize);
|
||||
}else if(_scratchpad.size() >= static_cast<size_t>(size<<5)) {
|
||||
newsize = _scratchpad.size() >> 1;
|
||||
_scratchpad.resize(newsize);
|
||||
}
|
||||
}
|
||||
return _scratchpad;
|
||||
|
|
|
@ -59,7 +59,7 @@ struct SQSharedState
|
|||
SQSharedState();
|
||||
~SQSharedState();
|
||||
public:
|
||||
SQChar* GetScratchPad(SQInteger size);
|
||||
std::span<char> GetScratchPad(SQInteger size);
|
||||
SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);
|
||||
void DelayFinalFree(SQCollectable *collectable);
|
||||
#ifndef NO_GARBAGE_COLLECTOR
|
||||
|
@ -109,8 +109,7 @@ public:
|
|||
bool _debuginfo;
|
||||
bool _notifyallexceptions;
|
||||
private:
|
||||
SQChar *_scratchpad;
|
||||
SQInteger _scratchpadsize;
|
||||
std::vector<char> _scratchpad;
|
||||
};
|
||||
|
||||
#define _sp(s) (_sharedstate->GetScratchPad(s))
|
||||
|
|
|
@ -302,11 +302,7 @@ bool SQVM::StringCat(const SQObjectPtr &str,const SQObjectPtr &obj,SQObjectPtr &
|
|||
SQObjectPtr a, b;
|
||||
ToString(str, a);
|
||||
ToString(obj, b);
|
||||
SQInteger l = _string(a)->_len , ol = _string(b)->_len;
|
||||
SQChar *s = _sp(l + ol + 1);
|
||||
memcpy(s, _stringval(a), (size_t)l);
|
||||
memcpy(s + l, _stringval(b), (size_t)ol);
|
||||
dest = SQString::Create(_ss(this), _spval, l + ol);
|
||||
dest = SQString::Create(_ss(this), fmt::format("{}{}", _stringval(a), _stringval(b)));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue