diff options
Diffstat (limited to 'runtime/intern_table.cc')
| -rw-r--r-- | runtime/intern_table.cc | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/runtime/intern_table.cc b/runtime/intern_table.cc index 20729790a9..8f9e072093 100644 --- a/runtime/intern_table.cc +++ b/runtime/intern_table.cc @@ -47,15 +47,16 @@ void InternTable::VisitRoots(RootVisitor* visitor, void* arg, bool only_dirty, bool clean_dirty) { MutexLock mu(Thread::Current(), intern_table_lock_); if (!only_dirty || is_dirty_) { - for (const auto& strong_intern : strong_interns_) { - visitor(strong_intern.second, arg); + for (auto& strong_intern : strong_interns_) { + strong_intern.second = reinterpret_cast<mirror::String*>(visitor(strong_intern.second, arg)); + DCHECK(strong_intern.second != nullptr); } + if (clean_dirty) { is_dirty_ = false; } } - // Note: we deliberately don't visit the weak_interns_ table and the immutable - // image roots. + // Note: we deliberately don't visit the weak_interns_ table and the immutable image roots. } mirror::String* InternTable::Lookup(Table& table, mirror::String* s, @@ -216,14 +217,16 @@ bool InternTable::ContainsWeak(mirror::String* s) { return found == s; } -void InternTable::SweepInternTableWeaks(IsMarkedTester is_marked, void* arg) { +void InternTable::SweepInternTableWeaks(RootVisitor visitor, void* arg) { MutexLock mu(Thread::Current(), intern_table_lock_); - // TODO: std::remove_if + lambda. for (auto it = weak_interns_.begin(), end = weak_interns_.end(); it != end;) { mirror::Object* object = it->second; - if (!is_marked(object, arg)) { + mirror::Object* new_object = visitor(object, arg); + if (new_object == nullptr) { + // TODO: use it = weak_interns_.erase(it) when we get a c++11 stl. weak_interns_.erase(it++); } else { + it->second = down_cast<mirror::String*>(new_object); ++it; } } |