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

View File

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

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

View File

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

View File

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

View File

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

View File

@ -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<std::string_view> 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<size_t>(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;
}

View File

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

View File

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