aboutsummaryrefslogtreecommitdiff
path: root/symtab.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-07-16 11:27:00 -0700
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-07-17 03:30:50 +0900
commitf77417eb42dcf73badb47580ae3e1afc80de2820 (patch)
treef452157057e3e0e6e87af735ef2ebd9f587b74b4 /symtab.cc
parentf24ed1478d7d22f014049bf866c9aa73ff70f23e (diff)
downloadkati-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.cc13
1 files changed, 9 insertions, 4 deletions
diff --git a/symtab.cc b/symtab.cc
index dd4b405..16b9f80 100644
--- a/symtab.cc
+++ b/symtab.cc
@@ -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;