diff options
| author | 2013-09-24 10:26:00 -0700 | |
|---|---|---|
| committer | 2013-09-24 10:26:00 -0700 | |
| commit | e2ef879534e0eb7365f1997d0935c8eccb9d28fb (patch) | |
| tree | f85418cf1c3dc4ccc9758c2e12dca232bbbb4903 /compiler/driver/compiler_driver.cc | |
| parent | 57d56089f85b5e4901ebd7e61bc11717ceab7074 (diff) | |
| parent | 4b166f3e6444ca223e2dd0e486619bfd85fa8cc0 (diff) | |
am 4b166f3e: am cb5f5e53: Make sure CompilerDriver actually resolves types
* commit '4b166f3e6444ca223e2dd0e486619bfd85fa8cc0':
Make sure CompilerDriver actually resolves types
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) { |