mirror of https://github.com/OpenTTD/OpenTTD
Codechange: use std::string_view to create SQString
parent
fca99967a7
commit
ead3b96883
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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)));
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue