diff options
Diffstat (limited to 'runtime/class_table.cc')
| -rw-r--r-- | runtime/class_table.cc | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/runtime/class_table.cc b/runtime/class_table.cc index 3ed1c9540d..df2dbf416c 100644 --- a/runtime/class_table.cc +++ b/runtime/class_table.cc @@ -115,7 +115,7 @@ bool ClassTable::Remove(const char* descriptor) { return false; } -std::size_t ClassTable::ClassDescriptorHashEquals::operator()(const GcRoot<mirror::Class>& root) +uint32_t ClassTable::ClassDescriptorHashEquals::operator()(const GcRoot<mirror::Class>& root) const { std::string temp; return ComputeModifiedUtf8Hash(root.Read()->GetDescriptor(&temp)); @@ -133,7 +133,7 @@ bool ClassTable::ClassDescriptorHashEquals::operator()(const GcRoot<mirror::Clas return a.Read()->DescriptorEquals(descriptor); } -std::size_t ClassTable::ClassDescriptorHashEquals::operator()(const char* descriptor) const { +uint32_t ClassTable::ClassDescriptorHashEquals::operator()(const char* descriptor) const { return ComputeModifiedUtf8Hash(descriptor); } @@ -148,4 +148,29 @@ bool ClassTable::InsertDexFile(mirror::Object* dex_file) { return true; } +size_t ClassTable::WriteToMemory(uint8_t* ptr) const { + ClassSet combined; + // Combine all the class sets in case there are multiple, also adjusts load factor back to + // default in case classes were pruned. + for (const ClassSet& class_set : classes_) { + for (const GcRoot<mirror::Class>& root : class_set) { + combined.Insert(root); + } + } + const size_t ret = combined.WriteToMemory(ptr); + // Sanity check. + if (kIsDebugBuild && ptr != nullptr) { + size_t read_count; + ClassSet class_set(ptr, /*make copy*/false, &read_count); + class_set.Verify(); + } + return ret; +} + +size_t ClassTable::ReadFromMemory(uint8_t* ptr) { + size_t read_count = 0; + classes_.insert(classes_.begin(), ClassSet(ptr, /*make copy*/false, &read_count)); + return read_count; +} + } // namespace art |