Make class roots an image root
Change-Id: I1f1513bf34caa736c0dd7518a92f493b4573d776
diff --git a/src/class_linker.cc b/src/class_linker.cc
index d3a6ed0..1049107 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -563,15 +563,6 @@
return oat_file;
}
-struct ClassLinker::InitFromImageCallbackState {
- ClassLinker* class_linker;
-
- Class* class_roots[kClassRootsMax];
-
- typedef std::tr1::unordered_map<std::string, ClassRoot> Table;
- Table descriptor_to_class_root;
-};
-
void ClassLinker::InitFromImage() {
const Runtime* runtime = Runtime::Current();
if (runtime->IsVerboseStartup()) {
@@ -614,23 +605,12 @@
HeapBitmap* heap_bitmap = Heap::GetLiveBits();
DCHECK(heap_bitmap != NULL);
- InitFromImageCallbackState state;
- state.class_linker = this;
- for (size_t i = 0; i < kClassRootsMax; i++) {
- ClassRoot class_root = static_cast<ClassRoot>(i);
- state.descriptor_to_class_root[GetClassRootDescriptor(class_root)] = class_root;
- }
-
// reinit clases_ table
- heap_bitmap->Walk(InitFromImageCallback, &state);
+ heap_bitmap->Walk(InitFromImageCallback, this);
// reinit class_roots_
- Class* object_array_class = state.class_roots[kObjectArrayClass];
- class_roots_ = ObjectArray<Class>::Alloc(object_array_class, kClassRootsMax);
- for (size_t i = 0; i < kClassRootsMax; i++) {
- ClassRoot class_root = static_cast<ClassRoot>(i);
- SetClassRoot(class_root, state.class_roots[class_root]);
- }
+ Object* class_roots_object = spaces[0]->GetImageHeader().GetImageRoot(ImageHeader::kClassRoots);
+ class_roots_ = class_roots_object->AsObjectArray<Class>();
// reinit array_interfaces_ from any array class instance, they should all be ==
array_interfaces_ = GetClassRoot(kObjectArrayClass)->GetInterfaces();
@@ -660,10 +640,10 @@
void ClassLinker::InitFromImageCallback(Object* obj, void* arg) {
DCHECK(obj != NULL);
DCHECK(arg != NULL);
- InitFromImageCallbackState* state = reinterpret_cast<InitFromImageCallbackState*>(arg);
+ ClassLinker* class_linker = reinterpret_cast<ClassLinker*>(arg);
if (obj->IsString()) {
- state->class_linker->intern_table_->RegisterStrong(obj->AsString());
+ class_linker->intern_table_->RegisterStrong(obj->AsString());
return;
}
if (!obj->IsClass()) {
@@ -680,15 +660,7 @@
std::string descriptor = klass->GetDescriptor()->ToModifiedUtf8();
// restore class to ClassLinker::classes_ table
- state->class_linker->InsertClass(descriptor, klass);
-
- // check if this is a root, if so, register it
- typedef InitFromImageCallbackState::Table::const_iterator It; // TODO: C++0x auto
- It it = state->descriptor_to_class_root.find(descriptor);
- if (it != state->descriptor_to_class_root.end()) {
- ClassRoot class_root = it->second;
- state->class_roots[class_root] = klass;
- }
+ class_linker->InsertClass(descriptor, klass);
}
// Keep in sync with InitCallback. Anything we visit, we need to
@@ -964,8 +936,7 @@
klass->SetDescriptor(intern_table_->InternStrong(descriptor));
}
uint32_t access_flags = dex_class_def.access_flags_;
- // Make sure there aren't any "bonus" flags set, since we use them for runtime
- // state.
+ // Make sure there aren't any "bonus" flags set, since we use them for runtime state.
CHECK_EQ(access_flags & ~kAccClassFlagsMask, 0U);
klass->SetAccessFlags(access_flags);
klass->SetClassLoader(class_loader);