diff options
author | Brian Carlstrom <bdc@google.com> | 2013-09-23 17:48:16 -0700 |
---|---|---|
committer | Brian Carlstrom <bdc@google.com> | 2013-09-23 18:50:52 -0700 |
commit | cb5f5e53b580023fa2c1d8235c2e9aa1ff67d1dc (patch) | |
tree | 90033a1839d51e8b54a095aa896dc9295ccab959 /compiler/driver/compiler_driver.cc | |
parent | ee39a10e45a6a0880e8b829525c40d6055818560 (diff) | |
download | android_art-cb5f5e53b580023fa2c1d8235c2e9aa1ff67d1dc.tar.gz android_art-cb5f5e53b580023fa2c1d8235c2e9aa1ff67d1dc.tar.bz2 android_art-cb5f5e53b580023fa2c1d8235c2e9aa1ff67d1dc.zip |
Make sure CompilerDriver actually resolves types
Bug: 10750824
Change-Id: Ie61881f24196e851d87822798a7e9abdf9678aa3
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r-- | compiler/driver/compiler_driver.cc | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 1c831cf3f6..6eabeed34b 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -1471,6 +1471,24 @@ static void ResolveClassFieldsAndMethods(const ParallelCompilationManager* manag // generated code. const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index); if (!SkipClass(class_linker, jclass_loader, dex_file, class_def)) { + ScopedObjectAccess soa(self); + mirror::ClassLoader* class_loader = soa.Decode<mirror::ClassLoader*>(jclass_loader); + mirror::DexCache* dex_cache = class_linker->FindDexCache(dex_file); + + // Resolve the class. + mirror::Class* klass = class_linker->ResolveType(dex_file, class_def.class_idx_, dex_cache, + class_loader); + + bool resolve_fields_and_methods; + if (klass == NULL) { + // Class couldn't be resolved, for example, super-class is in a different dex file. Don't + // attempt to resolve methods and fields when there is no declaring class. + CHECK(soa.Self()->IsExceptionPending()); + soa.Self()->ClearException(); + resolve_fields_and_methods = false; + } else { + resolve_fields_and_methods = manager->GetCompiler()->IsImage(); + } // Note the class_data pointer advances through the headers, // static fields, instance fields, direct methods, and virtual // methods. @@ -1479,24 +1497,6 @@ static void ResolveClassFieldsAndMethods(const ParallelCompilationManager* manag // Empty class such as a marker interface. requires_constructor_barrier = false; } else { - ScopedObjectAccess soa(self); - mirror::ClassLoader* class_loader = soa.Decode<mirror::ClassLoader*>(jclass_loader); - mirror::DexCache* dex_cache = class_linker->FindDexCache(dex_file); - - // Resolve the class. - mirror::Class* klass = class_linker->ResolveType(dex_file, class_def.class_idx_, dex_cache, - class_loader); - - bool resolve_fields_and_methods; - if (klass == NULL) { - // Class couldn't be resolved, for example, super-class is in a different dex file. Don't - // attempt to resolve methods and fields when there is no declaring class. - CHECK(soa.Self()->IsExceptionPending()); - soa.Self()->ClearException(); - resolve_fields_and_methods = false; - } else { - resolve_fields_and_methods = manager->GetCompiler()->IsImage(); - } ClassDataItemIterator it(dex_file, class_data); while (it.HasNextStaticField()) { if (resolve_fields_and_methods) { |