diff --git a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp index 862d1b2bb7..a8aaf21672 100644 --- a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp +++ b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp @@ -233,7 +233,7 @@ static SQInteger base_array(HSQUIRRELVM v) static SQInteger base_type(HSQUIRRELVM v) { SQObjectPtr &o = stack_get(v,2); - v->Push(SQString::Create(_ss(v),GetTypeName(o),-1)); + v->Push(SQString::Create(_ss(v),GetTypeName(o))); return 1; } @@ -372,7 +372,7 @@ static SQInteger number_delegate_tochar(HSQUIRRELVM v) { SQObject &o=stack_get(v,1); SQChar c = (SQChar)tointeger(o); - v->Push(SQString::Create(_ss(v),(const SQChar *)&c,1)); + v->Push(SQString::Create(_ss(v),std::string_view(&c, 1))); return 1; } @@ -642,7 +642,7 @@ static SQInteger string_slice(HSQUIRRELVM v) if(eidx < 0)eidx = slen + eidx; if(eidx < sidx) return sq_throwerror(v,"wrong indexes"); if(eidx > slen) return sq_throwerror(v,"slice out of range"); - v->Push(SQString::Create(_ss(v),&_stringval(o)[sidx],eidx-sidx)); + v->Push(SQString::Create(_ss(v),std::string_view(&_stringval(o)[sidx],eidx-sidx))); return 1; } @@ -750,19 +750,19 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) { _array(params)->Set((SQInteger)n,f->_parameters[n]); } if(f->_varparams) { - _array(params)->Set(nparams-1,SQString::Create(_ss(v),"...",-1)); + _array(params)->Set(nparams-1,SQString::Create(_ss(v),"...")); } - res->NewSlot(SQString::Create(_ss(v),"native",-1),false); - res->NewSlot(SQString::Create(_ss(v),"name",-1),f->_name); - res->NewSlot(SQString::Create(_ss(v),"src",-1),f->_sourcename); - res->NewSlot(SQString::Create(_ss(v),"parameters",-1),params); - res->NewSlot(SQString::Create(_ss(v),"varargs",-1),f->_varparams); + res->NewSlot(SQString::Create(_ss(v),"native"),false); + res->NewSlot(SQString::Create(_ss(v),"name"),f->_name); + res->NewSlot(SQString::Create(_ss(v),"src"),f->_sourcename); + res->NewSlot(SQString::Create(_ss(v),"parameters"),params); + res->NewSlot(SQString::Create(_ss(v),"varargs"),f->_varparams); } else { //OT_NATIVECLOSURE SQNativeClosure *nc = _nativeclosure(o); - res->NewSlot(SQString::Create(_ss(v),"native",-1),true); - res->NewSlot(SQString::Create(_ss(v),"name",-1),nc->_name); - res->NewSlot(SQString::Create(_ss(v),"paramscheck",-1),nc->_nparamscheck); + res->NewSlot(SQString::Create(_ss(v),"native"),true); + res->NewSlot(SQString::Create(_ss(v),"name"),nc->_name); + res->NewSlot(SQString::Create(_ss(v),"paramscheck"),nc->_nparamscheck); SQObjectPtr typecheck; if(!nc->_typecheck.empty()) { typecheck = @@ -771,7 +771,7 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) { _array(typecheck)->Set((SQInteger)n,nc->_typecheck[n]); } } - res->NewSlot(SQString::Create(_ss(v),"typecheck",-1),typecheck); + res->NewSlot(SQString::Create(_ss(v),"typecheck"),typecheck); } v->Push(res); return 1; diff --git a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp index 0605005db7..94dd3b24c0 100644 --- a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp +++ b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp @@ -123,7 +123,7 @@ public: ret = _fs->CreateString(_lex._svalue); break; case TK_STRING_LITERAL: - ret = _fs->CreateString(_lex._svalue,_lex._longstr.size()-1); + ret = _fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1)); break; case TK_INTEGER: ret = SQObjectPtr(_lex._nvalue); @@ -598,7 +598,7 @@ public: switch(_token) { case TK_STRING_LITERAL: { - _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(_lex._svalue,_lex._longstr.size()-1))); + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1)))); Lex(); } break; @@ -1103,7 +1103,7 @@ public: val._unVal.fFloat = _lex._fvalue; break; case TK_STRING_LITERAL: - val = _fs->CreateString(_lex._svalue,_lex._longstr.size()-1); + val = _fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1)); break; case '-': Lex(); diff --git a/src/3rdparty/squirrel/squirrel/sqdebug.cpp b/src/3rdparty/squirrel/squirrel/sqdebug.cpp index 8a6f15121a..d06696c485 100644 --- a/src/3rdparty/squirrel/squirrel/sqdebug.cpp +++ b/src/3rdparty/squirrel/squirrel/sqdebug.cpp @@ -101,15 +101,15 @@ void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2) void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type) { - SQObjectPtr exptypes = SQString::Create(_ss(this), "", -1); + SQObjectPtr exptypes = SQString::Create(_ss(this), ""); SQInteger found = 0; for(SQInteger i=0; i<16; i++) { SQInteger mask = 0x00000001LL << i; if(typemask & (mask)) { - if(found>0) StringCat(exptypes,SQString::Create(_ss(this), "|", -1), exptypes); + if(found>0) StringCat(exptypes,SQString::Create(_ss(this), "|"), exptypes); found ++; - StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes); + StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask)), exptypes); } } Raise_Error(fmt::format("parameter {} has an invalid type '{}' ; expected: '{}'", nparam, IdType2Name((SQObjectType)type), _stringval(exptypes))); diff --git a/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp b/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp index 54744292a9..41cef7c63e 100644 --- a/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp @@ -499,9 +499,9 @@ void SQFuncState::AddInstruction(SQInstruction &i) _instructions.push_back(i); } -SQObject SQFuncState::CreateString(const SQChar *s,SQInteger len) +SQObject SQFuncState::CreateString(std::string_view s) { - SQObjectPtr ns(SQString::Create(_sharedstate,s,len)); + SQObjectPtr ns(SQString::Create(_sharedstate,s)); _table(_strings)->NewSlot(ns,(SQInteger)1); return std::move(ns); } diff --git a/src/3rdparty/squirrel/squirrel/sqfuncstate.h b/src/3rdparty/squirrel/squirrel/sqfuncstate.h index 739eb16261..f64b974971 100644 --- a/src/3rdparty/squirrel/squirrel/sqfuncstate.h +++ b/src/3rdparty/squirrel/squirrel/sqfuncstate.h @@ -43,7 +43,7 @@ struct SQFuncState SQInteger TopTarget(); SQInteger GetUpTarget(SQInteger n); bool IsLocal(SQUnsignedInteger stkpos); - SQObject CreateString(const SQChar *s,SQInteger len = -1); + SQObject CreateString(std::string_view s); SQObject CreateTable(); bool IsConstant(const SQObject &name,SQObject &e); SQInteger _returnexp; diff --git a/src/3rdparty/squirrel/squirrel/sqobject.cpp b/src/3rdparty/squirrel/squirrel/sqobject.cpp index 71835c909f..eead382ea5 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.cpp +++ b/src/3rdparty/squirrel/squirrel/sqobject.cpp @@ -51,16 +51,16 @@ const SQChar *GetTypeName(const SQObjectPtr &obj1) return IdType2Name(type(obj1)); } -SQString *SQString::Create(SQSharedState *ss,const SQChar *s,SQInteger len) +SQString *SQString::Create(SQSharedState *ss,std::string_view s) { - SQString *str=ADD_STRING(ss,s,len); + SQString *str=ss->_stringtable->Add(s); str->_sharedstate=ss; return str; } void SQString::Release() { - REMOVE_STRING(_sharedstate,this); + _sharedstate->_stringtable->Remove(this); } SQInteger SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval) diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp index 4209e10cca..9a2aa2555a 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp @@ -547,33 +547,34 @@ void SQStringTable::AllocNodes(SQInteger size) memset(_strings,0,sizeof(SQString*)*(size_t)_numofslots); } -SQString *SQStringTable::Add(const SQChar *news,SQInteger len) +static const std::hash string_table_hash{}; + +SQString *SQStringTable::Add(std::string_view new_string) { - if(len<0) - len = (SQInteger)strlen(news); - SQHash h = ::_hashstr(news,(size_t)len)&(_numofslots-1); + size_t len = new_string.size(); + auto slot = string_table_hash(new_string) & (_numofslots-1); SQString *s; - for (s = _strings[h]; s; s = s->_next){ - if(s->_len == len && (!memcmp(news,s->_val,(size_t)len))) + for (s = _strings[slot]; s; s = s->_next){ + if(static_cast(s->_len) == len && (!memcmp(new_string.data(),s->_val,len))) return s; //found } SQString *t=(SQString *)SQ_MALLOC(len+sizeof(SQString)); - new (t) SQString(news, len); - t->_next = _strings[h]; - _strings[h] = t; + new (t) SQString(new_string); + t->_next = _strings[slot]; + _strings[slot] = t; _slotused++; if (_slotused > _numofslots) /* too crowded? */ Resize(_numofslots*2); return t; } -SQString::SQString(const SQChar *news, SQInteger len) +SQString::SQString(std::string_view new_string) { - memcpy(_val,news,(size_t)len); - _val[len] = '\0'; - _len = len; - _hash = ::_hashstr(news,(size_t)len); + memcpy(_val,new_string.data(),new_string.size()); + _val[new_string.size()] = '\0'; + _len = new_string.size(); + _hash = string_table_hash(new_string); _next = nullptr; _sharedstate = nullptr; } diff --git a/src/3rdparty/squirrel/squirrel/sqstate.h b/src/3rdparty/squirrel/squirrel/sqstate.h index adc038fe0d..3a0007bbab 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.h +++ b/src/3rdparty/squirrel/squirrel/sqstate.h @@ -13,7 +13,7 @@ struct SQStringTable { SQStringTable(); ~SQStringTable(); - SQString *Add(const SQChar *,SQInteger len); + SQString *Add(std::string_view str); void Remove(SQString *); private: void Resize(SQInteger size); @@ -49,9 +49,6 @@ private: RefNode **_buckets; }; -#define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len) -#define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr) - struct SQObjectPtr; struct SQSharedState diff --git a/src/3rdparty/squirrel/squirrel/sqstring.h b/src/3rdparty/squirrel/squirrel/sqstring.h index fb8b6a09aa..70b446532d 100644 --- a/src/3rdparty/squirrel/squirrel/sqstring.h +++ b/src/3rdparty/squirrel/squirrel/sqstring.h @@ -2,28 +2,18 @@ #ifndef _SQSTRING_H_ #define _SQSTRING_H_ -inline SQHash _hashstr (const SQChar *s, size_t l) -{ - SQHash h = (SQHash)l; /* seed */ - size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */ - for (; l>=step; l-=step) - h = h ^ ((h<<5)+(h>>2)+(unsigned short)*(s++)); - return h; -} - struct SQString : public SQRefCounted { - SQString(const SQChar *news, SQInteger len); + SQString(std::string_view str); ~SQString(){} public: - static SQString *Create(SQSharedState *ss, const SQChar *, SQInteger len = -1 ); - static SQString *Create(SQSharedState *ss, std::string_view str) { return Create(ss, str.data(), str.size()); } + static SQString *Create(SQSharedState *ss, std::string_view str); SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval); void Release() override; SQSharedState *_sharedstate; SQString *_next; //chain for the string table SQInteger _len; - SQHash _hash; + std::size_t _hash; SQChar _val[1]; };