1
0
Fork 0

Codechange: make sq_scratchpad use std::span<char>

pull/14201/head
Rubidium 2025-05-03 13:52:35 +02:00 committed by rubidium42
parent b4d9682f21
commit fca99967a7
7 changed files with 15 additions and 26 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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; \
}

View File

@ -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:{

View File

@ -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;

View File

@ -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))

View File

@ -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;
}