Home | History | Annotate | Download | only in runtime
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "class_linker.h"
     18 
     19 #include <memory>
     20 #include <string>
     21 
     22 #include "art_field-inl.h"
     23 #include "art_method-inl.h"
     24 #include "class_linker-inl.h"
     25 #include "common_runtime_test.h"
     26 #include "dex_file.h"
     27 #include "entrypoints/entrypoint_utils-inl.h"
     28 #include "gc/heap.h"
     29 #include "mirror/abstract_method.h"
     30 #include "mirror/accessible_object.h"
     31 #include "mirror/class-inl.h"
     32 #include "mirror/dex_cache.h"
     33 #include "mirror/field.h"
     34 #include "mirror/object-inl.h"
     35 #include "mirror/object_array-inl.h"
     36 #include "mirror/proxy.h"
     37 #include "mirror/reference.h"
     38 #include "mirror/stack_trace_element.h"
     39 #include "mirror/string-inl.h"
     40 #include "handle_scope-inl.h"
     41 #include "scoped_thread_state_change.h"
     42 #include "thread-inl.h"
     43 
     44 namespace art {
     45 
     46 class ClassLinkerTest : public CommonRuntimeTest {
     47  protected:
     48   void AssertNonExistentClass(const std::string& descriptor)
     49       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
     50     Thread* self = Thread::Current();
     51     EXPECT_TRUE(class_linker_->FindSystemClass(self, descriptor.c_str()) == nullptr);
     52     EXPECT_TRUE(self->IsExceptionPending());
     53     mirror::Object* exception = self->GetException();
     54     self->ClearException();
     55     mirror::Class* exception_class =
     56         class_linker_->FindSystemClass(self, "Ljava/lang/NoClassDefFoundError;");
     57     EXPECT_TRUE(exception->InstanceOf(exception_class));
     58   }
     59 
     60   void AssertPrimitiveClass(const std::string& descriptor)
     61       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
     62     Thread* self = Thread::Current();
     63     AssertPrimitiveClass(descriptor, class_linker_->FindSystemClass(self, descriptor.c_str()));
     64   }
     65 
     66   void AssertPrimitiveClass(const std::string& descriptor, mirror::Class* primitive)
     67       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
     68     ASSERT_TRUE(primitive != nullptr);
     69     ASSERT_TRUE(primitive->GetClass() != nullptr);
     70     ASSERT_EQ(primitive->GetClass(), primitive->GetClass()->GetClass());
     71     EXPECT_TRUE(primitive->GetClass()->GetSuperClass() != nullptr);
     72     std::string temp;
     73     ASSERT_STREQ(descriptor.c_str(), primitive->GetDescriptor(&temp));
     74     EXPECT_TRUE(primitive->GetSuperClass() == nullptr);
     75     EXPECT_FALSE(primitive->HasSuperClass());
     76     EXPECT_TRUE(primitive->GetClassLoader() == nullptr);
     77     EXPECT_EQ(mirror::Class::kStatusInitialized, primitive->GetStatus());
     78     EXPECT_FALSE(primitive->IsErroneous());
     79     EXPECT_TRUE(primitive->IsLoaded());
     80     EXPECT_TRUE(primitive->IsResolved());
     81     EXPECT_TRUE(primitive->IsVerified());
     82     EXPECT_TRUE(primitive->IsInitialized());
     83     EXPECT_FALSE(primitive->IsArrayInstance());
     84     EXPECT_FALSE(primitive->IsArrayClass());
     85     EXPECT_TRUE(primitive->GetComponentType() == nullptr);
     86     EXPECT_FALSE(primitive->IsInterface());
     87     EXPECT_TRUE(primitive->IsPublic());
     88     EXPECT_TRUE(primitive->IsFinal());
     89     EXPECT_TRUE(primitive->IsPrimitive());
     90     EXPECT_FALSE(primitive->IsSynthetic());
     91     EXPECT_EQ(0U, primitive->NumDirectMethods());
     92     EXPECT_EQ(0U, primitive->NumVirtualMethods());
     93     EXPECT_EQ(0U, primitive->NumInstanceFields());
     94     EXPECT_EQ(0U, primitive->NumStaticFields());
     95     EXPECT_EQ(0U, primitive->NumDirectInterfaces());
     96     EXPECT_FALSE(primitive->HasVTable());
     97     EXPECT_EQ(0, primitive->GetIfTableCount());
     98     EXPECT_TRUE(primitive->GetIfTable() == nullptr);
     99     EXPECT_EQ(kAccPublic | kAccFinal | kAccAbstract, primitive->GetAccessFlags());
    100   }
    101 
    102   void AssertArrayClass(const std::string& array_descriptor,
    103                         const std::string& component_type,
    104                         mirror::ClassLoader* class_loader)
    105       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    106     Thread* self = Thread::Current();
    107     StackHandleScope<2> hs(self);
    108     Handle<mirror::ClassLoader> loader(hs.NewHandle(class_loader));
    109     Handle<mirror::Class> array(
    110         hs.NewHandle(class_linker_->FindClass(self, array_descriptor.c_str(), loader)));
    111     std::string temp;
    112     EXPECT_STREQ(component_type.c_str(), array->GetComponentType()->GetDescriptor(&temp));
    113     EXPECT_EQ(class_loader, array->GetClassLoader());
    114     EXPECT_EQ(kAccFinal | kAccAbstract, (array->GetAccessFlags() & (kAccFinal | kAccAbstract)));
    115     AssertArrayClass(array_descriptor, array);
    116   }
    117 
    118   void AssertArrayClass(const std::string& array_descriptor, Handle<mirror::Class> array)
    119       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    120     ASSERT_TRUE(array.Get() != nullptr);
    121     ASSERT_TRUE(array->GetClass() != nullptr);
    122     ASSERT_EQ(array->GetClass(), array->GetClass()->GetClass());
    123     EXPECT_TRUE(array->GetClass()->GetSuperClass() != nullptr);
    124     std::string temp;
    125     ASSERT_STREQ(array_descriptor.c_str(), array->GetDescriptor(&temp));
    126     EXPECT_TRUE(array->GetSuperClass() != nullptr);
    127     Thread* self = Thread::Current();
    128     EXPECT_EQ(class_linker_->FindSystemClass(self, "Ljava/lang/Object;"), array->GetSuperClass());
    129     EXPECT_TRUE(array->HasSuperClass());
    130     ASSERT_TRUE(array->GetComponentType() != nullptr);
    131     ASSERT_GT(strlen(array->GetComponentType()->GetDescriptor(&temp)), 0U);
    132     EXPECT_EQ(mirror::Class::kStatusInitialized, array->GetStatus());
    133     EXPECT_FALSE(array->IsErroneous());
    134     EXPECT_TRUE(array->IsLoaded());
    135     EXPECT_TRUE(array->IsResolved());
    136     EXPECT_TRUE(array->IsVerified());
    137     EXPECT_TRUE(array->IsInitialized());
    138     EXPECT_FALSE(array->IsArrayInstance());
    139     EXPECT_TRUE(array->IsArrayClass());
    140     EXPECT_FALSE(array->IsInterface());
    141     EXPECT_EQ(array->GetComponentType()->IsPublic(), array->IsPublic());
    142     EXPECT_TRUE(array->IsFinal());
    143     EXPECT_FALSE(array->IsPrimitive());
    144     EXPECT_FALSE(array->IsSynthetic());
    145     EXPECT_EQ(0U, array->NumDirectMethods());
    146     EXPECT_EQ(0U, array->NumVirtualMethods());
    147     EXPECT_EQ(0U, array->NumInstanceFields());
    148     EXPECT_EQ(0U, array->NumStaticFields());
    149     EXPECT_EQ(2U, array->NumDirectInterfaces());
    150     EXPECT_TRUE(array->ShouldHaveEmbeddedImtAndVTable());
    151     EXPECT_EQ(2, array->GetIfTableCount());
    152     ASSERT_TRUE(array->GetIfTable() != nullptr);
    153     mirror::Class* direct_interface0 = mirror::Class::GetDirectInterface(self, array, 0);
    154     EXPECT_TRUE(direct_interface0 != nullptr);
    155     EXPECT_STREQ(direct_interface0->GetDescriptor(&temp), "Ljava/lang/Cloneable;");
    156     mirror::Class* direct_interface1 = mirror::Class::GetDirectInterface(self, array, 1);
    157     EXPECT_STREQ(direct_interface1->GetDescriptor(&temp), "Ljava/io/Serializable;");
    158     mirror::Class* array_ptr = array->GetComponentType();
    159     EXPECT_EQ(class_linker_->FindArrayClass(self, &array_ptr), array.Get());
    160   }
    161 
    162   void AssertMethod(ArtMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    163     EXPECT_TRUE(method != nullptr);
    164     EXPECT_TRUE(method->GetDeclaringClass() != nullptr);
    165     EXPECT_TRUE(method->GetName() != nullptr);
    166     EXPECT_TRUE(method->GetSignature() != Signature::NoSignature());
    167 
    168     EXPECT_TRUE(method->HasDexCacheResolvedMethods());
    169     EXPECT_TRUE(method->HasDexCacheResolvedTypes());
    170     EXPECT_TRUE(method->HasSameDexCacheResolvedMethods(
    171         method->GetDeclaringClass()->GetDexCache()->GetResolvedMethods()));
    172     EXPECT_TRUE(method->HasSameDexCacheResolvedTypes(
    173         method->GetDeclaringClass()->GetDexCache()->GetResolvedTypes()));
    174   }
    175 
    176   void AssertField(mirror::Class* klass, ArtField* field)
    177       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    178     EXPECT_TRUE(field != nullptr);
    179     EXPECT_EQ(klass, field->GetDeclaringClass());
    180     EXPECT_TRUE(field->GetName() != nullptr);
    181     EXPECT_TRUE(field->GetType<true>() != nullptr);
    182   }
    183 
    184   void AssertClass(const std::string& descriptor, Handle<mirror::Class> klass)
    185       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    186     std::string temp;
    187     EXPECT_STREQ(descriptor.c_str(), klass->GetDescriptor(&temp));
    188     if (descriptor == "Ljava/lang/Object;") {
    189       EXPECT_FALSE(klass->HasSuperClass());
    190     } else {
    191       EXPECT_TRUE(klass->HasSuperClass());
    192       EXPECT_TRUE(klass->GetSuperClass() != nullptr);
    193     }
    194     EXPECT_TRUE(klass->GetClass() != nullptr);
    195     EXPECT_EQ(klass->GetClass(), klass->GetClass()->GetClass());
    196     EXPECT_TRUE(klass->GetDexCache() != nullptr);
    197     EXPECT_TRUE(klass->IsLoaded());
    198     EXPECT_TRUE(klass->IsResolved());
    199     EXPECT_FALSE(klass->IsErroneous());
    200     EXPECT_FALSE(klass->IsArrayClass());
    201     EXPECT_TRUE(klass->GetComponentType() == nullptr);
    202     EXPECT_TRUE(klass->IsInSamePackage(klass.Get()));
    203     EXPECT_TRUE(klass->GetDexCacheStrings() != nullptr);
    204     EXPECT_EQ(klass->GetDexCacheStrings(), klass->GetDexCache()->GetStrings());
    205     std::string temp2;
    206     EXPECT_TRUE(mirror::Class::IsInSamePackage(klass->GetDescriptor(&temp),
    207                                                klass->GetDescriptor(&temp2)));
    208     if (klass->IsInterface()) {
    209       EXPECT_TRUE(klass->IsAbstract());
    210       if (klass->NumDirectMethods() == 1) {
    211         EXPECT_TRUE(klass->GetDirectMethod(0, sizeof(void*))->IsClassInitializer());
    212         EXPECT_TRUE(klass->GetDirectMethod(0, sizeof(void*))->IsDirect());
    213       } else {
    214         EXPECT_EQ(0U, klass->NumDirectMethods());
    215       }
    216     } else {
    217       if (!klass->IsSynthetic()) {
    218         EXPECT_NE(0U, klass->NumDirectMethods());
    219       }
    220     }
    221     EXPECT_EQ(klass->IsInterface(), !klass->HasVTable());
    222     mirror::IfTable* iftable = klass->GetIfTable();
    223     for (int i = 0; i < klass->GetIfTableCount(); i++) {
    224       mirror::Class* interface = iftable->GetInterface(i);
    225       ASSERT_TRUE(interface != nullptr);
    226       if (klass->IsInterface()) {
    227         EXPECT_EQ(0U, iftable->GetMethodArrayCount(i));
    228       } else {
    229         EXPECT_EQ(interface->NumVirtualMethods(), iftable->GetMethodArrayCount(i));
    230       }
    231     }
    232     if (klass->IsAbstract()) {
    233       EXPECT_FALSE(klass->IsFinal());
    234     } else {
    235       EXPECT_FALSE(klass->IsAnnotation());
    236     }
    237     if (klass->IsFinal()) {
    238       EXPECT_FALSE(klass->IsAbstract());
    239       EXPECT_FALSE(klass->IsAnnotation());
    240     }
    241     if (klass->IsAnnotation()) {
    242       EXPECT_FALSE(klass->IsFinal());
    243       EXPECT_TRUE(klass->IsAbstract());
    244     }
    245 
    246     EXPECT_FALSE(klass->IsPrimitive());
    247     EXPECT_TRUE(klass->CanAccess(klass.Get()));
    248 
    249     for (ArtMethod& method : klass->GetDirectMethods(sizeof(void*))) {
    250       AssertMethod(&method);
    251       EXPECT_TRUE(method.IsDirect());
    252       EXPECT_EQ(klass.Get(), method.GetDeclaringClass());
    253     }
    254 
    255     for (ArtMethod& method : klass->GetVirtualMethods(sizeof(void*))) {
    256       AssertMethod(&method);
    257       EXPECT_FALSE(method.IsDirect());
    258       EXPECT_TRUE(method.GetDeclaringClass()->IsAssignableFrom(klass.Get()));
    259     }
    260 
    261     for (size_t i = 0; i < klass->NumInstanceFields(); i++) {
    262       ArtField* field = klass->GetInstanceField(i);
    263       AssertField(klass.Get(), field);
    264       EXPECT_FALSE(field->IsStatic());
    265     }
    266 
    267     for (size_t i = 0; i < klass->NumStaticFields(); i++) {
    268       ArtField* field = klass->GetStaticField(i);
    269       AssertField(klass.Get(), field);
    270       EXPECT_TRUE(field->IsStatic());
    271     }
    272 
    273     // Confirm that all instances field offsets are packed together at the start.
    274     EXPECT_GE(klass->NumInstanceFields(), klass->NumReferenceInstanceFields());
    275     MemberOffset start_ref_offset = klass->GetFirstReferenceInstanceFieldOffset();
    276     MemberOffset end_ref_offset(start_ref_offset.Uint32Value() +
    277                                 klass->NumReferenceInstanceFields() *
    278                                     sizeof(mirror::HeapReference<mirror::Object>));
    279     MemberOffset current_ref_offset = start_ref_offset;
    280     for (size_t i = 0; i < klass->NumInstanceFields(); i++) {
    281       ArtField* field = klass->GetInstanceField(i);
    282       mirror::Class* field_type = field->GetType<true>();
    283       ASSERT_TRUE(field_type != nullptr);
    284       if (!field->IsPrimitiveType()) {
    285         ASSERT_TRUE(!field_type->IsPrimitive());
    286         ASSERT_EQ(current_ref_offset.Uint32Value(), field->GetOffset().Uint32Value());
    287         if (current_ref_offset.Uint32Value() == end_ref_offset.Uint32Value()) {
    288           // While Reference.referent is not primitive, the ClassLinker
    289           // treats it as such so that the garbage collector won't scan it.
    290           EXPECT_EQ(PrettyField(field),
    291                     "java.lang.Object java.lang.ref.Reference.referent");
    292         } else {
    293           current_ref_offset = MemberOffset(current_ref_offset.Uint32Value() +
    294                                             sizeof(mirror::HeapReference<mirror::Object>));
    295         }
    296       } else {
    297         if (field->GetOffset().Uint32Value() < end_ref_offset.Uint32Value()) {
    298           // Shuffled before references.
    299           ASSERT_LT(field->GetOffset().Uint32Value(), start_ref_offset.Uint32Value());
    300           CHECK(!IsAligned<4>(field->GetOffset().Uint32Value()));
    301         }
    302       }
    303     }
    304     ASSERT_EQ(end_ref_offset.Uint32Value(), current_ref_offset.Uint32Value());
    305 
    306     uint32_t total_num_reference_instance_fields = 0;
    307     mirror::Class* k = klass.Get();
    308     while (k != nullptr) {
    309       total_num_reference_instance_fields += k->NumReferenceInstanceFields();
    310       k = k->GetSuperClass();
    311     }
    312     EXPECT_GE(total_num_reference_instance_fields, 1U);  // Should always have Object's class.
    313     if (klass->GetReferenceInstanceOffsets() != mirror::Class::kClassWalkSuper) {
    314       // The reference instance offsets have a bit set for each reference offset.
    315       // +1 for Object's class.
    316       EXPECT_EQ(static_cast<uint32_t>(POPCOUNT(klass->GetReferenceInstanceOffsets())) + 1,
    317                 total_num_reference_instance_fields);
    318     }
    319   }
    320 
    321   void AssertDexFileClass(mirror::ClassLoader* class_loader, const std::string& descriptor)
    322       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    323     ASSERT_TRUE(descriptor != nullptr);
    324     Thread* self = Thread::Current();
    325     StackHandleScope<1> hs(self);
    326     Handle<mirror::Class> klass(
    327         hs.NewHandle(class_linker_->FindSystemClass(self, descriptor.c_str())));
    328     ASSERT_TRUE(klass.Get() != nullptr);
    329     std::string temp;
    330     EXPECT_STREQ(descriptor.c_str(), klass.Get()->GetDescriptor(&temp));
    331     EXPECT_EQ(class_loader, klass->GetClassLoader());
    332     if (klass->IsPrimitive()) {
    333       AssertPrimitiveClass(descriptor, klass.Get());
    334     } else if (klass->IsArrayClass()) {
    335       AssertArrayClass(descriptor, klass);
    336     } else {
    337       AssertClass(descriptor, klass);
    338     }
    339   }
    340 
    341   void AssertDexFile(const DexFile& dex, mirror::ClassLoader* class_loader)
    342       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    343     // Verify all the classes defined in this file
    344     for (size_t i = 0; i < dex.NumClassDefs(); i++) {
    345       const DexFile::ClassDef& class_def = dex.GetClassDef(i);
    346       const char* descriptor = dex.GetClassDescriptor(class_def);
    347       AssertDexFileClass(class_loader, descriptor);
    348     }
    349     // Verify all the types referenced by this file
    350     for (size_t i = 0; i < dex.NumTypeIds(); i++) {
    351       const DexFile::TypeId& type_id = dex.GetTypeId(i);
    352       const char* descriptor = dex.GetTypeDescriptor(type_id);
    353       AssertDexFileClass(class_loader, descriptor);
    354     }
    355     TestRootVisitor visitor;
    356     class_linker_->VisitRoots(&visitor, kVisitRootFlagAllRoots);
    357     // Verify the dex cache has resolution methods in all resolved method slots
    358     mirror::DexCache* dex_cache = class_linker_->FindDexCache(dex);
    359     auto* resolved_methods = dex_cache->GetResolvedMethods();
    360     for (size_t i = 0; i < static_cast<size_t>(resolved_methods->GetLength()); i++) {
    361       EXPECT_TRUE(resolved_methods->GetElementPtrSize<ArtMethod*>(i, sizeof(void*)) != nullptr)
    362           << dex.GetLocation() << " i=" << i;
    363     }
    364   }
    365 
    366   class TestRootVisitor : public SingleRootVisitor {
    367    public:
    368     void VisitRoot(mirror::Object* root, const RootInfo& info ATTRIBUTE_UNUSED) OVERRIDE {
    369       EXPECT_TRUE(root != nullptr);
    370     }
    371   };
    372 };
    373 
    374 struct CheckOffset {
    375   size_t cpp_offset;
    376   const char* java_name;
    377   CheckOffset(size_t c, const char* j) : cpp_offset(c), java_name(j) {}
    378 };
    379 
    380 template <typename T>
    381 struct CheckOffsets {
    382   CheckOffsets(bool is_static_in, const char* class_descriptor_in)
    383       : is_static(is_static_in), class_descriptor(class_descriptor_in) {}
    384   bool is_static;
    385   std::string class_descriptor;
    386   std::vector<CheckOffset> offsets;
    387 
    388   bool Check() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    389     Thread* self = Thread::Current();
    390     mirror::Class* klass =
    391         Runtime::Current()->GetClassLinker()->FindSystemClass(self, class_descriptor.c_str());
    392     CHECK(klass != nullptr) << class_descriptor;
    393 
    394     bool error = false;
    395 
    396     // Classes have a different size due to padding field. Strings are variable length.
    397     if (!klass->IsClassClass() && !klass->IsStringClass() && !is_static) {
    398       // Currently only required for AccessibleObject since of the padding fields. The class linker
    399       // says AccessibleObject is 9 bytes but sizeof(AccessibleObject) is 12 bytes due to padding.
    400       // The RoundUp is to get around this case.
    401       static constexpr size_t kPackAlignment = 4;
    402       size_t expected_size = RoundUp(is_static ? klass->GetClassSize(): klass->GetObjectSize(),
    403           kPackAlignment);
    404       if (sizeof(T) != expected_size) {
    405         LOG(ERROR) << "Class size mismatch:"
    406            << " class=" << class_descriptor
    407            << " Java=" << expected_size
    408            << " C++=" << sizeof(T);
    409         error = true;
    410       }
    411     }
    412 
    413     size_t num_fields = is_static ? klass->NumStaticFields() : klass->NumInstanceFields();
    414     if (offsets.size() != num_fields) {
    415       LOG(ERROR) << "Field count mismatch:"
    416          << " class=" << class_descriptor
    417          << " Java=" << num_fields
    418          << " C++=" << offsets.size();
    419       error = true;
    420     }
    421 
    422     for (size_t i = 0; i < offsets.size(); i++) {
    423       ArtField* field = is_static ? klass->GetStaticField(i) : klass->GetInstanceField(i);
    424       StringPiece field_name(field->GetName());
    425       if (field_name != offsets[i].java_name) {
    426         error = true;
    427       }
    428     }
    429     if (error) {
    430       for (size_t i = 0; i < offsets.size(); i++) {
    431         CheckOffset& offset = offsets[i];
    432         ArtField* field = is_static ? klass->GetStaticField(i) : klass->GetInstanceField(i);
    433         StringPiece field_name(field->GetName());
    434         if (field_name != offsets[i].java_name) {
    435           LOG(ERROR) << "JAVA FIELD ORDER MISMATCH NEXT LINE:";
    436         }
    437         LOG(ERROR) << "Java field order:"
    438            << " i=" << i << " class=" << class_descriptor
    439            << " Java=" << field_name
    440            << " CheckOffsets=" << offset.java_name;
    441       }
    442     }
    443 
    444     for (size_t i = 0; i < offsets.size(); i++) {
    445       CheckOffset& offset = offsets[i];
    446       ArtField* field = is_static ? klass->GetStaticField(i) : klass->GetInstanceField(i);
    447       if (field->GetOffset().Uint32Value() != offset.cpp_offset) {
    448         error = true;
    449       }
    450     }
    451     if (error) {
    452       for (size_t i = 0; i < offsets.size(); i++) {
    453         CheckOffset& offset = offsets[i];
    454         ArtField* field = is_static ? klass->GetStaticField(i) : klass->GetInstanceField(i);
    455         if (field->GetOffset().Uint32Value() != offset.cpp_offset) {
    456           LOG(ERROR) << "OFFSET MISMATCH NEXT LINE:";
    457         }
    458         LOG(ERROR) << "Offset: class=" << class_descriptor << " field=" << offset.java_name
    459            << " Java=" << field->GetOffset().Uint32Value() << " C++=" << offset.cpp_offset;
    460       }
    461     }
    462 
    463     return !error;
    464   };
    465 
    466   void addOffset(size_t offset, const char* name) {
    467     offsets.push_back(CheckOffset(offset, name));
    468   }
    469 
    470  private:
    471   DISALLOW_IMPLICIT_CONSTRUCTORS(CheckOffsets);
    472 };
    473 
    474 // Note that ClassLinkerTest.ValidateFieldOrderOfJavaCppUnionClasses
    475 // is first since if it is failing, others are unlikely to succeed.
    476 
    477 struct ObjectOffsets : public CheckOffsets<mirror::Object> {
    478   ObjectOffsets() : CheckOffsets<mirror::Object>(false, "Ljava/lang/Object;") {
    479     addOffset(OFFSETOF_MEMBER(mirror::Object, klass_), "shadow$_klass_");
    480     addOffset(OFFSETOF_MEMBER(mirror::Object, monitor_), "shadow$_monitor_");
    481 #ifdef USE_BROOKS_READ_BARRIER
    482     addOffset(OFFSETOF_MEMBER(mirror::Object, x_rb_ptr_), "shadow$_x_rb_ptr_");
    483     addOffset(OFFSETOF_MEMBER(mirror::Object, x_xpadding_), "shadow$_x_xpadding_");
    484 #endif
    485   };
    486 };
    487 
    488 struct ClassOffsets : public CheckOffsets<mirror::Class> {
    489   ClassOffsets() : CheckOffsets<mirror::Class>(false, "Ljava/lang/Class;") {
    490     addOffset(OFFSETOF_MEMBER(mirror::Class, access_flags_), "accessFlags");
    491     addOffset(OFFSETOF_MEMBER(mirror::Class, class_loader_), "classLoader");
    492     addOffset(OFFSETOF_MEMBER(mirror::Class, class_size_), "classSize");
    493     addOffset(OFFSETOF_MEMBER(mirror::Class, clinit_thread_id_), "clinitThreadId");
    494     addOffset(OFFSETOF_MEMBER(mirror::Class, component_type_), "componentType");
    495     addOffset(OFFSETOF_MEMBER(mirror::Class, dex_cache_), "dexCache");
    496     addOffset(OFFSETOF_MEMBER(mirror::Class, dex_cache_strings_), "dexCacheStrings");
    497     addOffset(OFFSETOF_MEMBER(mirror::Class, dex_class_def_idx_), "dexClassDefIndex");
    498     addOffset(OFFSETOF_MEMBER(mirror::Class, dex_type_idx_), "dexTypeIndex");
    499     addOffset(OFFSETOF_MEMBER(mirror::Class, direct_methods_), "directMethods");
    500     addOffset(OFFSETOF_MEMBER(mirror::Class, ifields_), "iFields");
    501     addOffset(OFFSETOF_MEMBER(mirror::Class, iftable_), "ifTable");
    502     addOffset(OFFSETOF_MEMBER(mirror::Class, name_), "name");
    503     addOffset(OFFSETOF_MEMBER(mirror::Class, num_direct_methods_), "numDirectMethods");
    504     addOffset(OFFSETOF_MEMBER(mirror::Class, num_instance_fields_), "numInstanceFields");
    505     addOffset(OFFSETOF_MEMBER(mirror::Class, num_reference_instance_fields_),
    506               "numReferenceInstanceFields");
    507     addOffset(OFFSETOF_MEMBER(mirror::Class, num_reference_static_fields_),
    508               "numReferenceStaticFields");
    509     addOffset(OFFSETOF_MEMBER(mirror::Class, num_static_fields_), "numStaticFields");
    510     addOffset(OFFSETOF_MEMBER(mirror::Class, num_virtual_methods_), "numVirtualMethods");
    511     addOffset(OFFSETOF_MEMBER(mirror::Class, object_size_), "objectSize");
    512     addOffset(OFFSETOF_MEMBER(mirror::Class, primitive_type_), "primitiveType");
    513     addOffset(OFFSETOF_MEMBER(mirror::Class, reference_instance_offsets_),
    514               "referenceInstanceOffsets");
    515     addOffset(OFFSETOF_MEMBER(mirror::Class, sfields_), "sFields");
    516     addOffset(OFFSETOF_MEMBER(mirror::Class, status_), "status");
    517     addOffset(OFFSETOF_MEMBER(mirror::Class, super_class_), "superClass");
    518     addOffset(OFFSETOF_MEMBER(mirror::Class, verify_error_class_), "verifyErrorClass");
    519     addOffset(OFFSETOF_MEMBER(mirror::Class, virtual_methods_), "virtualMethods");
    520     addOffset(OFFSETOF_MEMBER(mirror::Class, vtable_), "vtable");
    521   };
    522 };
    523 
    524 struct StringOffsets : public CheckOffsets<mirror::String> {
    525   StringOffsets() : CheckOffsets<mirror::String>(false, "Ljava/lang/String;") {
    526     addOffset(OFFSETOF_MEMBER(mirror::String, count_), "count");
    527     addOffset(OFFSETOF_MEMBER(mirror::String, hash_code_), "hashCode");
    528   };
    529 };
    530 
    531 struct ThrowableOffsets : public CheckOffsets<mirror::Throwable> {
    532   ThrowableOffsets() : CheckOffsets<mirror::Throwable>(false, "Ljava/lang/Throwable;") {
    533     addOffset(OFFSETOF_MEMBER(mirror::Throwable, cause_), "cause");
    534     addOffset(OFFSETOF_MEMBER(mirror::Throwable, detail_message_), "detailMessage");
    535     addOffset(OFFSETOF_MEMBER(mirror::Throwable, stack_state_), "stackState");
    536     addOffset(OFFSETOF_MEMBER(mirror::Throwable, stack_trace_), "stackTrace");
    537     addOffset(OFFSETOF_MEMBER(mirror::Throwable, suppressed_exceptions_), "suppressedExceptions");
    538   };
    539 };
    540 
    541 struct StackTraceElementOffsets : public CheckOffsets<mirror::StackTraceElement> {
    542   StackTraceElementOffsets() : CheckOffsets<mirror::StackTraceElement>(
    543       false, "Ljava/lang/StackTraceElement;") {
    544     addOffset(OFFSETOF_MEMBER(mirror::StackTraceElement, declaring_class_), "declaringClass");
    545     addOffset(OFFSETOF_MEMBER(mirror::StackTraceElement, file_name_), "fileName");
    546     addOffset(OFFSETOF_MEMBER(mirror::StackTraceElement, line_number_), "lineNumber");
    547     addOffset(OFFSETOF_MEMBER(mirror::StackTraceElement, method_name_), "methodName");
    548   };
    549 };
    550 
    551 struct ClassLoaderOffsets : public CheckOffsets<mirror::ClassLoader> {
    552   ClassLoaderOffsets() : CheckOffsets<mirror::ClassLoader>(false, "Ljava/lang/ClassLoader;") {
    553     addOffset(OFFSETOF_MEMBER(mirror::ClassLoader, packages_), "packages");
    554     addOffset(OFFSETOF_MEMBER(mirror::ClassLoader, parent_), "parent");
    555     addOffset(OFFSETOF_MEMBER(mirror::ClassLoader, proxyCache_), "proxyCache");
    556   };
    557 };
    558 
    559 struct ProxyOffsets : public CheckOffsets<mirror::Proxy> {
    560   ProxyOffsets() : CheckOffsets<mirror::Proxy>(false, "Ljava/lang/reflect/Proxy;") {
    561     addOffset(OFFSETOF_MEMBER(mirror::Proxy, h_), "h");
    562   };
    563 };
    564 
    565 struct DexCacheOffsets : public CheckOffsets<mirror::DexCache> {
    566   DexCacheOffsets() : CheckOffsets<mirror::DexCache>(false, "Ljava/lang/DexCache;") {
    567     addOffset(OFFSETOF_MEMBER(mirror::DexCache, dex_), "dex");
    568     addOffset(OFFSETOF_MEMBER(mirror::DexCache, dex_file_), "dexFile");
    569     addOffset(OFFSETOF_MEMBER(mirror::DexCache, location_), "location");
    570     addOffset(OFFSETOF_MEMBER(mirror::DexCache, resolved_fields_), "resolvedFields");
    571     addOffset(OFFSETOF_MEMBER(mirror::DexCache, resolved_methods_), "resolvedMethods");
    572     addOffset(OFFSETOF_MEMBER(mirror::DexCache, resolved_types_), "resolvedTypes");
    573     addOffset(OFFSETOF_MEMBER(mirror::DexCache, strings_), "strings");
    574   };
    575 };
    576 
    577 struct ReferenceOffsets : public CheckOffsets<mirror::Reference> {
    578   ReferenceOffsets() : CheckOffsets<mirror::Reference>(false, "Ljava/lang/ref/Reference;") {
    579     addOffset(OFFSETOF_MEMBER(mirror::Reference, pending_next_), "pendingNext");
    580     addOffset(OFFSETOF_MEMBER(mirror::Reference, queue_), "queue");
    581     addOffset(OFFSETOF_MEMBER(mirror::Reference, queue_next_), "queueNext");
    582     addOffset(OFFSETOF_MEMBER(mirror::Reference, referent_), "referent");
    583   };
    584 };
    585 
    586 struct FinalizerReferenceOffsets : public CheckOffsets<mirror::FinalizerReference> {
    587   FinalizerReferenceOffsets() : CheckOffsets<mirror::FinalizerReference>(
    588       false, "Ljava/lang/ref/FinalizerReference;") {
    589     addOffset(OFFSETOF_MEMBER(mirror::FinalizerReference, next_), "next");
    590     addOffset(OFFSETOF_MEMBER(mirror::FinalizerReference, prev_), "prev");
    591     addOffset(OFFSETOF_MEMBER(mirror::FinalizerReference, zombie_), "zombie");
    592   };
    593 };
    594 
    595 struct AccessibleObjectOffsets : public CheckOffsets<mirror::AccessibleObject> {
    596   AccessibleObjectOffsets() : CheckOffsets<mirror::AccessibleObject>(
    597       false, "Ljava/lang/reflect/AccessibleObject;") {
    598     addOffset(mirror::AccessibleObject::FlagOffset().Uint32Value(), "flag");
    599   };
    600 };
    601 
    602 struct FieldOffsets : public CheckOffsets<mirror::Field> {
    603   FieldOffsets() : CheckOffsets<mirror::Field>(false, "Ljava/lang/reflect/Field;") {
    604     addOffset(OFFSETOF_MEMBER(mirror::Field, access_flags_), "accessFlags");
    605     addOffset(OFFSETOF_MEMBER(mirror::Field, declaring_class_), "declaringClass");
    606     addOffset(OFFSETOF_MEMBER(mirror::Field, dex_field_index_), "dexFieldIndex");
    607     addOffset(OFFSETOF_MEMBER(mirror::Field, offset_), "offset");
    608     addOffset(OFFSETOF_MEMBER(mirror::Field, type_), "type");
    609   };
    610 };
    611 
    612 struct AbstractMethodOffsets : public CheckOffsets<mirror::AbstractMethod> {
    613   AbstractMethodOffsets() : CheckOffsets<mirror::AbstractMethod>(
    614       false, "Ljava/lang/reflect/AbstractMethod;") {
    615     addOffset(OFFSETOF_MEMBER(mirror::AbstractMethod, access_flags_), "accessFlags");
    616     addOffset(OFFSETOF_MEMBER(mirror::AbstractMethod, art_method_), "artMethod");
    617     addOffset(OFFSETOF_MEMBER(mirror::AbstractMethod, declaring_class_), "declaringClass");
    618     addOffset(OFFSETOF_MEMBER(mirror::AbstractMethod, declaring_class_of_overridden_method_),
    619               "declaringClassOfOverriddenMethod");
    620     addOffset(OFFSETOF_MEMBER(mirror::AbstractMethod, dex_method_index_), "dexMethodIndex");
    621   };
    622 };
    623 
    624 // C++ fields must exactly match the fields in the Java classes. If this fails,
    625 // reorder the fields in the C++ class. Managed class fields are ordered by
    626 // ClassLinker::LinkFields.
    627 TEST_F(ClassLinkerTest, ValidateFieldOrderOfJavaCppUnionClasses) {
    628   ScopedObjectAccess soa(Thread::Current());
    629   EXPECT_TRUE(ObjectOffsets().Check());
    630   EXPECT_TRUE(ClassOffsets().Check());
    631   EXPECT_TRUE(StringOffsets().Check());
    632   EXPECT_TRUE(ThrowableOffsets().Check());
    633   EXPECT_TRUE(StackTraceElementOffsets().Check());
    634   EXPECT_TRUE(ClassLoaderOffsets().Check());
    635   EXPECT_TRUE(ProxyOffsets().Check());
    636   EXPECT_TRUE(DexCacheOffsets().Check());
    637   EXPECT_TRUE(ReferenceOffsets().Check());
    638   EXPECT_TRUE(FinalizerReferenceOffsets().Check());
    639   EXPECT_TRUE(AccessibleObjectOffsets().Check());
    640   EXPECT_TRUE(FieldOffsets().Check());
    641   EXPECT_TRUE(AbstractMethodOffsets().Check());
    642 }
    643 
    644 TEST_F(ClassLinkerTest, FindClassNonexistent) {
    645   ScopedObjectAccess soa(Thread::Current());
    646   AssertNonExistentClass("NoSuchClass;");
    647   AssertNonExistentClass("LNoSuchClass;");
    648 }
    649 
    650 TEST_F(ClassLinkerTest, GetDexFiles) {
    651   ScopedObjectAccess soa(Thread::Current());
    652 
    653   jobject jclass_loader = LoadDex("Nested");
    654   std::vector<const DexFile*> dex_files(GetDexFiles(jclass_loader));
    655   ASSERT_EQ(dex_files.size(), 1U);
    656   EXPECT_TRUE(EndsWith(dex_files[0]->GetLocation(), "Nested.jar"));
    657 
    658   jobject jclass_loader2 = LoadDex("MultiDex");
    659   std::vector<const DexFile*> dex_files2(GetDexFiles(jclass_loader2));
    660   ASSERT_EQ(dex_files2.size(), 2U);
    661   EXPECT_TRUE(EndsWith(dex_files2[0]->GetLocation(), "MultiDex.jar"));
    662 }
    663 
    664 TEST_F(ClassLinkerTest, FindClassNested) {
    665   ScopedObjectAccess soa(Thread::Current());
    666   StackHandleScope<1> hs(soa.Self());
    667   Handle<mirror::ClassLoader> class_loader(
    668       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(LoadDex("Nested"))));
    669 
    670   mirror::Class* outer = class_linker_->FindClass(soa.Self(), "LNested;", class_loader);
    671   ASSERT_TRUE(outer != nullptr);
    672   EXPECT_EQ(0U, outer->NumVirtualMethods());
    673   EXPECT_EQ(1U, outer->NumDirectMethods());
    674 
    675   mirror::Class* inner = class_linker_->FindClass(soa.Self(), "LNested$Inner;", class_loader);
    676   ASSERT_TRUE(inner != nullptr);
    677   EXPECT_EQ(0U, inner->NumVirtualMethods());
    678   EXPECT_EQ(1U, inner->NumDirectMethods());
    679 }
    680 
    681 TEST_F(ClassLinkerTest, FindClass_Primitives) {
    682   ScopedObjectAccess soa(Thread::Current());
    683   const std::string expected("BCDFIJSZV");
    684   for (int ch = 1; ch < 256; ++ch) {
    685     std::string descriptor;
    686     descriptor.push_back(ch);
    687     if (expected.find(ch) == std::string::npos) {
    688       AssertNonExistentClass(descriptor);
    689     } else {
    690       AssertPrimitiveClass(descriptor);
    691     }
    692   }
    693 }
    694 
    695 TEST_F(ClassLinkerTest, FindClass) {
    696   ScopedObjectAccess soa(Thread::Current());
    697   mirror::Class* JavaLangObject = class_linker_->FindSystemClass(soa.Self(), "Ljava/lang/Object;");
    698   ASSERT_TRUE(JavaLangObject != nullptr);
    699   ASSERT_TRUE(JavaLangObject->GetClass() != nullptr);
    700   ASSERT_EQ(JavaLangObject->GetClass(), JavaLangObject->GetClass()->GetClass());
    701   EXPECT_EQ(JavaLangObject, JavaLangObject->GetClass()->GetSuperClass());
    702   std::string temp;
    703   ASSERT_STREQ(JavaLangObject->GetDescriptor(&temp), "Ljava/lang/Object;");
    704   EXPECT_TRUE(JavaLangObject->GetSuperClass() == nullptr);
    705   EXPECT_FALSE(JavaLangObject->HasSuperClass());
    706   EXPECT_TRUE(JavaLangObject->GetClassLoader() == nullptr);
    707   EXPECT_EQ(mirror::Class::kStatusInitialized, JavaLangObject->GetStatus());
    708   EXPECT_FALSE(JavaLangObject->IsErroneous());
    709   EXPECT_TRUE(JavaLangObject->IsLoaded());
    710   EXPECT_TRUE(JavaLangObject->IsResolved());
    711   EXPECT_TRUE(JavaLangObject->IsVerified());
    712   EXPECT_TRUE(JavaLangObject->IsInitialized());
    713   EXPECT_FALSE(JavaLangObject->IsArrayInstance());
    714   EXPECT_FALSE(JavaLangObject->IsArrayClass());
    715   EXPECT_TRUE(JavaLangObject->GetComponentType() == nullptr);
    716   EXPECT_FALSE(JavaLangObject->IsInterface());
    717   EXPECT_TRUE(JavaLangObject->IsPublic());
    718   EXPECT_FALSE(JavaLangObject->IsFinal());
    719   EXPECT_FALSE(JavaLangObject->IsPrimitive());
    720   EXPECT_FALSE(JavaLangObject->IsSynthetic());
    721   EXPECT_EQ(2U, JavaLangObject->NumDirectMethods());
    722   EXPECT_EQ(11U, JavaLangObject->NumVirtualMethods());
    723   if (!kUseBrooksReadBarrier) {
    724     EXPECT_EQ(2U, JavaLangObject->NumInstanceFields());
    725   } else {
    726     EXPECT_EQ(4U, JavaLangObject->NumInstanceFields());
    727   }
    728   EXPECT_STREQ(JavaLangObject->GetInstanceField(0)->GetName(), "shadow$_klass_");
    729   EXPECT_STREQ(JavaLangObject->GetInstanceField(1)->GetName(), "shadow$_monitor_");
    730   if (kUseBrooksReadBarrier) {
    731     EXPECT_STREQ(JavaLangObject->GetInstanceField(2)->GetName(), "shadow$_x_rb_ptr_");
    732     EXPECT_STREQ(JavaLangObject->GetInstanceField(3)->GetName(), "shadow$_x_xpadding_");
    733   }
    734 
    735   EXPECT_EQ(0U, JavaLangObject->NumStaticFields());
    736   EXPECT_EQ(0U, JavaLangObject->NumDirectInterfaces());
    737 
    738   StackHandleScope<1> hs(soa.Self());
    739   Handle<mirror::ClassLoader> class_loader(
    740       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(LoadDex("MyClass"))));
    741   AssertNonExistentClass("LMyClass;");
    742   mirror::Class* MyClass = class_linker_->FindClass(soa.Self(), "LMyClass;", class_loader);
    743   ASSERT_TRUE(MyClass != nullptr);
    744   ASSERT_TRUE(MyClass->GetClass() != nullptr);
    745   ASSERT_EQ(MyClass->GetClass(), MyClass->GetClass()->GetClass());
    746   EXPECT_EQ(JavaLangObject, MyClass->GetClass()->GetSuperClass());
    747   ASSERT_STREQ(MyClass->GetDescriptor(&temp), "LMyClass;");
    748   EXPECT_TRUE(MyClass->GetSuperClass() == JavaLangObject);
    749   EXPECT_TRUE(MyClass->HasSuperClass());
    750   EXPECT_EQ(class_loader.Get(), MyClass->GetClassLoader());
    751   EXPECT_EQ(mirror::Class::kStatusResolved, MyClass->GetStatus());
    752   EXPECT_FALSE(MyClass->IsErroneous());
    753   EXPECT_TRUE(MyClass->IsLoaded());
    754   EXPECT_TRUE(MyClass->IsResolved());
    755   EXPECT_FALSE(MyClass->IsVerified());
    756   EXPECT_FALSE(MyClass->IsInitialized());
    757   EXPECT_FALSE(MyClass->IsArrayInstance());
    758   EXPECT_FALSE(MyClass->IsArrayClass());
    759   EXPECT_TRUE(MyClass->GetComponentType() == nullptr);
    760   EXPECT_FALSE(MyClass->IsInterface());
    761   EXPECT_FALSE(MyClass->IsPublic());
    762   EXPECT_FALSE(MyClass->IsFinal());
    763   EXPECT_FALSE(MyClass->IsPrimitive());
    764   EXPECT_FALSE(MyClass->IsSynthetic());
    765   EXPECT_EQ(1U, MyClass->NumDirectMethods());
    766   EXPECT_EQ(0U, MyClass->NumVirtualMethods());
    767   EXPECT_EQ(0U, MyClass->NumInstanceFields());
    768   EXPECT_EQ(0U, MyClass->NumStaticFields());
    769   EXPECT_EQ(0U, MyClass->NumDirectInterfaces());
    770 
    771   EXPECT_EQ(JavaLangObject->GetClass()->GetClass(), MyClass->GetClass()->GetClass());
    772 
    773   // created by class_linker
    774   AssertArrayClass("[C", "C", nullptr);
    775   AssertArrayClass("[Ljava/lang/Object;", "Ljava/lang/Object;", nullptr);
    776   // synthesized on the fly
    777   AssertArrayClass("[[C", "[C", nullptr);
    778   AssertArrayClass("[[[LMyClass;", "[[LMyClass;", class_loader.Get());
    779   // or not available at all
    780   AssertNonExistentClass("[[[[LNonExistentClass;");
    781 }
    782 
    783 TEST_F(ClassLinkerTest, LibCore) {
    784   ScopedObjectAccess soa(Thread::Current());
    785   ASSERT_TRUE(java_lang_dex_file_ != nullptr);
    786   AssertDexFile(*java_lang_dex_file_, nullptr);
    787 }
    788 
    789 // The first reference array element must be a multiple of 4 bytes from the
    790 // start of the object
    791 TEST_F(ClassLinkerTest, ValidateObjectArrayElementsOffset) {
    792   ScopedObjectAccess soa(Thread::Current());
    793   mirror::Class* array_class = class_linker_->FindSystemClass(soa.Self(), "[Ljava/lang/String;");
    794   mirror::ObjectArray<mirror::String>* array =
    795       mirror::ObjectArray<mirror::String>::Alloc(soa.Self(), array_class, 0);
    796   uintptr_t data_offset =
    797       reinterpret_cast<uintptr_t>(array->GetRawData(sizeof(mirror::HeapReference<mirror::String>),
    798                                                     0));
    799   if (sizeof(mirror::HeapReference<mirror::String>) == sizeof(int32_t)) {
    800     EXPECT_TRUE(IsAligned<4>(data_offset));  // Check 4 byte alignment.
    801   } else {
    802     EXPECT_TRUE(IsAligned<8>(data_offset));  // Check 8 byte alignment.
    803   }
    804 }
    805 
    806 TEST_F(ClassLinkerTest, ValidatePrimitiveArrayElementsOffset) {
    807   ScopedObjectAccess soa(Thread::Current());
    808   StackHandleScope<5> hs(soa.Self());
    809   Handle<mirror::LongArray> long_array(hs.NewHandle(mirror::LongArray::Alloc(soa.Self(), 0)));
    810   EXPECT_EQ(class_linker_->FindSystemClass(soa.Self(), "[J"), long_array->GetClass());
    811   uintptr_t data_offset = reinterpret_cast<uintptr_t>(long_array->GetData());
    812   EXPECT_TRUE(IsAligned<8>(data_offset));  // Longs require 8 byte alignment
    813 
    814   Handle<mirror::DoubleArray> double_array(hs.NewHandle(mirror::DoubleArray::Alloc(soa.Self(), 0)));
    815   EXPECT_EQ(class_linker_->FindSystemClass(soa.Self(), "[D"), double_array->GetClass());
    816   data_offset = reinterpret_cast<uintptr_t>(double_array->GetData());
    817   EXPECT_TRUE(IsAligned<8>(data_offset));  // Doubles require 8 byte alignment
    818 
    819   Handle<mirror::IntArray> int_array(hs.NewHandle(mirror::IntArray::Alloc(soa.Self(), 0)));
    820   EXPECT_EQ(class_linker_->FindSystemClass(soa.Self(), "[I"), int_array->GetClass());
    821   data_offset = reinterpret_cast<uintptr_t>(int_array->GetData());
    822   EXPECT_TRUE(IsAligned<4>(data_offset));  // Ints require 4 byte alignment
    823 
    824   Handle<mirror::CharArray> char_array(hs.NewHandle(mirror::CharArray::Alloc(soa.Self(), 0)));
    825   EXPECT_EQ(class_linker_->FindSystemClass(soa.Self(), "[C"), char_array->GetClass());
    826   data_offset = reinterpret_cast<uintptr_t>(char_array->GetData());
    827   EXPECT_TRUE(IsAligned<2>(data_offset));  // Chars require 2 byte alignment
    828 
    829   Handle<mirror::ShortArray> short_array(hs.NewHandle(mirror::ShortArray::Alloc(soa.Self(), 0)));
    830   EXPECT_EQ(class_linker_->FindSystemClass(soa.Self(), "[S"), short_array->GetClass());
    831   data_offset = reinterpret_cast<uintptr_t>(short_array->GetData());
    832   EXPECT_TRUE(IsAligned<2>(data_offset));  // Shorts require 2 byte alignment
    833 
    834   // Take it as given that bytes and booleans have byte alignment
    835 }
    836 
    837 TEST_F(ClassLinkerTest, ValidateBoxedTypes) {
    838   // Validate that the "value" field is always the 0th field in each of java.lang's box classes.
    839   // This lets UnboxPrimitive avoid searching for the field by name at runtime.
    840   ScopedObjectAccess soa(Thread::Current());
    841   NullHandle<mirror::ClassLoader> class_loader;
    842   mirror::Class* c;
    843   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Boolean;", class_loader);
    844   EXPECT_STREQ("value", c->GetIFields()[0].GetName());
    845   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Byte;", class_loader);
    846   EXPECT_STREQ("value", c->GetIFields()[0].GetName());
    847   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Character;", class_loader);
    848   EXPECT_STREQ("value", c->GetIFields()[0].GetName());
    849   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Double;", class_loader);
    850   EXPECT_STREQ("value", c->GetIFields()[0].GetName());
    851   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Float;", class_loader);
    852   EXPECT_STREQ("value", c->GetIFields()[0].GetName());
    853   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Integer;", class_loader);
    854   EXPECT_STREQ("value", c->GetIFields()[0].GetName());
    855   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Long;", class_loader);
    856   EXPECT_STREQ("value", c->GetIFields()[0].GetName());
    857   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Short;", class_loader);
    858   EXPECT_STREQ("value", c->GetIFields()[0].GetName());
    859 }
    860 
    861 TEST_F(ClassLinkerTest, TwoClassLoadersOneClass) {
    862   ScopedObjectAccess soa(Thread::Current());
    863   StackHandleScope<2> hs(soa.Self());
    864   Handle<mirror::ClassLoader> class_loader_1(
    865       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(LoadDex("MyClass"))));
    866   Handle<mirror::ClassLoader> class_loader_2(
    867       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(LoadDex("MyClass"))));
    868   mirror::Class* MyClass_1 = class_linker_->FindClass(soa.Self(), "LMyClass;", class_loader_1);
    869   mirror::Class* MyClass_2 = class_linker_->FindClass(soa.Self(), "LMyClass;", class_loader_2);
    870   EXPECT_TRUE(MyClass_1 != nullptr);
    871   EXPECT_TRUE(MyClass_2 != nullptr);
    872   EXPECT_NE(MyClass_1, MyClass_2);
    873 }
    874 
    875 TEST_F(ClassLinkerTest, StaticFields) {
    876   ScopedObjectAccess soa(Thread::Current());
    877   StackHandleScope<2> hs(soa.Self());
    878   Handle<mirror::ClassLoader> class_loader(
    879       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(LoadDex("Statics"))));
    880   Handle<mirror::Class> statics(
    881       hs.NewHandle(class_linker_->FindClass(soa.Self(), "LStatics;", class_loader)));
    882   class_linker_->EnsureInitialized(soa.Self(), statics, true, true);
    883 
    884   // Static final primitives that are initialized by a compile-time constant
    885   // expression resolve to a copy of a constant value from the constant pool.
    886   // So <clinit> should be null.
    887   ArtMethod* clinit = statics->FindDirectMethod("<clinit>", "()V", sizeof(void*));
    888   EXPECT_TRUE(clinit == nullptr);
    889 
    890   EXPECT_EQ(9U, statics->NumStaticFields());
    891 
    892   ArtField* s0 = mirror::Class::FindStaticField(soa.Self(), statics, "s0", "Z");
    893   EXPECT_EQ(s0->GetTypeAsPrimitiveType(), Primitive::kPrimBoolean);
    894   EXPECT_EQ(true, s0->GetBoolean(statics.Get()));
    895   s0->SetBoolean<false>(statics.Get(), false);
    896 
    897   ArtField* s1 = mirror::Class::FindStaticField(soa.Self(), statics, "s1", "B");
    898   EXPECT_EQ(s1->GetTypeAsPrimitiveType(), Primitive::kPrimByte);
    899   EXPECT_EQ(5, s1->GetByte(statics.Get()));
    900   s1->SetByte<false>(statics.Get(), 6);
    901 
    902   ArtField* s2 = mirror::Class::FindStaticField(soa.Self(), statics, "s2", "C");
    903   EXPECT_EQ(s2->GetTypeAsPrimitiveType(), Primitive::kPrimChar);
    904   EXPECT_EQ('a', s2->GetChar(statics.Get()));
    905   s2->SetChar<false>(statics.Get(), 'b');
    906 
    907   ArtField* s3 = mirror::Class::FindStaticField(soa.Self(), statics, "s3", "S");
    908   EXPECT_EQ(s3->GetTypeAsPrimitiveType(), Primitive::kPrimShort);
    909   EXPECT_EQ(-536, s3->GetShort(statics.Get()));
    910   s3->SetShort<false>(statics.Get(), -535);
    911 
    912   ArtField* s4 = mirror::Class::FindStaticField(soa.Self(), statics, "s4", "I");
    913   EXPECT_EQ(s4->GetTypeAsPrimitiveType(), Primitive::kPrimInt);
    914   EXPECT_EQ(2000000000, s4->GetInt(statics.Get()));
    915   s4->SetInt<false>(statics.Get(), 2000000001);
    916 
    917   ArtField* s5 = mirror::Class::FindStaticField(soa.Self(), statics, "s5", "J");
    918   EXPECT_EQ(s5->GetTypeAsPrimitiveType(), Primitive::kPrimLong);
    919   EXPECT_EQ(0x1234567890abcdefLL, s5->GetLong(statics.Get()));
    920   s5->SetLong<false>(statics.Get(), INT64_C(0x34567890abcdef12));
    921 
    922   ArtField* s6 = mirror::Class::FindStaticField(soa.Self(), statics, "s6", "F");
    923   EXPECT_EQ(s6->GetTypeAsPrimitiveType(), Primitive::kPrimFloat);
    924   EXPECT_DOUBLE_EQ(0.5, s6->GetFloat(statics.Get()));
    925   s6->SetFloat<false>(statics.Get(), 0.75);
    926 
    927   ArtField* s7 = mirror::Class::FindStaticField(soa.Self(), statics, "s7", "D");
    928   EXPECT_EQ(s7->GetTypeAsPrimitiveType(), Primitive::kPrimDouble);
    929   EXPECT_DOUBLE_EQ(16777217.0, s7->GetDouble(statics.Get()));
    930   s7->SetDouble<false>(statics.Get(), 16777219);
    931 
    932   ArtField* s8 = mirror::Class::FindStaticField(soa.Self(), statics, "s8",
    933                                                         "Ljava/lang/String;");
    934   EXPECT_EQ(s8->GetTypeAsPrimitiveType(), Primitive::kPrimNot);
    935   EXPECT_TRUE(s8->GetObject(statics.Get())->AsString()->Equals("android"));
    936   s8->SetObject<false>(s8->GetDeclaringClass(),
    937                        mirror::String::AllocFromModifiedUtf8(soa.Self(), "robot"));
    938 
    939   // TODO: Remove EXPECT_FALSE when GCC can handle EXPECT_EQ
    940   // http://code.google.com/p/googletest/issues/detail?id=322
    941   EXPECT_FALSE(s0->GetBoolean(statics.Get()));
    942   EXPECT_EQ(6, s1->GetByte(statics.Get()));
    943   EXPECT_EQ('b', s2->GetChar(statics.Get()));
    944   EXPECT_EQ(-535, s3->GetShort(statics.Get()));
    945   EXPECT_EQ(2000000001, s4->GetInt(statics.Get()));
    946   EXPECT_EQ(INT64_C(0x34567890abcdef12), s5->GetLong(statics.Get()));
    947   EXPECT_FLOAT_EQ(0.75, s6->GetFloat(statics.Get()));
    948   EXPECT_DOUBLE_EQ(16777219.0, s7->GetDouble(statics.Get()));
    949   EXPECT_TRUE(s8->GetObject(statics.Get())->AsString()->Equals("robot"));
    950 }
    951 
    952 TEST_F(ClassLinkerTest, Interfaces) {
    953   ScopedObjectAccess soa(Thread::Current());
    954   StackHandleScope<6> hs(soa.Self());
    955   Handle<mirror::ClassLoader> class_loader(
    956       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(LoadDex("Interfaces"))));
    957   Handle<mirror::Class> I(
    958       hs.NewHandle(class_linker_->FindClass(soa.Self(), "LInterfaces$I;", class_loader)));
    959   Handle<mirror::Class> J(
    960       hs.NewHandle(class_linker_->FindClass(soa.Self(), "LInterfaces$J;", class_loader)));
    961   Handle<mirror::Class> K(
    962       hs.NewHandle(class_linker_->FindClass(soa.Self(), "LInterfaces$K;", class_loader)));
    963   Handle<mirror::Class> A(
    964       hs.NewHandle(class_linker_->FindClass(soa.Self(), "LInterfaces$A;", class_loader)));
    965   Handle<mirror::Class> B(
    966       hs.NewHandle(class_linker_->FindClass(soa.Self(), "LInterfaces$B;", class_loader)));
    967   EXPECT_TRUE(I->IsAssignableFrom(A.Get()));
    968   EXPECT_TRUE(J->IsAssignableFrom(A.Get()));
    969   EXPECT_TRUE(J->IsAssignableFrom(K.Get()));
    970   EXPECT_TRUE(K->IsAssignableFrom(B.Get()));
    971   EXPECT_TRUE(J->IsAssignableFrom(B.Get()));
    972 
    973   const Signature void_sig = I->GetDexCache()->GetDexFile()->CreateSignature("()V");
    974   ArtMethod* Ii = I->FindVirtualMethod("i", void_sig, sizeof(void*));
    975   ArtMethod* Jj1 = J->FindVirtualMethod("j1", void_sig, sizeof(void*));
    976   ArtMethod* Jj2 = J->FindVirtualMethod("j2", void_sig, sizeof(void*));
    977   ArtMethod* Kj1 = K->FindInterfaceMethod("j1", void_sig, sizeof(void*));
    978   ArtMethod* Kj2 = K->FindInterfaceMethod("j2", void_sig, sizeof(void*));
    979   ArtMethod* Kk = K->FindInterfaceMethod("k", void_sig, sizeof(void*));
    980   ArtMethod* Ai = A->FindVirtualMethod("i", void_sig, sizeof(void*));
    981   ArtMethod* Aj1 = A->FindVirtualMethod("j1", void_sig, sizeof(void*));
    982   ArtMethod* Aj2 = A->FindVirtualMethod("j2", void_sig, sizeof(void*));
    983   ASSERT_TRUE(Ii != nullptr);
    984   ASSERT_TRUE(Jj1 != nullptr);
    985   ASSERT_TRUE(Jj2 != nullptr);
    986   ASSERT_TRUE(Kj1 != nullptr);
    987   ASSERT_TRUE(Kj2 != nullptr);
    988   ASSERT_TRUE(Kk != nullptr);
    989   ASSERT_TRUE(Ai != nullptr);
    990   ASSERT_TRUE(Aj1 != nullptr);
    991   ASSERT_TRUE(Aj2 != nullptr);
    992   EXPECT_NE(Ii, Ai);
    993   EXPECT_NE(Jj1, Aj1);
    994   EXPECT_NE(Jj2, Aj2);
    995   EXPECT_EQ(Kj1, Jj1);
    996   EXPECT_EQ(Kj2, Jj2);
    997   EXPECT_EQ(Ai, A->FindVirtualMethodForInterface(Ii, sizeof(void*)));
    998   EXPECT_EQ(Aj1, A->FindVirtualMethodForInterface(Jj1, sizeof(void*)));
    999   EXPECT_EQ(Aj2, A->FindVirtualMethodForInterface(Jj2, sizeof(void*)));
   1000   EXPECT_EQ(Ai, A->FindVirtualMethodForVirtualOrInterface(Ii, sizeof(void*)));
   1001   EXPECT_EQ(Aj1, A->FindVirtualMethodForVirtualOrInterface(Jj1, sizeof(void*)));
   1002   EXPECT_EQ(Aj2, A->FindVirtualMethodForVirtualOrInterface(Jj2, sizeof(void*)));
   1003 
   1004   ArtField* Afoo = mirror::Class::FindStaticField(soa.Self(), A, "foo", "Ljava/lang/String;");
   1005   ArtField* Bfoo = mirror::Class::FindStaticField(soa.Self(), B, "foo", "Ljava/lang/String;");
   1006   ArtField* Jfoo = mirror::Class::FindStaticField(soa.Self(), J, "foo", "Ljava/lang/String;");
   1007   ArtField* Kfoo = mirror::Class::FindStaticField(soa.Self(), K, "foo", "Ljava/lang/String;");
   1008   ASSERT_TRUE(Afoo != nullptr);
   1009   EXPECT_EQ(Afoo, Bfoo);
   1010   EXPECT_EQ(Afoo, Jfoo);
   1011   EXPECT_EQ(Afoo, Kfoo);
   1012 }
   1013 
   1014 TEST_F(ClassLinkerTest, ResolveVerifyAndClinit) {
   1015   // pretend we are trying to get the static storage for the StaticsFromCode class.
   1016 
   1017   // case 1, get the uninitialized storage from StaticsFromCode.<clinit>
   1018   // case 2, get the initialized storage from StaticsFromCode.getS0
   1019 
   1020   ScopedObjectAccess soa(Thread::Current());
   1021   jobject jclass_loader = LoadDex("StaticsFromCode");
   1022   const DexFile* dex_file = GetFirstDexFile(jclass_loader);
   1023   StackHandleScope<1> hs(soa.Self());
   1024   Handle<mirror::ClassLoader> class_loader(
   1025       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
   1026   mirror::Class* klass = class_linker_->FindClass(soa.Self(), "LStaticsFromCode;", class_loader);
   1027   ArtMethod* clinit = klass->FindClassInitializer(sizeof(void*));
   1028   ArtMethod* getS0 = klass->FindDirectMethod("getS0", "()Ljava/lang/Object;", sizeof(void*));
   1029   const DexFile::StringId* string_id = dex_file->FindStringId("LStaticsFromCode;");
   1030   ASSERT_TRUE(string_id != nullptr);
   1031   const DexFile::TypeId* type_id = dex_file->FindTypeId(dex_file->GetIndexForStringId(*string_id));
   1032   ASSERT_TRUE(type_id != nullptr);
   1033   uint32_t type_idx = dex_file->GetIndexForTypeId(*type_id);
   1034   mirror::Class* uninit = ResolveVerifyAndClinit(type_idx, clinit, soa.Self(), true, false);
   1035   EXPECT_TRUE(uninit != nullptr);
   1036   EXPECT_FALSE(uninit->IsInitialized());
   1037   mirror::Class* init = ResolveVerifyAndClinit(type_idx, getS0, soa.Self(), true, false);
   1038   EXPECT_TRUE(init != nullptr);
   1039   EXPECT_TRUE(init->IsInitialized());
   1040 }
   1041 
   1042 TEST_F(ClassLinkerTest, FinalizableBit) {
   1043   ScopedObjectAccess soa(Thread::Current());
   1044   mirror::Class* c;
   1045 
   1046   // Object has a finalize method, but we know it's empty.
   1047   c = class_linker_->FindSystemClass(soa.Self(), "Ljava/lang/Object;");
   1048   EXPECT_FALSE(c->IsFinalizable());
   1049 
   1050   // Enum has a finalize method to prevent its subclasses from implementing one.
   1051   c = class_linker_->FindSystemClass(soa.Self(), "Ljava/lang/Enum;");
   1052   EXPECT_FALSE(c->IsFinalizable());
   1053 
   1054   // RoundingMode is an enum.
   1055   c = class_linker_->FindSystemClass(soa.Self(), "Ljava/math/RoundingMode;");
   1056   EXPECT_FALSE(c->IsFinalizable());
   1057 
   1058   // RandomAccessFile extends Object and overrides finalize.
   1059   c = class_linker_->FindSystemClass(soa.Self(), "Ljava/io/RandomAccessFile;");
   1060   EXPECT_TRUE(c->IsFinalizable());
   1061 
   1062   // FileInputStream is finalizable and extends InputStream which isn't.
   1063   c = class_linker_->FindSystemClass(soa.Self(), "Ljava/io/InputStream;");
   1064   EXPECT_FALSE(c->IsFinalizable());
   1065   c = class_linker_->FindSystemClass(soa.Self(), "Ljava/io/FileInputStream;");
   1066   EXPECT_TRUE(c->IsFinalizable());
   1067 
   1068   // ScheduledThreadPoolExecutor doesn't have a finalize method but
   1069   // extends ThreadPoolExecutor which does.
   1070   c = class_linker_->FindSystemClass(soa.Self(), "Ljava/util/concurrent/ThreadPoolExecutor;");
   1071   EXPECT_TRUE(c->IsFinalizable());
   1072   c = class_linker_->FindSystemClass(soa.Self(), "Ljava/util/concurrent/ScheduledThreadPoolExecutor;");
   1073   EXPECT_TRUE(c->IsFinalizable());
   1074 }
   1075 
   1076 TEST_F(ClassLinkerTest, ClassRootDescriptors) {
   1077   ScopedObjectAccess soa(Thread::Current());
   1078   std::string temp;
   1079   for (int i = 0; i < ClassLinker::kClassRootsMax; i++) {
   1080     mirror::Class* klass = class_linker_->GetClassRoot(ClassLinker::ClassRoot(i));
   1081     EXPECT_GT(strlen(klass->GetDescriptor(&temp)), 0U);
   1082     EXPECT_STREQ(klass->GetDescriptor(&temp),
   1083                  class_linker_->GetClassRootDescriptor(ClassLinker::ClassRoot(i))) << " i = " << i;
   1084   }
   1085 }
   1086 
   1087 TEST_F(ClassLinkerTest, ValidatePredefinedClassSizes) {
   1088   ScopedObjectAccess soa(Thread::Current());
   1089   NullHandle<mirror::ClassLoader> class_loader;
   1090   mirror::Class* c;
   1091 
   1092   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Class;", class_loader);
   1093   ASSERT_TRUE(c != nullptr);
   1094   EXPECT_EQ(c->GetClassSize(), mirror::Class::ClassClassSize(sizeof(void*)));
   1095 
   1096   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Object;", class_loader);
   1097   ASSERT_TRUE(c != nullptr);
   1098   EXPECT_EQ(c->GetClassSize(), mirror::Object::ClassSize(sizeof(void*)));
   1099 
   1100   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/String;", class_loader);
   1101   ASSERT_TRUE(c != nullptr);
   1102   EXPECT_EQ(c->GetClassSize(), mirror::String::ClassSize(sizeof(void*)));
   1103 
   1104   c = class_linker_->FindClass(soa.Self(), "Ljava/lang/DexCache;", class_loader);
   1105   ASSERT_TRUE(c != nullptr);
   1106   EXPECT_EQ(c->GetClassSize(), mirror::DexCache::ClassSize(sizeof(void*)));
   1107 }
   1108 
   1109 static void CheckMethod(ArtMethod* method, bool verified)
   1110     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   1111   if (!method->IsNative() && !method->IsAbstract()) {
   1112     EXPECT_EQ((method->GetAccessFlags() & kAccPreverified) != 0U, verified)
   1113         << PrettyMethod(method, true);
   1114   }
   1115 }
   1116 
   1117 static void CheckPreverified(mirror::Class* c, bool preverified)
   1118     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   1119   EXPECT_EQ((c->GetAccessFlags() & kAccPreverified) != 0U, preverified)
   1120       << "Class " << PrettyClass(c) << " not as expected";
   1121   for (auto& m : c->GetDirectMethods(sizeof(void*))) {
   1122     CheckMethod(&m, preverified);
   1123   }
   1124   for (auto& m : c->GetVirtualMethods(sizeof(void*))) {
   1125     CheckMethod(&m, preverified);
   1126   }
   1127 }
   1128 
   1129 TEST_F(ClassLinkerTest, Preverified_InitializedBoot) {
   1130   ScopedObjectAccess soa(Thread::Current());
   1131 
   1132   mirror::Class* JavaLangObject = class_linker_->FindSystemClass(soa.Self(), "Ljava/lang/Object;");
   1133   ASSERT_TRUE(JavaLangObject != nullptr);
   1134   EXPECT_TRUE(JavaLangObject->IsInitialized()) << "Not testing already initialized class from the "
   1135                                                   "core";
   1136   CheckPreverified(JavaLangObject, true);
   1137 }
   1138 
   1139 TEST_F(ClassLinkerTest, Preverified_UninitializedBoot) {
   1140   ScopedObjectAccess soa(Thread::Current());
   1141 
   1142   StackHandleScope<1> hs(soa.Self());
   1143 
   1144   Handle<mirror::Class> security_manager(hs.NewHandle(class_linker_->FindSystemClass(
   1145       soa.Self(), "Ljava/lang/SecurityManager;")));
   1146   EXPECT_FALSE(security_manager->IsInitialized()) << "Not testing uninitialized class from the "
   1147                                                      "core";
   1148 
   1149   CheckPreverified(security_manager.Get(), false);
   1150 
   1151   class_linker_->EnsureInitialized(soa.Self(), security_manager, true, true);
   1152   CheckPreverified(security_manager.Get(), true);
   1153 }
   1154 
   1155 TEST_F(ClassLinkerTest, Preverified_App) {
   1156   ScopedObjectAccess soa(Thread::Current());
   1157 
   1158   StackHandleScope<2> hs(soa.Self());
   1159   Handle<mirror::ClassLoader> class_loader(
   1160       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(LoadDex("Statics"))));
   1161   Handle<mirror::Class> statics(
   1162       hs.NewHandle(class_linker_->FindClass(soa.Self(), "LStatics;", class_loader)));
   1163 
   1164   CheckPreverified(statics.Get(), false);
   1165 
   1166   class_linker_->EnsureInitialized(soa.Self(), statics, true, true);
   1167   CheckPreverified(statics.Get(), true);
   1168 }
   1169 
   1170 TEST_F(ClassLinkerTest, IsBootStrapClassLoaded) {
   1171   ScopedObjectAccess soa(Thread::Current());
   1172 
   1173   StackHandleScope<3> hs(soa.Self());
   1174   Handle<mirror::ClassLoader> class_loader(
   1175       hs.NewHandle(soa.Decode<mirror::ClassLoader*>(LoadDex("Statics"))));
   1176 
   1177   // java.lang.Object is a bootstrap class.
   1178   Handle<mirror::Class> jlo_class(
   1179       hs.NewHandle(class_linker_->FindSystemClass(soa.Self(), "Ljava/lang/Object;")));
   1180   ASSERT_TRUE(jlo_class.Get() != nullptr);
   1181   EXPECT_TRUE(jlo_class.Get()->IsBootStrapClassLoaded());
   1182 
   1183   // Statics is not a bootstrap class.
   1184   Handle<mirror::Class> statics(
   1185       hs.NewHandle(class_linker_->FindClass(soa.Self(), "LStatics;", class_loader)));
   1186   ASSERT_TRUE(statics.Get() != nullptr);
   1187   EXPECT_FALSE(statics.Get()->IsBootStrapClassLoaded());
   1188 }
   1189 
   1190 }  // namespace art
   1191