class.cc revision cb086955c2a21270cd2f53a8bce71e577d776506
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.h"
18
19#include "art_field-inl.h"
20#include "art_method-inl.h"
21#include "class_linker-inl.h"
22#include "class_loader.h"
23#include "class-inl.h"
24#include "dex_cache.h"
25#include "dex_file-inl.h"
26#include "gc/accounting/card_table-inl.h"
27#include "handle_scope-inl.h"
28#include "method.h"
29#include "object_array-inl.h"
30#include "object-inl.h"
31#include "runtime.h"
32#include "thread.h"
33#include "throwable.h"
34#include "utils.h"
35#include "well_known_classes.h"
36
37namespace art {
38namespace mirror {
39
40GcRoot<Class> Class::java_lang_Class_;
41
42void Class::SetClassClass(Class* java_lang_Class) {
43  CHECK(java_lang_Class_.IsNull())
44      << java_lang_Class_.Read()
45      << " " << java_lang_Class;
46  CHECK(java_lang_Class != nullptr);
47  java_lang_Class->SetClassFlags(mirror::kClassFlagClass);
48  java_lang_Class_ = GcRoot<Class>(java_lang_Class);
49}
50
51void Class::ResetClass() {
52  CHECK(!java_lang_Class_.IsNull());
53  java_lang_Class_ = GcRoot<Class>(nullptr);
54}
55
56void Class::VisitRoots(RootVisitor* visitor) {
57  java_lang_Class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass));
58}
59
60inline void Class::SetVerifyError(mirror::Object* error) {
61  CHECK(error != nullptr) << PrettyClass(this);
62  if (Runtime::Current()->IsActiveTransaction()) {
63    SetFieldObject<true>(OFFSET_OF_OBJECT_MEMBER(Class, verify_error_), error);
64  } else {
65    SetFieldObject<false>(OFFSET_OF_OBJECT_MEMBER(Class, verify_error_), error);
66  }
67}
68
69void Class::SetStatus(Handle<Class> h_this, Status new_status, Thread* self) {
70  Status old_status = h_this->GetStatus();
71  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
72  bool class_linker_initialized = class_linker != nullptr && class_linker->IsInitialized();
73  if (LIKELY(class_linker_initialized)) {
74    if (UNLIKELY(new_status <= old_status && new_status != kStatusError &&
75                 new_status != kStatusRetired)) {
76      LOG(FATAL) << "Unexpected change back of class status for " << PrettyClass(h_this.Get())
77                 << " " << old_status << " -> " << new_status;
78    }
79    if (new_status >= kStatusResolved || old_status >= kStatusResolved) {
80      // When classes are being resolved the resolution code should hold the lock.
81      CHECK_EQ(h_this->GetLockOwnerThreadId(), self->GetThreadId())
82            << "Attempt to change status of class while not holding its lock: "
83            << PrettyClass(h_this.Get()) << " " << old_status << " -> " << new_status;
84    }
85  }
86  if (UNLIKELY(new_status == kStatusError)) {
87    CHECK_NE(h_this->GetStatus(), kStatusError)
88        << "Attempt to set as erroneous an already erroneous class "
89        << PrettyClass(h_this.Get());
90    if (VLOG_IS_ON(class_linker)) {
91      LOG(ERROR) << "Setting " << PrettyDescriptor(h_this.Get()) << " to erroneous.";
92      if (self->IsExceptionPending()) {
93        LOG(ERROR) << "Exception: " << self->GetException()->Dump();
94      }
95    }
96
97    // Remember the current exception.
98    CHECK(self->GetException() != nullptr);
99    h_this->SetVerifyError(self->GetException());
100  }
101  static_assert(sizeof(Status) == sizeof(uint32_t), "Size of status not equal to uint32");
102  if (Runtime::Current()->IsActiveTransaction()) {
103    h_this->SetField32Volatile<true>(OFFSET_OF_OBJECT_MEMBER(Class, status_), new_status);
104  } else {
105    h_this->SetField32Volatile<false>(OFFSET_OF_OBJECT_MEMBER(Class, status_), new_status);
106  }
107
108  if (!class_linker_initialized) {
109    // When the class linker is being initialized its single threaded and by definition there can be
110    // no waiters. During initialization classes may appear temporary but won't be retired as their
111    // size was statically computed.
112  } else {
113    // Classes that are being resolved or initialized need to notify waiters that the class status
114    // changed. See ClassLinker::EnsureResolved and ClassLinker::WaitForInitializeClass.
115    if (h_this->IsTemp()) {
116      // Class is a temporary one, ensure that waiters for resolution get notified of retirement
117      // so that they can grab the new version of the class from the class linker's table.
118      CHECK_LT(new_status, kStatusResolved) << PrettyDescriptor(h_this.Get());
119      if (new_status == kStatusRetired || new_status == kStatusError) {
120        h_this->NotifyAll(self);
121      }
122    } else {
123      CHECK_NE(new_status, kStatusRetired);
124      if (old_status >= kStatusResolved || new_status >= kStatusResolved) {
125        h_this->NotifyAll(self);
126      }
127    }
128  }
129}
130
131void Class::SetDexCache(DexCache* new_dex_cache) {
132  SetFieldObject<false>(OFFSET_OF_OBJECT_MEMBER(Class, dex_cache_), new_dex_cache);
133  SetDexCacheStrings(new_dex_cache != nullptr ? new_dex_cache->GetStrings() : nullptr);
134}
135
136void Class::SetClassSize(uint32_t new_class_size) {
137  if (kIsDebugBuild && new_class_size < GetClassSize()) {
138    DumpClass(LOG(INTERNAL_FATAL), kDumpClassFullDetail);
139    LOG(INTERNAL_FATAL) << new_class_size << " vs " << GetClassSize();
140    LOG(FATAL) << " class=" << PrettyTypeOf(this);
141  }
142  // Not called within a transaction.
143  SetField32<false>(OFFSET_OF_OBJECT_MEMBER(Class, class_size_), new_class_size);
144}
145
146// Return the class' name. The exact format is bizarre, but it's the specified behavior for
147// Class.getName: keywords for primitive types, regular "[I" form for primitive arrays (so "int"
148// but "[I"), and arrays of reference types written between "L" and ";" but with dots rather than
149// slashes (so "java.lang.String" but "[Ljava.lang.String;"). Madness.
150String* Class::ComputeName(Handle<Class> h_this) {
151  String* name = h_this->GetName();
152  if (name != nullptr) {
153    return name;
154  }
155  std::string temp;
156  const char* descriptor = h_this->GetDescriptor(&temp);
157  Thread* self = Thread::Current();
158  if ((descriptor[0] != 'L') && (descriptor[0] != '[')) {
159    // The descriptor indicates that this is the class for
160    // a primitive type; special-case the return value.
161    const char* c_name = nullptr;
162    switch (descriptor[0]) {
163    case 'Z': c_name = "boolean"; break;
164    case 'B': c_name = "byte";    break;
165    case 'C': c_name = "char";    break;
166    case 'S': c_name = "short";   break;
167    case 'I': c_name = "int";     break;
168    case 'J': c_name = "long";    break;
169    case 'F': c_name = "float";   break;
170    case 'D': c_name = "double";  break;
171    case 'V': c_name = "void";    break;
172    default:
173      LOG(FATAL) << "Unknown primitive type: " << PrintableChar(descriptor[0]);
174    }
175    name = String::AllocFromModifiedUtf8(self, c_name);
176  } else {
177    // Convert the UTF-8 name to a java.lang.String. The name must use '.' to separate package
178    // components.
179    name = String::AllocFromModifiedUtf8(self, DescriptorToDot(descriptor).c_str());
180  }
181  h_this->SetName(name);
182  return name;
183}
184
185void Class::DumpClass(std::ostream& os, int flags) {
186  if ((flags & kDumpClassFullDetail) == 0) {
187    os << PrettyClass(this);
188    if ((flags & kDumpClassClassLoader) != 0) {
189      os << ' ' << GetClassLoader();
190    }
191    if ((flags & kDumpClassInitialized) != 0) {
192      os << ' ' << GetStatus();
193    }
194    os << "\n";
195    return;
196  }
197
198  Thread* const self = Thread::Current();
199  StackHandleScope<2> hs(self);
200  Handle<mirror::Class> h_this(hs.NewHandle(this));
201  Handle<mirror::Class> h_super(hs.NewHandle(GetSuperClass()));
202  auto image_pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
203
204  std::string temp;
205  os << "----- " << (IsInterface() ? "interface" : "class") << " "
206     << "'" << GetDescriptor(&temp) << "' cl=" << GetClassLoader() << " -----\n",
207  os << "  objectSize=" << SizeOf() << " "
208     << "(" << (h_super.Get() != nullptr ? h_super->SizeOf() : -1) << " from super)\n",
209  os << StringPrintf("  access=0x%04x.%04x\n",
210      GetAccessFlags() >> 16, GetAccessFlags() & kAccJavaFlagsMask);
211  if (h_super.Get() != nullptr) {
212    os << "  super='" << PrettyClass(h_super.Get()) << "' (cl=" << h_super->GetClassLoader()
213       << ")\n";
214  }
215  if (IsArrayClass()) {
216    os << "  componentType=" << PrettyClass(GetComponentType()) << "\n";
217  }
218  const size_t num_direct_interfaces = NumDirectInterfaces();
219  if (num_direct_interfaces > 0) {
220    os << "  interfaces (" << num_direct_interfaces << "):\n";
221    for (size_t i = 0; i < num_direct_interfaces; ++i) {
222      Class* interface = GetDirectInterface(self, h_this, i);
223      if (interface == nullptr) {
224        os << StringPrintf("    %2zd: nullptr!\n", i);
225      } else {
226        const ClassLoader* cl = interface->GetClassLoader();
227        os << StringPrintf("    %2zd: %s (cl=%p)\n", i, PrettyClass(interface).c_str(), cl);
228      }
229    }
230  }
231  if (!IsLoaded()) {
232    os << "  class not yet loaded";
233  } else {
234    // After this point, this may have moved due to GetDirectInterface.
235    os << "  vtable (" << h_this->NumVirtualMethods() << " entries, "
236        << (h_super.Get() != nullptr ? h_super->NumVirtualMethods() : 0) << " in super):\n";
237    for (size_t i = 0; i < NumVirtualMethods(); ++i) {
238      os << StringPrintf("    %2zd: %s\n", i, PrettyMethod(
239          h_this->GetVirtualMethodDuringLinking(i, image_pointer_size)).c_str());
240    }
241    os << "  direct methods (" << h_this->NumDirectMethods() << " entries):\n";
242    for (size_t i = 0; i < h_this->NumDirectMethods(); ++i) {
243      os << StringPrintf("    %2zd: %s\n", i, PrettyMethod(
244          h_this->GetDirectMethod(i, image_pointer_size)).c_str());
245    }
246    if (h_this->NumStaticFields() > 0) {
247      os << "  static fields (" << h_this->NumStaticFields() << " entries):\n";
248      if (h_this->IsResolved() || h_this->IsErroneous()) {
249        for (size_t i = 0; i < h_this->NumStaticFields(); ++i) {
250          os << StringPrintf("    %2zd: %s\n", i, PrettyField(h_this->GetStaticField(i)).c_str());
251        }
252      } else {
253        os << "    <not yet available>";
254      }
255    }
256    if (h_this->NumInstanceFields() > 0) {
257      os << "  instance fields (" << h_this->NumInstanceFields() << " entries):\n";
258      if (h_this->IsResolved() || h_this->IsErroneous()) {
259        for (size_t i = 0; i < h_this->NumInstanceFields(); ++i) {
260          os << StringPrintf("    %2zd: %s\n", i, PrettyField(h_this->GetInstanceField(i)).c_str());
261        }
262      } else {
263        os << "    <not yet available>";
264      }
265    }
266  }
267}
268
269void Class::SetReferenceInstanceOffsets(uint32_t new_reference_offsets) {
270  if (kIsDebugBuild && new_reference_offsets != kClassWalkSuper) {
271    // Sanity check that the number of bits set in the reference offset bitmap
272    // agrees with the number of references
273    uint32_t count = 0;
274    for (Class* c = this; c != nullptr; c = c->GetSuperClass()) {
275      count += c->NumReferenceInstanceFieldsDuringLinking();
276    }
277    // +1 for the Class in Object.
278    CHECK_EQ(static_cast<uint32_t>(POPCOUNT(new_reference_offsets)) + 1, count);
279  }
280  // Not called within a transaction.
281  SetField32<false>(OFFSET_OF_OBJECT_MEMBER(Class, reference_instance_offsets_),
282                    new_reference_offsets);
283}
284
285bool Class::IsInSamePackage(const StringPiece& descriptor1, const StringPiece& descriptor2) {
286  size_t i = 0;
287  size_t min_length = std::min(descriptor1.size(), descriptor2.size());
288  while (i < min_length && descriptor1[i] == descriptor2[i]) {
289    ++i;
290  }
291  if (descriptor1.find('/', i) != StringPiece::npos ||
292      descriptor2.find('/', i) != StringPiece::npos) {
293    return false;
294  } else {
295    return true;
296  }
297}
298
299bool Class::IsInSamePackage(Class* that) {
300  Class* klass1 = this;
301  Class* klass2 = that;
302  if (klass1 == klass2) {
303    return true;
304  }
305  // Class loaders must match.
306  if (klass1->GetClassLoader() != klass2->GetClassLoader()) {
307    return false;
308  }
309  // Arrays are in the same package when their element classes are.
310  while (klass1->IsArrayClass()) {
311    klass1 = klass1->GetComponentType();
312  }
313  while (klass2->IsArrayClass()) {
314    klass2 = klass2->GetComponentType();
315  }
316  // trivial check again for array types
317  if (klass1 == klass2) {
318    return true;
319  }
320  // Compare the package part of the descriptor string.
321  std::string temp1, temp2;
322  return IsInSamePackage(klass1->GetDescriptor(&temp1), klass2->GetDescriptor(&temp2));
323}
324
325bool Class::IsThrowableClass() {
326  return WellKnownClasses::ToClass(WellKnownClasses::java_lang_Throwable)->IsAssignableFrom(this);
327}
328
329void Class::SetClassLoader(ClassLoader* new_class_loader) {
330  if (Runtime::Current()->IsActiveTransaction()) {
331    SetFieldObject<true>(OFFSET_OF_OBJECT_MEMBER(Class, class_loader_), new_class_loader);
332  } else {
333    SetFieldObject<false>(OFFSET_OF_OBJECT_MEMBER(Class, class_loader_), new_class_loader);
334  }
335}
336
337ArtMethod* Class::FindInterfaceMethod(const StringPiece& name, const StringPiece& signature,
338                                      size_t pointer_size) {
339  // Check the current class before checking the interfaces.
340  ArtMethod* method = FindDeclaredVirtualMethod(name, signature, pointer_size);
341  if (method != nullptr) {
342    return method;
343  }
344
345  int32_t iftable_count = GetIfTableCount();
346  IfTable* iftable = GetIfTable();
347  for (int32_t i = 0; i < iftable_count; ++i) {
348    method = iftable->GetInterface(i)->FindDeclaredVirtualMethod(name, signature, pointer_size);
349    if (method != nullptr) {
350      return method;
351    }
352  }
353  return nullptr;
354}
355
356ArtMethod* Class::FindInterfaceMethod(const StringPiece& name, const Signature& signature,
357                                      size_t pointer_size) {
358  // Check the current class before checking the interfaces.
359  ArtMethod* method = FindDeclaredVirtualMethod(name, signature, pointer_size);
360  if (method != nullptr) {
361    return method;
362  }
363
364  int32_t iftable_count = GetIfTableCount();
365  IfTable* iftable = GetIfTable();
366  for (int32_t i = 0; i < iftable_count; ++i) {
367    method = iftable->GetInterface(i)->FindDeclaredVirtualMethod(name, signature, pointer_size);
368    if (method != nullptr) {
369      return method;
370    }
371  }
372  return nullptr;
373}
374
375ArtMethod* Class::FindInterfaceMethod(const DexCache* dex_cache, uint32_t dex_method_idx,
376                                      size_t pointer_size) {
377  // Check the current class before checking the interfaces.
378  ArtMethod* method = FindDeclaredVirtualMethod(dex_cache, dex_method_idx, pointer_size);
379  if (method != nullptr) {
380    return method;
381  }
382
383  int32_t iftable_count = GetIfTableCount();
384  IfTable* iftable = GetIfTable();
385  for (int32_t i = 0; i < iftable_count; ++i) {
386    method = iftable->GetInterface(i)->FindDeclaredVirtualMethod(
387        dex_cache, dex_method_idx, pointer_size);
388    if (method != nullptr) {
389      return method;
390    }
391  }
392  return nullptr;
393}
394
395ArtMethod* Class::FindDeclaredDirectMethod(const StringPiece& name, const StringPiece& signature,
396                                           size_t pointer_size) {
397  for (auto& method : GetDirectMethods(pointer_size)) {
398    if (name == method.GetName() && method.GetSignature() == signature) {
399      return &method;
400    }
401  }
402  return nullptr;
403}
404
405ArtMethod* Class::FindDeclaredDirectMethod(const StringPiece& name, const Signature& signature,
406                                           size_t pointer_size) {
407  for (auto& method : GetDirectMethods(pointer_size)) {
408    if (name == method.GetName() && signature == method.GetSignature()) {
409      return &method;
410    }
411  }
412  return nullptr;
413}
414
415ArtMethod* Class::FindDeclaredDirectMethod(const DexCache* dex_cache, uint32_t dex_method_idx,
416                                           size_t pointer_size) {
417  if (GetDexCache() == dex_cache) {
418    for (auto& method : GetDirectMethods(pointer_size)) {
419      if (method.GetDexMethodIndex() == dex_method_idx) {
420        return &method;
421      }
422    }
423  }
424  return nullptr;
425}
426
427ArtMethod* Class::FindDirectMethod(const StringPiece& name, const StringPiece& signature,
428                                   size_t pointer_size) {
429  for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
430    ArtMethod* method = klass->FindDeclaredDirectMethod(name, signature, pointer_size);
431    if (method != nullptr) {
432      return method;
433    }
434  }
435  return nullptr;
436}
437
438ArtMethod* Class::FindDirectMethod(const StringPiece& name, const Signature& signature,
439                                   size_t pointer_size) {
440  for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
441    ArtMethod* method = klass->FindDeclaredDirectMethod(name, signature, pointer_size);
442    if (method != nullptr) {
443      return method;
444    }
445  }
446  return nullptr;
447}
448
449ArtMethod* Class::FindDirectMethod(
450    const DexCache* dex_cache, uint32_t dex_method_idx, size_t pointer_size) {
451  for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
452    ArtMethod* method = klass->FindDeclaredDirectMethod(dex_cache, dex_method_idx, pointer_size);
453    if (method != nullptr) {
454      return method;
455    }
456  }
457  return nullptr;
458}
459
460ArtMethod* Class::FindDeclaredVirtualMethod(const StringPiece& name, const StringPiece& signature,
461                                            size_t pointer_size) {
462  for (auto& method : GetVirtualMethods(pointer_size)) {
463    ArtMethod* const np_method = method.GetInterfaceMethodIfProxy(pointer_size);
464    if (name == np_method->GetName() && np_method->GetSignature() == signature) {
465      return &method;
466    }
467  }
468  return nullptr;
469}
470
471ArtMethod* Class::FindDeclaredVirtualMethod(const StringPiece& name, const Signature& signature,
472                                            size_t pointer_size) {
473  for (auto& method : GetVirtualMethods(pointer_size)) {
474    ArtMethod* const np_method = method.GetInterfaceMethodIfProxy(pointer_size);
475    if (name == np_method->GetName() && signature == np_method->GetSignature()) {
476      return &method;
477    }
478  }
479  return nullptr;
480}
481
482ArtMethod* Class::FindDeclaredVirtualMethod(const DexCache* dex_cache, uint32_t dex_method_idx,
483                                            size_t pointer_size) {
484  if (GetDexCache() == dex_cache) {
485    for (auto& method : GetVirtualMethods(pointer_size)) {
486      // A miranda method may have a different DexCache and is always created by linking,
487      // never *declared* in the class.
488      if (method.GetDexMethodIndex() == dex_method_idx && !method.IsMiranda()) {
489        return &method;
490      }
491    }
492  }
493  return nullptr;
494}
495
496ArtMethod* Class::FindDeclaredVirtualMethodByName(const StringPiece& name, size_t pointer_size) {
497  for (auto& method : GetVirtualMethods(pointer_size)) {
498    ArtMethod* const np_method = method.GetInterfaceMethodIfProxy(pointer_size);
499    if (name == np_method->GetName()) {
500      return &method;
501    }
502  }
503  return nullptr;
504}
505
506ArtMethod* Class::FindVirtualMethod(
507    const StringPiece& name, const StringPiece& signature, size_t pointer_size) {
508  for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
509    ArtMethod* method = klass->FindDeclaredVirtualMethod(name, signature, pointer_size);
510    if (method != nullptr) {
511      return method;
512    }
513  }
514  return nullptr;
515}
516
517ArtMethod* Class::FindVirtualMethod(
518    const StringPiece& name, const Signature& signature, size_t pointer_size) {
519  for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
520    ArtMethod* method = klass->FindDeclaredVirtualMethod(name, signature, pointer_size);
521    if (method != nullptr) {
522      return method;
523    }
524  }
525  return nullptr;
526}
527
528ArtMethod* Class::FindVirtualMethod(
529    const DexCache* dex_cache, uint32_t dex_method_idx, size_t pointer_size) {
530  for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
531    ArtMethod* method = klass->FindDeclaredVirtualMethod(dex_cache, dex_method_idx, pointer_size);
532    if (method != nullptr) {
533      return method;
534    }
535  }
536  return nullptr;
537}
538
539ArtMethod* Class::FindClassInitializer(size_t pointer_size) {
540  for (ArtMethod& method : GetDirectMethods(pointer_size)) {
541    if (method.IsClassInitializer()) {
542      DCHECK_STREQ(method.GetName(), "<clinit>");
543      DCHECK_STREQ(method.GetSignature().ToString().c_str(), "()V");
544      return &method;
545    }
546  }
547  return nullptr;
548}
549
550// Custom binary search to avoid double comparisons from std::binary_search.
551static ArtField* FindFieldByNameAndType(LengthPrefixedArray<ArtField>* fields,
552                                        const StringPiece& name,
553                                        const StringPiece& type)
554    SHARED_REQUIRES(Locks::mutator_lock_) {
555  if (fields == nullptr) {
556    return nullptr;
557  }
558  size_t low = 0;
559  size_t high = fields->size();
560  ArtField* ret = nullptr;
561  while (low < high) {
562    size_t mid = (low + high) / 2;
563    ArtField& field = fields->At(mid);
564    // Fields are sorted by class, then name, then type descriptor. This is verified in dex file
565    // verifier. There can be multiple fields with the same in the same class name due to proguard.
566    int result = StringPiece(field.GetName()).Compare(name);
567    if (result == 0) {
568      result = StringPiece(field.GetTypeDescriptor()).Compare(type);
569    }
570    if (result < 0) {
571      low = mid + 1;
572    } else if (result > 0) {
573      high = mid;
574    } else {
575      ret = &field;
576      break;
577    }
578  }
579  if (kIsDebugBuild) {
580    ArtField* found = nullptr;
581    for (ArtField& field : MakeIterationRangeFromLengthPrefixedArray(fields)) {
582      if (name == field.GetName() && type == field.GetTypeDescriptor()) {
583        found = &field;
584        break;
585      }
586    }
587    CHECK_EQ(found, ret) << "Found " << PrettyField(found) << " vs  " << PrettyField(ret);
588  }
589  return ret;
590}
591
592ArtField* Class::FindDeclaredInstanceField(const StringPiece& name, const StringPiece& type) {
593  // Binary search by name. Interfaces are not relevant because they can't contain instance fields.
594  return FindFieldByNameAndType(GetIFieldsPtr(), name, type);
595}
596
597ArtField* Class::FindDeclaredInstanceField(const DexCache* dex_cache, uint32_t dex_field_idx) {
598  if (GetDexCache() == dex_cache) {
599    for (ArtField& field : GetIFields()) {
600      if (field.GetDexFieldIndex() == dex_field_idx) {
601        return &field;
602      }
603    }
604  }
605  return nullptr;
606}
607
608ArtField* Class::FindInstanceField(const StringPiece& name, const StringPiece& type) {
609  // Is the field in this class, or any of its superclasses?
610  // Interfaces are not relevant because they can't contain instance fields.
611  for (Class* c = this; c != nullptr; c = c->GetSuperClass()) {
612    ArtField* f = c->FindDeclaredInstanceField(name, type);
613    if (f != nullptr) {
614      return f;
615    }
616  }
617  return nullptr;
618}
619
620ArtField* Class::FindInstanceField(const DexCache* dex_cache, uint32_t dex_field_idx) {
621  // Is the field in this class, or any of its superclasses?
622  // Interfaces are not relevant because they can't contain instance fields.
623  for (Class* c = this; c != nullptr; c = c->GetSuperClass()) {
624    ArtField* f = c->FindDeclaredInstanceField(dex_cache, dex_field_idx);
625    if (f != nullptr) {
626      return f;
627    }
628  }
629  return nullptr;
630}
631
632ArtField* Class::FindDeclaredStaticField(const StringPiece& name, const StringPiece& type) {
633  DCHECK(type != nullptr);
634  return FindFieldByNameAndType(GetSFieldsPtr(), name, type);
635}
636
637ArtField* Class::FindDeclaredStaticField(const DexCache* dex_cache, uint32_t dex_field_idx) {
638  if (dex_cache == GetDexCache()) {
639    for (ArtField& field : GetSFields()) {
640      if (field.GetDexFieldIndex() == dex_field_idx) {
641        return &field;
642      }
643    }
644  }
645  return nullptr;
646}
647
648ArtField* Class::FindStaticField(Thread* self, Handle<Class> klass, const StringPiece& name,
649                                 const StringPiece& type) {
650  // Is the field in this class (or its interfaces), or any of its
651  // superclasses (or their interfaces)?
652  for (Class* k = klass.Get(); k != nullptr; k = k->GetSuperClass()) {
653    // Is the field in this class?
654    ArtField* f = k->FindDeclaredStaticField(name, type);
655    if (f != nullptr) {
656      return f;
657    }
658    // Wrap k incase it moves during GetDirectInterface.
659    StackHandleScope<1> hs(self);
660    HandleWrapper<mirror::Class> h_k(hs.NewHandleWrapper(&k));
661    // Is this field in any of this class' interfaces?
662    for (uint32_t i = 0; i < h_k->NumDirectInterfaces(); ++i) {
663      StackHandleScope<1> hs2(self);
664      Handle<mirror::Class> interface(hs2.NewHandle(GetDirectInterface(self, h_k, i)));
665      f = FindStaticField(self, interface, name, type);
666      if (f != nullptr) {
667        return f;
668      }
669    }
670  }
671  return nullptr;
672}
673
674ArtField* Class::FindStaticField(Thread* self, Handle<Class> klass, const DexCache* dex_cache,
675                                 uint32_t dex_field_idx) {
676  for (Class* k = klass.Get(); k != nullptr; k = k->GetSuperClass()) {
677    // Is the field in this class?
678    ArtField* f = k->FindDeclaredStaticField(dex_cache, dex_field_idx);
679    if (f != nullptr) {
680      return f;
681    }
682    // Wrap k incase it moves during GetDirectInterface.
683    StackHandleScope<1> hs(self);
684    HandleWrapper<mirror::Class> h_k(hs.NewHandleWrapper(&k));
685    // Is this field in any of this class' interfaces?
686    for (uint32_t i = 0; i < h_k->NumDirectInterfaces(); ++i) {
687      StackHandleScope<1> hs2(self);
688      Handle<mirror::Class> interface(hs2.NewHandle(GetDirectInterface(self, h_k, i)));
689      f = FindStaticField(self, interface, dex_cache, dex_field_idx);
690      if (f != nullptr) {
691        return f;
692      }
693    }
694  }
695  return nullptr;
696}
697
698ArtField* Class::FindField(Thread* self, Handle<Class> klass, const StringPiece& name,
699                           const StringPiece& type) {
700  // Find a field using the JLS field resolution order
701  for (Class* k = klass.Get(); k != nullptr; k = k->GetSuperClass()) {
702    // Is the field in this class?
703    ArtField* f = k->FindDeclaredInstanceField(name, type);
704    if (f != nullptr) {
705      return f;
706    }
707    f = k->FindDeclaredStaticField(name, type);
708    if (f != nullptr) {
709      return f;
710    }
711    // Is this field in any of this class' interfaces?
712    StackHandleScope<1> hs(self);
713    HandleWrapper<mirror::Class> h_k(hs.NewHandleWrapper(&k));
714    for (uint32_t i = 0; i < h_k->NumDirectInterfaces(); ++i) {
715      StackHandleScope<1> hs2(self);
716      Handle<mirror::Class> interface(hs2.NewHandle(GetDirectInterface(self, h_k, i)));
717      f = interface->FindStaticField(self, interface, name, type);
718      if (f != nullptr) {
719        return f;
720      }
721    }
722  }
723  return nullptr;
724}
725
726void Class::SetPreverifiedFlagOnAllMethods(size_t pointer_size) {
727  DCHECK(IsVerified());
728  for (auto& m : GetDirectMethods(pointer_size)) {
729    if (!m.IsNative() && !m.IsAbstract()) {
730      m.SetPreverified();
731    }
732  }
733  for (auto& m : GetVirtualMethods(pointer_size)) {
734    if (!m.IsNative() && !m.IsAbstract()) {
735      m.SetPreverified();
736    }
737  }
738}
739
740const char* Class::GetDescriptor(std::string* storage) {
741  if (IsPrimitive()) {
742    return Primitive::Descriptor(GetPrimitiveType());
743  } else if (IsArrayClass()) {
744    return GetArrayDescriptor(storage);
745  } else if (IsProxyClass()) {
746    *storage = Runtime::Current()->GetClassLinker()->GetDescriptorForProxy(this);
747    return storage->c_str();
748  } else {
749    const DexFile& dex_file = GetDexFile();
750    const DexFile::TypeId& type_id = dex_file.GetTypeId(GetClassDef()->class_idx_);
751    return dex_file.GetTypeDescriptor(type_id);
752  }
753}
754
755const char* Class::GetArrayDescriptor(std::string* storage) {
756  std::string temp;
757  const char* elem_desc = GetComponentType()->GetDescriptor(&temp);
758  *storage = "[";
759  *storage += elem_desc;
760  return storage->c_str();
761}
762
763const DexFile::ClassDef* Class::GetClassDef() {
764  uint16_t class_def_idx = GetDexClassDefIndex();
765  if (class_def_idx == DexFile::kDexNoIndex16) {
766    return nullptr;
767  }
768  return &GetDexFile().GetClassDef(class_def_idx);
769}
770
771uint16_t Class::GetDirectInterfaceTypeIdx(uint32_t idx) {
772  DCHECK(!IsPrimitive());
773  DCHECK(!IsArrayClass());
774  return GetInterfaceTypeList()->GetTypeItem(idx).type_idx_;
775}
776
777mirror::Class* Class::GetDirectInterface(Thread* self, Handle<mirror::Class> klass,
778                                         uint32_t idx) {
779  DCHECK(klass.Get() != nullptr);
780  DCHECK(!klass->IsPrimitive());
781  if (klass->IsArrayClass()) {
782    ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
783    if (idx == 0) {
784      return class_linker->FindSystemClass(self, "Ljava/lang/Cloneable;");
785    } else {
786      DCHECK_EQ(1U, idx);
787      return class_linker->FindSystemClass(self, "Ljava/io/Serializable;");
788    }
789  } else if (klass->IsProxyClass()) {
790    mirror::ObjectArray<mirror::Class>* interfaces = klass.Get()->GetInterfaces();
791    DCHECK(interfaces != nullptr);
792    return interfaces->Get(idx);
793  } else {
794    uint16_t type_idx = klass->GetDirectInterfaceTypeIdx(idx);
795    mirror::Class* interface = klass->GetDexCache()->GetResolvedType(type_idx);
796    if (interface == nullptr) {
797      interface = Runtime::Current()->GetClassLinker()->ResolveType(klass->GetDexFile(), type_idx,
798                                                                    klass.Get());
799      CHECK(interface != nullptr || self->IsExceptionPending());
800    }
801    return interface;
802  }
803}
804
805const char* Class::GetSourceFile() {
806  const DexFile& dex_file = GetDexFile();
807  const DexFile::ClassDef* dex_class_def = GetClassDef();
808  if (dex_class_def == nullptr) {
809    // Generated classes have no class def.
810    return nullptr;
811  }
812  return dex_file.GetSourceFile(*dex_class_def);
813}
814
815std::string Class::GetLocation() {
816  mirror::DexCache* dex_cache = GetDexCache();
817  if (dex_cache != nullptr && !IsProxyClass()) {
818    return dex_cache->GetLocation()->ToModifiedUtf8();
819  }
820  // Arrays and proxies are generated and have no corresponding dex file location.
821  return "generated class";
822}
823
824const DexFile::TypeList* Class::GetInterfaceTypeList() {
825  const DexFile::ClassDef* class_def = GetClassDef();
826  if (class_def == nullptr) {
827    return nullptr;
828  }
829  return GetDexFile().GetInterfacesList(*class_def);
830}
831
832void Class::PopulateEmbeddedImtAndVTable(ArtMethod* const (&methods)[kImtSize],
833                                         size_t pointer_size) {
834  for (size_t i = 0; i < kImtSize; i++) {
835    auto method = methods[i];
836    DCHECK(method != nullptr);
837    SetEmbeddedImTableEntry(i, method, pointer_size);
838  }
839  PointerArray* table = GetVTableDuringLinking();
840  CHECK(table != nullptr) << PrettyClass(this);
841  const size_t table_length = table->GetLength();
842  SetEmbeddedVTableLength(table_length);
843  for (size_t i = 0; i < table_length; i++) {
844    SetEmbeddedVTableEntry(i, table->GetElementPtrSize<ArtMethod*>(i, pointer_size), pointer_size);
845  }
846  // Keep java.lang.Object class's vtable around for since it's easier
847  // to be reused by array classes during their linking.
848  if (!IsObjectClass()) {
849    SetVTable(nullptr);
850  }
851}
852
853class ReadBarrierOnNativeRootsVisitor {
854 public:
855  void operator()(mirror::Object* obj ATTRIBUTE_UNUSED,
856                  MemberOffset offset ATTRIBUTE_UNUSED,
857                  bool is_static ATTRIBUTE_UNUSED) const {}
858
859  void VisitRootIfNonNull(mirror::CompressedReference<mirror::Object>* root) const
860      SHARED_REQUIRES(Locks::mutator_lock_) {
861    if (!root->IsNull()) {
862      VisitRoot(root);
863    }
864  }
865
866  void VisitRoot(mirror::CompressedReference<mirror::Object>* root) const
867      SHARED_REQUIRES(Locks::mutator_lock_) {
868    mirror::Object* old_ref = root->AsMirrorPtr();
869    mirror::Object* new_ref = ReadBarrier::BarrierForRoot(root);
870    if (old_ref != new_ref) {
871      // Update the field atomically. This may fail if mutator updates before us, but it's ok.
872      auto* atomic_root =
873          reinterpret_cast<Atomic<mirror::CompressedReference<mirror::Object>>*>(root);
874      atomic_root->CompareExchangeStrongSequentiallyConsistent(
875          mirror::CompressedReference<mirror::Object>::FromMirrorPtr(old_ref),
876          mirror::CompressedReference<mirror::Object>::FromMirrorPtr(new_ref));
877    }
878  }
879};
880
881// The pre-fence visitor for Class::CopyOf().
882class CopyClassVisitor {
883 public:
884  CopyClassVisitor(Thread* self, Handle<mirror::Class>* orig, size_t new_length,
885                   size_t copy_bytes, ArtMethod* const (&imt)[mirror::Class::kImtSize],
886                   size_t pointer_size)
887      : self_(self), orig_(orig), new_length_(new_length),
888        copy_bytes_(copy_bytes), imt_(imt), pointer_size_(pointer_size) {
889  }
890
891  void operator()(mirror::Object* obj, size_t usable_size ATTRIBUTE_UNUSED) const
892      SHARED_REQUIRES(Locks::mutator_lock_) {
893    StackHandleScope<1> hs(self_);
894    Handle<mirror::Class> h_new_class_obj(hs.NewHandle(obj->AsClass()));
895    mirror::Object::CopyObject(self_, h_new_class_obj.Get(), orig_->Get(), copy_bytes_);
896    mirror::Class::SetStatus(h_new_class_obj, Class::kStatusResolving, self_);
897    h_new_class_obj->PopulateEmbeddedImtAndVTable(imt_, pointer_size_);
898    h_new_class_obj->SetClassSize(new_length_);
899    // Visit all of the references to make sure there is no from space references in the native
900    // roots.
901    static_cast<mirror::Object*>(h_new_class_obj.Get())->VisitReferences(
902        ReadBarrierOnNativeRootsVisitor(), VoidFunctor());
903  }
904
905 private:
906  Thread* const self_;
907  Handle<mirror::Class>* const orig_;
908  const size_t new_length_;
909  const size_t copy_bytes_;
910  ArtMethod* const (&imt_)[mirror::Class::kImtSize];
911  const size_t pointer_size_;
912  DISALLOW_COPY_AND_ASSIGN(CopyClassVisitor);
913};
914
915Class* Class::CopyOf(Thread* self, int32_t new_length,
916                     ArtMethod* const (&imt)[mirror::Class::kImtSize], size_t pointer_size) {
917  DCHECK_GE(new_length, static_cast<int32_t>(sizeof(Class)));
918  // We may get copied by a compacting GC.
919  StackHandleScope<1> hs(self);
920  Handle<mirror::Class> h_this(hs.NewHandle(this));
921  gc::Heap* heap = Runtime::Current()->GetHeap();
922  // The num_bytes (3rd param) is sizeof(Class) as opposed to SizeOf()
923  // to skip copying the tail part that we will overwrite here.
924  CopyClassVisitor visitor(self, &h_this, new_length, sizeof(Class), imt, pointer_size);
925  mirror::Object* new_class = kMovingClasses ?
926      heap->AllocObject<true>(self, java_lang_Class_.Read(), new_length, visitor) :
927      heap->AllocNonMovableObject<true>(self, java_lang_Class_.Read(), new_length, visitor);
928  if (UNLIKELY(new_class == nullptr)) {
929    self->AssertPendingOOMException();
930    return nullptr;
931  }
932  return new_class->AsClass();
933}
934
935bool Class::ProxyDescriptorEquals(const char* match) {
936  DCHECK(IsProxyClass());
937  return Runtime::Current()->GetClassLinker()->GetDescriptorForProxy(this) == match;
938}
939
940// TODO: Move this to java_lang_Class.cc?
941ArtMethod* Class::GetDeclaredConstructor(
942    Thread* self, Handle<mirror::ObjectArray<mirror::Class>> args) {
943  for (auto& m : GetDirectMethods(sizeof(void*))) {
944    // Skip <clinit> which is a static constructor, as well as non constructors.
945    if (m.IsStatic() || !m.IsConstructor()) {
946      continue;
947    }
948    // May cause thread suspension and exceptions.
949    if (m.GetInterfaceMethodIfProxy(sizeof(void*))->EqualParameters(args)) {
950      return &m;
951    }
952    if (UNLIKELY(self->IsExceptionPending())) {
953      return nullptr;
954    }
955  }
956  return nullptr;
957}
958
959uint32_t Class::Depth() {
960  uint32_t depth = 0;
961  for (Class* klass = this; klass->GetSuperClass() != nullptr; klass = klass->GetSuperClass()) {
962    depth++;
963  }
964  return depth;
965}
966
967}  // namespace mirror
968}  // namespace art
969