mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
fix a potential bug of str initialization order
This commit is contained in:
parent
67c0c68463
commit
9c18f48264
@ -115,11 +115,10 @@ struct StrName {
|
||||
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 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{
|
||||
|
32
src/str.cpp
32
src/str.cpp
@ -312,22 +312,33 @@ int utf8len(unsigned char c, bool suppress){
|
||||
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){
|
||||
auto it = _interned.find(s);
|
||||
if(it != _interned.end()) return StrName(it->second);
|
||||
uint16_t index = (uint16_t)(_r_interned.size() + 1);
|
||||
_interned[s] = index;
|
||||
_r_interned.push_back(s);
|
||||
auto it = _interned().find(s);
|
||||
if(it != _interned().end()) return StrName(it->second);
|
||||
uint16_t index = (uint16_t)(_r_interned().size() + 1);
|
||||
std::string str(s);
|
||||
_interned()[str] = index;
|
||||
_r_interned().push_back(str);
|
||||
return StrName(index);
|
||||
}
|
||||
|
||||
Str StrName::escape() const {
|
||||
return _r_interned[index-1].escape();
|
||||
return Str(sv()).escape();
|
||||
}
|
||||
|
||||
bool StrName::is_valid(int index) {
|
||||
// check _r_interned[index-1] is valid
|
||||
return index > 0 && index <= _r_interned.size();
|
||||
// check _r_interned()[index-1] is valid
|
||||
return index > 0 && index <= _r_interned().size();
|
||||
}
|
||||
|
||||
StrName::StrName(): index(0) {}
|
||||
@ -337,7 +348,10 @@ int utf8len(unsigned char c, bool suppress){
|
||||
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){
|
||||
parts.push_back(&s);
|
||||
|
Loading…
x
Reference in New Issue
Block a user