summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2014-12-10 20:19:38 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-12-10 20:19:38 +0000
commit2387a59bf0e5bcc8f3aad8195eb1eea63d00939b (patch)
tree2901835e5d75498fd23b487a801642e047d2d106 /runtime
parentb3991da5e3396f039b573f85a6f3f4638b50270b (diff)
parent3138584a720b86f2f542160425d3a922920760c0 (diff)
downloadart-2387a59bf0e5bcc8f3aad8195eb1eea63d00939b.tar.gz
art-2387a59bf0e5bcc8f3aad8195eb1eea63d00939b.tar.bz2
art-2387a59bf0e5bcc8f3aad8195eb1eea63d00939b.zip
Merge "Ensure void type is resolved when running without image"
Diffstat (limited to 'runtime')
-rw-r--r--runtime/class_linker.cc25
1 files changed, 25 insertions, 0 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 1f4cf8fcfc..609478d126 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -575,6 +575,23 @@ void ClassLinker::InitWithoutImage(const std::vector<const DexFile*>& boot_class
FindSystemClass(self, "[Ljava/lang/StackTraceElement;"));
mirror::StackTraceElement::SetClass(GetClassRoot(kJavaLangStackTraceElement));
+ // Ensure void type is resolved in the core's dex cache so java.lang.Void is correctly
+ // initialized.
+ {
+ const DexFile& dex_file = java_lang_Object->GetDexFile();
+ const DexFile::StringId* void_string_id = dex_file.FindStringId("V");
+ CHECK(void_string_id != nullptr);
+ uint32_t void_string_index = dex_file.GetIndexForStringId(*void_string_id);
+ const DexFile::TypeId* void_type_id = dex_file.FindTypeId(void_string_index);
+ CHECK(void_type_id != nullptr);
+ uint16_t void_type_idx = dex_file.GetIndexForTypeId(*void_type_id);
+ // Now we resolve void type so the dex cache contains it. We use java.lang.Object class
+ // as referrer so the used dex cache is core's one.
+ mirror::Class* resolved_type = ResolveType(dex_file, void_type_idx, java_lang_Object.Get());
+ CHECK_EQ(resolved_type, GetClassRoot(kPrimitiveVoid));
+ self->AssertNoPendingException();
+ }
+
FinishInit(self);
VLOG(startup) << "ClassLinker::InitFromCompiler exiting";
@@ -3710,6 +3727,14 @@ bool ClassLinker::VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class
return false;
}
+ // We may be running with a preopted oat file but without image. In this case,
+ // we don't skip verification of preverified classes to ensure we initialize
+ // dex caches with all types resolved during verification.
+ if (!Runtime::Current()->IsCompiler() &&
+ !Runtime::Current()->GetHeap()->HasImageSpace()) {
+ return false;
+ }
+
uint16_t class_def_index = klass->GetDexClassDefIndex();
oat_file_class_status = oat_dex_file->GetOatClass(class_def_index).GetStatus();
if (oat_file_class_status == mirror::Class::kStatusVerified ||