1
0
Fork 0

Codechange: use std::string_view to create SQString

pull/14201/head
Rubidium 2025-05-03 14:06:41 +02:00 committed by rubidium42
parent fca99967a7
commit ead3b96883
9 changed files with 44 additions and 56 deletions

View File

@ -233,7 +233,7 @@ static SQInteger base_array(HSQUIRRELVM v)
static SQInteger base_type(HSQUIRRELVM v) static SQInteger base_type(HSQUIRRELVM v)
{ {
SQObjectPtr &o = stack_get(v,2); 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; return 1;
} }
@ -372,7 +372,7 @@ static SQInteger number_delegate_tochar(HSQUIRRELVM v)
{ {
SQObject &o=stack_get(v,1); SQObject &o=stack_get(v,1);
SQChar c = (SQChar)tointeger(o); 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; return 1;
} }
@ -642,7 +642,7 @@ static SQInteger string_slice(HSQUIRRELVM v)
if(eidx < 0)eidx = slen + eidx; if(eidx < 0)eidx = slen + eidx;
if(eidx < sidx) return sq_throwerror(v,"wrong indexes"); if(eidx < sidx) return sq_throwerror(v,"wrong indexes");
if(eidx > slen) return sq_throwerror(v,"slice out of range"); 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; return 1;
} }
@ -750,19 +750,19 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) {
_array(params)->Set((SQInteger)n,f->_parameters[n]); _array(params)->Set((SQInteger)n,f->_parameters[n]);
} }
if(f->_varparams) { 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),"native"),false);
res->NewSlot(SQString::Create(_ss(v),"name",-1),f->_name); res->NewSlot(SQString::Create(_ss(v),"name"),f->_name);
res->NewSlot(SQString::Create(_ss(v),"src",-1),f->_sourcename); res->NewSlot(SQString::Create(_ss(v),"src"),f->_sourcename);
res->NewSlot(SQString::Create(_ss(v),"parameters",-1),params); res->NewSlot(SQString::Create(_ss(v),"parameters"),params);
res->NewSlot(SQString::Create(_ss(v),"varargs",-1),f->_varparams); res->NewSlot(SQString::Create(_ss(v),"varargs"),f->_varparams);
} }
else { //OT_NATIVECLOSURE else { //OT_NATIVECLOSURE
SQNativeClosure *nc = _nativeclosure(o); SQNativeClosure *nc = _nativeclosure(o);
res->NewSlot(SQString::Create(_ss(v),"native",-1),true); res->NewSlot(SQString::Create(_ss(v),"native"),true);
res->NewSlot(SQString::Create(_ss(v),"name",-1),nc->_name); res->NewSlot(SQString::Create(_ss(v),"name"),nc->_name);
res->NewSlot(SQString::Create(_ss(v),"paramscheck",-1),nc->_nparamscheck); res->NewSlot(SQString::Create(_ss(v),"paramscheck"),nc->_nparamscheck);
SQObjectPtr typecheck; SQObjectPtr typecheck;
if(!nc->_typecheck.empty()) { if(!nc->_typecheck.empty()) {
typecheck = typecheck =
@ -771,7 +771,7 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) {
_array(typecheck)->Set((SQInteger)n,nc->_typecheck[n]); _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); v->Push(res);
return 1; return 1;

View File

@ -123,7 +123,7 @@ public:
ret = _fs->CreateString(_lex._svalue); ret = _fs->CreateString(_lex._svalue);
break; break;
case TK_STRING_LITERAL: 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; break;
case TK_INTEGER: case TK_INTEGER:
ret = SQObjectPtr(_lex._nvalue); ret = SQObjectPtr(_lex._nvalue);
@ -598,7 +598,7 @@ public:
switch(_token) switch(_token)
{ {
case TK_STRING_LITERAL: { 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(); Lex();
} }
break; break;
@ -1103,7 +1103,7 @@ public:
val._unVal.fFloat = _lex._fvalue; val._unVal.fFloat = _lex._fvalue;
break; break;
case TK_STRING_LITERAL: 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; break;
case '-': case '-':
Lex(); Lex();

View File

@ -101,15 +101,15 @@ void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2)
void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type) 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; SQInteger found = 0;
for(SQInteger i=0; i<16; i++) for(SQInteger i=0; i<16; i++)
{ {
SQInteger mask = 0x00000001LL << i; SQInteger mask = 0x00000001LL << i;
if(typemask & (mask)) { 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 ++; 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))); Raise_Error(fmt::format("parameter {} has an invalid type '{}' ; expected: '{}'", nparam, IdType2Name((SQObjectType)type), _stringval(exptypes)));

View File

@ -499,9 +499,9 @@ void SQFuncState::AddInstruction(SQInstruction &i)
_instructions.push_back(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); _table(_strings)->NewSlot(ns,(SQInteger)1);
return std::move(ns); return std::move(ns);
} }

View File

@ -43,7 +43,7 @@ struct SQFuncState
SQInteger TopTarget(); SQInteger TopTarget();
SQInteger GetUpTarget(SQInteger n); SQInteger GetUpTarget(SQInteger n);
bool IsLocal(SQUnsignedInteger stkpos); bool IsLocal(SQUnsignedInteger stkpos);
SQObject CreateString(const SQChar *s,SQInteger len = -1); SQObject CreateString(std::string_view s);
SQObject CreateTable(); SQObject CreateTable();
bool IsConstant(const SQObject &name,SQObject &e); bool IsConstant(const SQObject &name,SQObject &e);
SQInteger _returnexp; SQInteger _returnexp;

View File

@ -51,16 +51,16 @@ const SQChar *GetTypeName(const SQObjectPtr &obj1)
return IdType2Name(type(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; str->_sharedstate=ss;
return str; return str;
} }
void SQString::Release() void SQString::Release()
{ {
REMOVE_STRING(_sharedstate,this); _sharedstate->_stringtable->Remove(this);
} }
SQInteger SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval) SQInteger SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)

View File

@ -547,33 +547,34 @@ void SQStringTable::AllocNodes(SQInteger size)
memset(_strings,0,sizeof(SQString*)*(size_t)_numofslots); memset(_strings,0,sizeof(SQString*)*(size_t)_numofslots);
} }
SQString *SQStringTable::Add(const SQChar *news,SQInteger len) static const std::hash<std::string_view> string_table_hash{};
SQString *SQStringTable::Add(std::string_view new_string)
{ {
if(len<0) size_t len = new_string.size();
len = (SQInteger)strlen(news); auto slot = string_table_hash(new_string) & (_numofslots-1);
SQHash h = ::_hashstr(news,(size_t)len)&(_numofslots-1);
SQString *s; SQString *s;
for (s = _strings[h]; s; s = s->_next){ for (s = _strings[slot]; s; s = s->_next){
if(s->_len == len && (!memcmp(news,s->_val,(size_t)len))) if(static_cast<size_t>(s->_len) == len && (!memcmp(new_string.data(),s->_val,len)))
return s; //found return s; //found
} }
SQString *t=(SQString *)SQ_MALLOC(len+sizeof(SQString)); SQString *t=(SQString *)SQ_MALLOC(len+sizeof(SQString));
new (t) SQString(news, len); new (t) SQString(new_string);
t->_next = _strings[h]; t->_next = _strings[slot];
_strings[h] = t; _strings[slot] = t;
_slotused++; _slotused++;
if (_slotused > _numofslots) /* too crowded? */ if (_slotused > _numofslots) /* too crowded? */
Resize(_numofslots*2); Resize(_numofslots*2);
return t; return t;
} }
SQString::SQString(const SQChar *news, SQInteger len) SQString::SQString(std::string_view new_string)
{ {
memcpy(_val,news,(size_t)len); memcpy(_val,new_string.data(),new_string.size());
_val[len] = '\0'; _val[new_string.size()] = '\0';
_len = len; _len = new_string.size();
_hash = ::_hashstr(news,(size_t)len); _hash = string_table_hash(new_string);
_next = nullptr; _next = nullptr;
_sharedstate = nullptr; _sharedstate = nullptr;
} }

View File

@ -13,7 +13,7 @@ struct SQStringTable
{ {
SQStringTable(); SQStringTable();
~SQStringTable(); ~SQStringTable();
SQString *Add(const SQChar *,SQInteger len); SQString *Add(std::string_view str);
void Remove(SQString *); void Remove(SQString *);
private: private:
void Resize(SQInteger size); void Resize(SQInteger size);
@ -49,9 +49,6 @@ private:
RefNode **_buckets; 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 SQObjectPtr;
struct SQSharedState struct SQSharedState

View File

@ -2,28 +2,18 @@
#ifndef _SQSTRING_H_ #ifndef _SQSTRING_H_
#define _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 struct SQString : public SQRefCounted
{ {
SQString(const SQChar *news, SQInteger len); SQString(std::string_view str);
~SQString(){} ~SQString(){}
public: public:
static SQString *Create(SQSharedState *ss, const SQChar *, SQInteger len = -1 ); static SQString *Create(SQSharedState *ss, std::string_view str);
static SQString *Create(SQSharedState *ss, std::string_view str) { return Create(ss, str.data(), str.size()); }
SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval); SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
void Release() override; void Release() override;
SQSharedState *_sharedstate; SQSharedState *_sharedstate;
SQString *_next; //chain for the string table SQString *_next; //chain for the string table
SQInteger _len; SQInteger _len;
SQHash _hash; std::size_t _hash;
SQChar _val[1]; SQChar _val[1];
}; };