diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-07-16 11:27:00 -0700 |
---|---|---|
committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-07-17 03:30:50 +0900 |
commit | f77417eb42dcf73badb47580ae3e1afc80de2820 (patch) | |
tree | f452157057e3e0e6e87af735ef2ebd9f587b74b4 /symtab.cc | |
parent | f24ed1478d7d22f014049bf866c9aa73ff70f23e (diff) | |
download | kati-f77417eb42dcf73badb47580ae3e1afc80de2820.tar.gz |
[C++] Fix Symtab on MacOSX
On MacOSX string objects will be copied when vector<string>
grows and this invalidates StringPiece objects.
Diffstat (limited to 'symtab.cc')
-rw-r--r-- | symtab.cc | 13 |
1 files changed, 9 insertions, 4 deletions
@@ -23,7 +23,7 @@ #include "log.h" #include "strutil.h" -vector<string>* g_symbols; +vector<string*>* g_symbols; Symbol kEmptySym = Symbol(Symbol::IsUninitialized()); Symbol kShellSym = Symbol(Symbol::IsUninitialized()); @@ -53,14 +53,19 @@ class Symtab { kShellSym = Intern("SHELL"); } + ~Symtab() { + for (string* s : symbols_) + delete s; + } + Symbol InternImpl(StringPiece s) { auto found = symtab_.find(s); if (found != symtab_.end()) { return found->second; } - symbols_.push_back(s.as_string()); + symbols_.push_back(new string(s.data(), s.size())); Symbol sym = Symbol(symtab_.size()); - bool ok = symtab_.emplace(symbols_.back(), sym).second; + bool ok = symtab_.emplace(*symbols_.back(), sym).second; CHECK(ok); return sym; } @@ -74,7 +79,7 @@ class Symtab { private: unordered_map<StringPiece, Symbol> symtab_; - vector<string> symbols_; + vector<string*> symbols_; }; static Symtab* g_symtab; |