Add ObjectArray::CopyOf
As part of doing this, moved Heap::Alloc* helpers to the corresponding
classes in object.h to break heap.h<->object.h cycle due to use of
Heap from ObjectArray::CopyOf (which is templatized and needs to be
defined in .h file).
Change-Id: I1870af6e9dc6552820034ead5e20d13ae4da67da
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 22bcca6..5db2bea 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -113,11 +113,11 @@
}
DexCache* ClassLinker::AllocDexCache() {
- return down_cast<DexCache*>(Heap::AllocObjectArray<Object>(object_array_class_, DexCache::kMax));
+ return down_cast<DexCache*>(AllocObjectArray<Object>(DexCache::kMax));
}
Class* ClassLinker::AllocClass(DexCache* dex_cache) {
- Class* klass = down_cast<Class*>(Heap::AllocObject(java_lang_Class_));
+ Class* klass = down_cast<Class*>(Object::Alloc(java_lang_Class_));
klass->dex_cache_ = dex_cache;
return klass;
}
@@ -1106,18 +1106,12 @@
}
bool ClassLinker::LinkVirtualMethods(Class* klass) {
- uint32_t max_count = klass->NumVirtualMethods();
- if (klass->GetSuperClass() != NULL) {
- max_count += klass->GetSuperClass()->vtable_->GetLength();
- } else {
- CHECK(klass->GetDescriptor() == "Ljava/lang/Object;");
- }
- // TODO: do not assign to the vtable field until it is fully constructed.
- klass->vtable_ = AllocObjectArray<Method>(max_count);
if (klass->HasSuperClass()) {
+ uint32_t max_count = klass->NumVirtualMethods() + klass->GetSuperClass()->vtable_->GetLength();
size_t actual_count = klass->GetSuperClass()->vtable_->GetLength();
CHECK_LE(actual_count, max_count);
- ObjectArray<Method>::Copy(klass->GetSuperClass()->vtable_, 0, klass->vtable_, 0, actual_count);
+ // TODO: do not assign to the vtable field until it is fully constructed.
+ klass->vtable_ = klass->GetSuperClass()->vtable_->CopyOf(max_count);
// See if any of our virtual methods override the superclass.
for (size_t i = 0; i < klass->NumVirtualMethods(); ++i) {
Method* local_method = klass->GetVirtualMethod(i);
@@ -1148,20 +1142,23 @@
}
CHECK_LE(actual_count, max_count);
if (actual_count < max_count) {
- ObjectArray<Method>* new_vtable = AllocObjectArray<Method>(actual_count);
- ObjectArray<Method>::Copy(klass->vtable_, 0, new_vtable, 0, actual_count);
- klass->vtable_ = new_vtable;
+ // TODO: do not assign to the vtable field until it is fully constructed.
+ klass->vtable_ = klass->vtable_->CopyOf(actual_count);
LG << "shrunk vtable: "
<< "was " << max_count << ", "
<< "now " << actual_count;
}
} else {
CHECK(klass->GetDescriptor() == "Ljava/lang/Object;");
- if (!IsUint(16, klass->NumVirtualMethods())) {
+ uint32_t num_virtual_methods = klass->NumVirtualMethods();
+ CHECK(klass->GetDescriptor() == "Ljava/lang/Object;");
+ if (!IsUint(16, num_virtual_methods)) {
LG << "Too many methods"; // TODO: VirtualMachineError
return false;
}
- for (size_t i = 0; i < klass->NumVirtualMethods(); ++i) {
+ // TODO: do not assign to the vtable field until it is fully constructed.
+ klass->vtable_ = AllocObjectArray<Method>(num_virtual_methods);
+ for (size_t i = 0; i < num_virtual_methods; ++i) {
klass->vtable_->Set(i, klass->GetVirtualMethod(i));
klass->GetVirtualMethod(i)->method_index_ = i & 0xFFFF;
}
@@ -1267,20 +1264,13 @@
if (miranda_count != 0) {
int old_method_count = klass->NumVirtualMethods();
int new_method_count = old_method_count + miranda_count;
- ObjectArray<Method>* new_virtual_methods = AllocObjectArray<Method>(new_method_count);
- ObjectArray<Method>::Copy(klass->virtual_methods_, 0,
- new_virtual_methods, 0,
- old_method_count);
- klass->virtual_methods_ = new_virtual_methods;
+ klass->virtual_methods_ = klass->virtual_methods_->CopyOf(new_method_count);
CHECK(klass->vtable_ != NULL);
int old_vtable_count = klass->vtable_->GetLength();
int new_vtable_count = old_vtable_count + miranda_count;
- ObjectArray<Method>* new_vtable = AllocObjectArray<Method>(new_vtable_count);
- ObjectArray<Method>::Copy(klass->vtable_, 0,
- new_vtable, 0,
- old_vtable_count);
- klass->vtable_ = new_vtable;
+ // TODO: do not assign to the vtable field until it is fully constructed.
+ klass->vtable_ = klass->vtable_->CopyOf(new_vtable_count);
for (int i = 0; i < miranda_count; i++) {
Method* meth = AllocMethod();
@@ -1511,9 +1501,9 @@
const DexFile* dex_file = FindDexFile(referring->GetDexCache());
const DexFile::StringId& string_id = dex_file->GetStringId(string_idx);
const char* string_data = dex_file->GetStringData(string_id);
- String* new_string = Heap::AllocStringFromModifiedUtf8(java_lang_String_,
- char_array_class_,
- string_data);
+ String* new_string = String::AllocFromModifiedUtf8(java_lang_String_,
+ char_array_class_,
+ string_data);
// TODO: intern the new string
referring->GetDexCache()->SetResolvedString(string_idx, new_string);
return new_string;