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_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag); SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook); 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_getfunctioninfo(HSQUIRRELVM v,SQInteger idx,SQFunctionInfo *fi);
SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars); SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,std::string_view name); 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; return SQ_OK;
} }
SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize) std::span<char> sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize)
{ {
return _ss(v)->GetScratchPad(minsize); return _ss(v)->GetScratchPad(minsize);
} }

View File

@ -669,9 +669,9 @@ static SQInteger string_find(HSQUIRRELVM v)
SQObject str=stack_get(v,1); \ SQObject str=stack_get(v,1); \
SQInteger len=_string(str)->_len; \ SQInteger len=_string(str)->_len; \
const SQChar *sThis=_stringval(str); \ 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]); \ 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; \ return 1; \
} }

View File

@ -298,8 +298,8 @@ bool ReadObject(HSQUIRRELVM v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &o)
case OT_STRING:{ case OT_STRING:{
SQInteger len; SQInteger len;
_CHECK_IO(SafeRead(v,read,up,&len,sizeof(SQInteger))); _CHECK_IO(SafeRead(v,read,up,&len,sizeof(SQInteger)));
_CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(len),len)); _CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(len).data(),len));
o=SQString::Create(_ss(v),_ss(v)->GetScratchPad(-1),len); o=SQString::Create(_ss(v),std::string_view(_ss(v)->GetScratchPad(-1).data(),len));
} }
break; break;
case OT_INTEGER:{ case OT_INTEGER:{

View File

@ -97,8 +97,6 @@ SQSharedState::SQSharedState()
_printfunc = nullptr; _printfunc = nullptr;
_debuginfo = false; _debuginfo = false;
_notifyallexceptions = false; _notifyallexceptions = false;
_scratchpad=nullptr;
_scratchpadsize=0;
_collectable_free_processing = false; _collectable_free_processing = false;
#ifndef NO_GARBAGE_COLLECTOR #ifndef NO_GARBAGE_COLLECTOR
_gc_chain=nullptr; _gc_chain=nullptr;
@ -212,7 +210,6 @@ SQSharedState::~SQSharedState()
sq_delete(_systemstrings,SQObjectPtrVec); sq_delete(_systemstrings,SQObjectPtrVec);
sq_delete(_metamethods,SQObjectPtrVec); sq_delete(_metamethods,SQObjectPtrVec);
sq_delete(_stringtable,SQStringTable); sq_delete(_stringtable,SQStringTable);
if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize);
} }
@ -357,19 +354,16 @@ void SQCollectable::RemoveFromChain(SQCollectable **chain,SQCollectable *c)
} }
#endif #endif
SQChar* SQSharedState::GetScratchPad(SQInteger size) std::span<char> SQSharedState::GetScratchPad(SQInteger size)
{ {
SQInteger newsize; SQInteger newsize;
if(size>0) { if(size>0) {
if(_scratchpadsize < size) { if(_scratchpad.size() < static_cast<size_t>(size)) {
newsize = size + (size>>1); newsize = size + (size>>1);
_scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize); _scratchpad.resize(newsize);
_scratchpadsize = newsize; }else if(_scratchpad.size() >= static_cast<size_t>(size<<5)) {
newsize = _scratchpad.size() >> 1;
}else if(_scratchpadsize >= (size<<5)) { _scratchpad.resize(newsize);
newsize = _scratchpadsize >> 1;
_scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
_scratchpadsize = newsize;
} }
} }
return _scratchpad; return _scratchpad;

View File

@ -59,7 +59,7 @@ struct SQSharedState
SQSharedState(); SQSharedState();
~SQSharedState(); ~SQSharedState();
public: public:
SQChar* GetScratchPad(SQInteger size); std::span<char> GetScratchPad(SQInteger size);
SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name); SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);
void DelayFinalFree(SQCollectable *collectable); void DelayFinalFree(SQCollectable *collectable);
#ifndef NO_GARBAGE_COLLECTOR #ifndef NO_GARBAGE_COLLECTOR
@ -109,8 +109,7 @@ public:
bool _debuginfo; bool _debuginfo;
bool _notifyallexceptions; bool _notifyallexceptions;
private: private:
SQChar *_scratchpad; std::vector<char> _scratchpad;
SQInteger _scratchpadsize;
}; };
#define _sp(s) (_sharedstate->GetScratchPad(s)) #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; SQObjectPtr a, b;
ToString(str, a); ToString(str, a);
ToString(obj, b); ToString(obj, b);
SQInteger l = _string(a)->_len , ol = _string(b)->_len; dest = SQString::Create(_ss(this), fmt::format("{}{}", _stringval(a), _stringval(b)));
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);
return true; return true;
} }