From fca99967a705118ca3e6692a9976ed92270fce04 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 May 2025 13:52:35 +0200 Subject: [PATCH] Codechange: make sq_scratchpad use std::span --- src/3rdparty/squirrel/include/squirrel.h | 2 +- src/3rdparty/squirrel/squirrel/sqapi.cpp | 2 +- src/3rdparty/squirrel/squirrel/sqbaselib.cpp | 4 ++-- src/3rdparty/squirrel/squirrel/sqobject.cpp | 4 ++-- src/3rdparty/squirrel/squirrel/sqstate.cpp | 18 ++++++------------ src/3rdparty/squirrel/squirrel/sqstate.h | 5 ++--- src/3rdparty/squirrel/squirrel/sqvm.cpp | 6 +----- 7 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/3rdparty/squirrel/include/squirrel.h b/src/3rdparty/squirrel/include/squirrel.h index 075f1d3793..f2d9623627 100644 --- a/src/3rdparty/squirrel/include/squirrel.h +++ b/src/3rdparty/squirrel/include/squirrel.h @@ -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 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); diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp index 416e806082..bce5aa89d0 100644 --- a/src/3rdparty/squirrel/squirrel/sqapi.cpp +++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp @@ -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 sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize) { return _ss(v)->GetScratchPad(minsize); } diff --git a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp index df64bdc370..862d1b2bb7 100644 --- a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp +++ b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp @@ -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 sNew=(_ss(v)->GetScratchPad(len)); \ for(SQInteger i=0;iPush(SQString::Create(_ss(v),sNew,len)); \ + v->Push(SQString::Create(_ss(v),std::string_view(sNew.data(), len))); \ return 1; \ } diff --git a/src/3rdparty/squirrel/squirrel/sqobject.cpp b/src/3rdparty/squirrel/squirrel/sqobject.cpp index a0f9c75363..71835c909f 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.cpp +++ b/src/3rdparty/squirrel/squirrel/sqobject.cpp @@ -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:{ diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp index 3adb4d8f98..4209e10cca 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp @@ -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 SQSharedState::GetScratchPad(SQInteger size) { SQInteger newsize; if(size>0) { - if(_scratchpadsize < size) { + if(_scratchpad.size() < static_cast(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<<5)) { + newsize = _scratchpad.size() >> 1; + _scratchpad.resize(newsize); } } return _scratchpad; diff --git a/src/3rdparty/squirrel/squirrel/sqstate.h b/src/3rdparty/squirrel/squirrel/sqstate.h index 547e6de47d..adc038fe0d 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.h +++ b/src/3rdparty/squirrel/squirrel/sqstate.h @@ -59,7 +59,7 @@ struct SQSharedState SQSharedState(); ~SQSharedState(); public: - SQChar* GetScratchPad(SQInteger size); + std::span 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 _scratchpad; }; #define _sp(s) (_sharedstate->GetScratchPad(s)) diff --git a/src/3rdparty/squirrel/squirrel/sqvm.cpp b/src/3rdparty/squirrel/squirrel/sqvm.cpp index 4055c1fc8c..76bd56529d 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.cpp +++ b/src/3rdparty/squirrel/squirrel/sqvm.cpp @@ -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; }