summaryrefslogtreecommitdiffstats
path: root/compiler/driver/compiler_driver.cc
diff options
context:
space:
mode:
authorBrian Carlstrom <bdc@google.com>2013-09-23 17:48:16 -0700
committerBrian Carlstrom <bdc@google.com>2013-09-23 18:50:52 -0700
commitcb5f5e53b580023fa2c1d8235c2e9aa1ff67d1dc (patch)
tree90033a1839d51e8b54a095aa896dc9295ccab959 /compiler/driver/compiler_driver.cc
parentee39a10e45a6a0880e8b829525c40d6055818560 (diff)
downloadandroid_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.cc36
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) {