fix a potential bug of str initialization order

This commit is contained in:
BLUELOVETH 2023-07-26 14:23:19 +08:00
parent 67c0c68463
commit 9c18f48264
2 changed files with 25 additions and 12 deletions

View File

@ -115,11 +115,10 @@ struct StrName {
return this->index > other.index; return this->index > other.index;
} }
inline static std::map<Str, uint16_t, std::less<>> _interned;
inline static std::vector<Str> _r_interned;
static bool is_valid(int index); static bool is_valid(int index);
static StrName get(std::string_view s); static StrName get(std::string_view s);
static std::map<std::string, uint16_t, std::less<>>& _interned();
static std::vector<std::string>& _r_interned();
}; };
struct FastStrStream{ struct FastStrStream{

View File

@ -312,22 +312,33 @@ int utf8len(unsigned char c, bool suppress){
return os << sn.sv(); return os << sn.sv();
} }
std::map<std::string, uint16_t, std::less<>>& StrName::_interned(){
static std::map<std::string, uint16_t, std::less<>> interned;
return interned;
}
std::vector<std::string>& StrName::_r_interned(){
static std::vector<std::string> r_interned;
return r_interned;
}
StrName StrName::get(std::string_view s){ StrName StrName::get(std::string_view s){
auto it = _interned.find(s); auto it = _interned().find(s);
if(it != _interned.end()) return StrName(it->second); if(it != _interned().end()) return StrName(it->second);
uint16_t index = (uint16_t)(_r_interned.size() + 1); uint16_t index = (uint16_t)(_r_interned().size() + 1);
_interned[s] = index; std::string str(s);
_r_interned.push_back(s); _interned()[str] = index;
_r_interned().push_back(str);
return StrName(index); return StrName(index);
} }
Str StrName::escape() const { Str StrName::escape() const {
return _r_interned[index-1].escape(); return Str(sv()).escape();
} }
bool StrName::is_valid(int index) { bool StrName::is_valid(int index) {
// check _r_interned[index-1] is valid // check _r_interned()[index-1] is valid
return index > 0 && index <= _r_interned.size(); return index > 0 && index <= _r_interned().size();
} }
StrName::StrName(): index(0) {} StrName::StrName(): index(0) {}
@ -337,7 +348,10 @@ int utf8len(unsigned char c, bool suppress){
index = get(s.sv()).index; index = get(s.sv()).index;
} }
std::string_view StrName::sv() const { return _r_interned[index-1].sv(); } std::string_view StrName::sv() const {
const std::string& str = _r_interned()[index-1];
return std::string_view(str);
}
FastStrStream& FastStrStream::operator<<(const Str& s){ FastStrStream& FastStrStream::operator<<(const Str& s){
parts.push_back(&s); parts.push_back(&s);