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 
37 namespace art {
38 namespace mirror {
39 
40 GcRoot<Class> Class::java_lang_Class_;
41 
SetClassClass(Class * java_lang_Class)42 void 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 
ResetClass()51 void Class::ResetClass() {
52   CHECK(!java_lang_Class_.IsNull());
53   java_lang_Class_ = GcRoot<Class>(nullptr);
54 }
55 
VisitRoots(RootVisitor * visitor)56 void Class::VisitRoots(RootVisitor* visitor) {
57   java_lang_Class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass));
58 }
59 
SetVerifyError(mirror::Object * error)60 inline 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 
SetStatus(Handle<Class> h_this,Status new_status,Thread * self)69 void 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 
SetDexCache(DexCache * new_dex_cache)131 void 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 
SetClassSize(uint32_t new_class_size)136 void 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.
ComputeName(Handle<Class> h_this)150 String* 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 
DumpClass(std::ostream & os,int flags)185 void 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 
SetReferenceInstanceOffsets(uint32_t new_reference_offsets)269 void 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 
IsInSamePackage(const StringPiece & descriptor1,const StringPiece & descriptor2)285 bool 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 
IsInSamePackage(Class * that)299 bool 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 
IsThrowableClass()325 bool Class::IsThrowableClass() {
326   return WellKnownClasses::ToClass(WellKnownClasses::java_lang_Throwable)->IsAssignableFrom(this);
327 }
328 
SetClassLoader(ClassLoader * new_class_loader)329 void 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 
FindInterfaceMethod(const StringPiece & name,const StringPiece & signature,size_t pointer_size)337 ArtMethod* 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 
FindInterfaceMethod(const StringPiece & name,const Signature & signature,size_t pointer_size)356 ArtMethod* 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 
FindInterfaceMethod(const DexCache * dex_cache,uint32_t dex_method_idx,size_t pointer_size)375 ArtMethod* 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 
FindDeclaredDirectMethod(const StringPiece & name,const StringPiece & signature,size_t pointer_size)395 ArtMethod* 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 
FindDeclaredDirectMethod(const StringPiece & name,const Signature & signature,size_t pointer_size)405 ArtMethod* 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 
FindDeclaredDirectMethod(const DexCache * dex_cache,uint32_t dex_method_idx,size_t pointer_size)415 ArtMethod* 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 
FindDirectMethod(const StringPiece & name,const StringPiece & signature,size_t pointer_size)427 ArtMethod* 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 
FindDirectMethod(const StringPiece & name,const Signature & signature,size_t pointer_size)438 ArtMethod* 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 
FindDirectMethod(const DexCache * dex_cache,uint32_t dex_method_idx,size_t pointer_size)449 ArtMethod* 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 
FindDeclaredDirectMethodByName(const StringPiece & name,size_t pointer_size)460 ArtMethod* Class::FindDeclaredDirectMethodByName(const StringPiece& name, size_t pointer_size) {
461   for (auto& method : GetDirectMethods(pointer_size)) {
462     ArtMethod* const np_method = method.GetInterfaceMethodIfProxy(pointer_size);
463     if (name == np_method->GetName()) {
464       return &method;
465     }
466   }
467   return nullptr;
468 }
469 
470 // TODO These should maybe be changed to be named FindOwnedVirtualMethod or something similar
471 // because they do not only find 'declared' methods and will return copied methods. This behavior is
472 // desired and correct but the naming can lead to confusion because in the java language declared
473 // excludes interface methods which might be found by this.
FindDeclaredVirtualMethod(const StringPiece & name,const StringPiece & signature,size_t pointer_size)474 ArtMethod* Class::FindDeclaredVirtualMethod(const StringPiece& name, const StringPiece& signature,
475                                             size_t pointer_size) {
476   for (auto& method : GetVirtualMethods(pointer_size)) {
477     ArtMethod* const np_method = method.GetInterfaceMethodIfProxy(pointer_size);
478     if (name == np_method->GetName() && np_method->GetSignature() == signature) {
479       return &method;
480     }
481   }
482   return nullptr;
483 }
484 
FindDeclaredVirtualMethod(const StringPiece & name,const Signature & signature,size_t pointer_size)485 ArtMethod* Class::FindDeclaredVirtualMethod(const StringPiece& name, const Signature& signature,
486                                             size_t pointer_size) {
487   for (auto& method : GetVirtualMethods(pointer_size)) {
488     ArtMethod* const np_method = method.GetInterfaceMethodIfProxy(pointer_size);
489     if (name == np_method->GetName() && signature == np_method->GetSignature()) {
490       return &method;
491     }
492   }
493   return nullptr;
494 }
495 
FindDeclaredVirtualMethod(const DexCache * dex_cache,uint32_t dex_method_idx,size_t pointer_size)496 ArtMethod* Class::FindDeclaredVirtualMethod(const DexCache* dex_cache, uint32_t dex_method_idx,
497                                             size_t pointer_size) {
498   if (GetDexCache() == dex_cache) {
499     for (auto& method : GetDeclaredVirtualMethods(pointer_size)) {
500       if (method.GetDexMethodIndex() == dex_method_idx) {
501         return &method;
502       }
503     }
504   }
505   return nullptr;
506 }
507 
FindDeclaredVirtualMethodByName(const StringPiece & name,size_t pointer_size)508 ArtMethod* Class::FindDeclaredVirtualMethodByName(const StringPiece& name, size_t pointer_size) {
509   for (auto& method : GetVirtualMethods(pointer_size)) {
510     ArtMethod* const np_method = method.GetInterfaceMethodIfProxy(pointer_size);
511     if (name == np_method->GetName()) {
512       return &method;
513     }
514   }
515   return nullptr;
516 }
517 
FindVirtualMethod(const StringPiece & name,const StringPiece & signature,size_t pointer_size)518 ArtMethod* Class::FindVirtualMethod(
519     const StringPiece& name, const StringPiece& signature, size_t pointer_size) {
520   for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
521     ArtMethod* method = klass->FindDeclaredVirtualMethod(name, signature, pointer_size);
522     if (method != nullptr) {
523       return method;
524     }
525   }
526   return nullptr;
527 }
528 
FindVirtualMethod(const StringPiece & name,const Signature & signature,size_t pointer_size)529 ArtMethod* Class::FindVirtualMethod(
530     const StringPiece& name, const Signature& signature, size_t pointer_size) {
531   for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
532     ArtMethod* method = klass->FindDeclaredVirtualMethod(name, signature, pointer_size);
533     if (method != nullptr) {
534       return method;
535     }
536   }
537   return nullptr;
538 }
539 
FindVirtualMethod(const DexCache * dex_cache,uint32_t dex_method_idx,size_t pointer_size)540 ArtMethod* Class::FindVirtualMethod(
541     const DexCache* dex_cache, uint32_t dex_method_idx, size_t pointer_size) {
542   for (Class* klass = this; klass != nullptr; klass = klass->GetSuperClass()) {
543     ArtMethod* method = klass->FindDeclaredVirtualMethod(dex_cache, dex_method_idx, pointer_size);
544     if (method != nullptr) {
545       return method;
546     }
547   }
548   return nullptr;
549 }
550 
FindVirtualMethodForInterfaceSuper(ArtMethod * method,size_t pointer_size)551 ArtMethod* Class::FindVirtualMethodForInterfaceSuper(ArtMethod* method, size_t pointer_size) {
552   DCHECK(method->GetDeclaringClass()->IsInterface());
553   DCHECK(IsInterface()) << "Should only be called on a interface class";
554   // Check if we have one defined on this interface first. This includes searching copied ones to
555   // get any conflict methods. Conflict methods are copied into each subtype from the supertype. We
556   // don't do any indirect method checks here.
557   for (ArtMethod& iface_method : GetVirtualMethods(pointer_size)) {
558     if (method->HasSameNameAndSignature(&iface_method)) {
559       return &iface_method;
560     }
561   }
562 
563   std::vector<ArtMethod*> abstract_methods;
564   // Search through the IFTable for a working version. We don't need to check for conflicts
565   // because if there was one it would appear in this classes virtual_methods_ above.
566 
567   Thread* self = Thread::Current();
568   StackHandleScope<2> hs(self);
569   MutableHandle<mirror::IfTable> iftable(hs.NewHandle(GetIfTable()));
570   MutableHandle<mirror::Class> iface(hs.NewHandle<mirror::Class>(nullptr));
571   size_t iftable_count = GetIfTableCount();
572   // Find the method. We don't need to check for conflicts because they would have been in the
573   // copied virtuals of this interface.  Order matters, traverse in reverse topological order; most
574   // subtypiest interfaces get visited first.
575   for (size_t k = iftable_count; k != 0;) {
576     k--;
577     DCHECK_LT(k, iftable->Count());
578     iface.Assign(iftable->GetInterface(k));
579     // Iterate through every declared method on this interface. Each direct method's name/signature
580     // is unique so the order of the inner loop doesn't matter.
581     for (auto& method_iter : iface->GetDeclaredVirtualMethods(pointer_size)) {
582       ArtMethod* current_method = &method_iter;
583       if (current_method->HasSameNameAndSignature(method)) {
584         if (current_method->IsDefault()) {
585           // Handle JLS soft errors, a default method from another superinterface tree can
586           // "override" an abstract method(s) from another superinterface tree(s).  To do this,
587           // ignore any [default] method which are dominated by the abstract methods we've seen so
588           // far. Check if overridden by any in abstract_methods. We do not need to check for
589           // default_conflicts because we would hit those before we get to this loop.
590           bool overridden = false;
591           for (ArtMethod* possible_override : abstract_methods) {
592             DCHECK(possible_override->HasSameNameAndSignature(current_method));
593             if (iface->IsAssignableFrom(possible_override->GetDeclaringClass())) {
594               overridden = true;
595               break;
596             }
597           }
598           if (!overridden) {
599             return current_method;
600           }
601         } else {
602           // Is not default.
603           // This might override another default method. Just stash it for now.
604           abstract_methods.push_back(current_method);
605         }
606       }
607     }
608   }
609   // If we reach here we either never found any declaration of the method (in which case
610   // 'abstract_methods' is empty or we found no non-overriden default methods in which case
611   // 'abstract_methods' contains a number of abstract implementations of the methods. We choose one
612   // of these arbitrarily.
613   return abstract_methods.empty() ? nullptr : abstract_methods[0];
614 }
615 
FindClassInitializer(size_t pointer_size)616 ArtMethod* Class::FindClassInitializer(size_t pointer_size) {
617   for (ArtMethod& method : GetDirectMethods(pointer_size)) {
618     if (method.IsClassInitializer()) {
619       DCHECK_STREQ(method.GetName(), "<clinit>");
620       DCHECK_STREQ(method.GetSignature().ToString().c_str(), "()V");
621       return &method;
622     }
623   }
624   return nullptr;
625 }
626 
627 // Custom binary search to avoid double comparisons from std::binary_search.
FindFieldByNameAndType(LengthPrefixedArray<ArtField> * fields,const StringPiece & name,const StringPiece & type)628 static ArtField* FindFieldByNameAndType(LengthPrefixedArray<ArtField>* fields,
629                                         const StringPiece& name,
630                                         const StringPiece& type)
631     SHARED_REQUIRES(Locks::mutator_lock_) {
632   if (fields == nullptr) {
633     return nullptr;
634   }
635   size_t low = 0;
636   size_t high = fields->size();
637   ArtField* ret = nullptr;
638   while (low < high) {
639     size_t mid = (low + high) / 2;
640     ArtField& field = fields->At(mid);
641     // Fields are sorted by class, then name, then type descriptor. This is verified in dex file
642     // verifier. There can be multiple fields with the same in the same class name due to proguard.
643     int result = StringPiece(field.GetName()).Compare(name);
644     if (result == 0) {
645       result = StringPiece(field.GetTypeDescriptor()).Compare(type);
646     }
647     if (result < 0) {
648       low = mid + 1;
649     } else if (result > 0) {
650       high = mid;
651     } else {
652       ret = &field;
653       break;
654     }
655   }
656   if (kIsDebugBuild) {
657     ArtField* found = nullptr;
658     for (ArtField& field : MakeIterationRangeFromLengthPrefixedArray(fields)) {
659       if (name == field.GetName() && type == field.GetTypeDescriptor()) {
660         found = &field;
661         break;
662       }
663     }
664     CHECK_EQ(found, ret) << "Found " << PrettyField(found) << " vs  " << PrettyField(ret);
665   }
666   return ret;
667 }
668 
FindDeclaredInstanceField(const StringPiece & name,const StringPiece & type)669 ArtField* Class::FindDeclaredInstanceField(const StringPiece& name, const StringPiece& type) {
670   // Binary search by name. Interfaces are not relevant because they can't contain instance fields.
671   return FindFieldByNameAndType(GetIFieldsPtr(), name, type);
672 }
673 
FindDeclaredInstanceField(const DexCache * dex_cache,uint32_t dex_field_idx)674 ArtField* Class::FindDeclaredInstanceField(const DexCache* dex_cache, uint32_t dex_field_idx) {
675   if (GetDexCache() == dex_cache) {
676     for (ArtField& field : GetIFields()) {
677       if (field.GetDexFieldIndex() == dex_field_idx) {
678         return &field;
679       }
680     }
681   }
682   return nullptr;
683 }
684 
FindInstanceField(const StringPiece & name,const StringPiece & type)685 ArtField* Class::FindInstanceField(const StringPiece& name, const StringPiece& type) {
686   // Is the field in this class, or any of its superclasses?
687   // Interfaces are not relevant because they can't contain instance fields.
688   for (Class* c = this; c != nullptr; c = c->GetSuperClass()) {
689     ArtField* f = c->FindDeclaredInstanceField(name, type);
690     if (f != nullptr) {
691       return f;
692     }
693   }
694   return nullptr;
695 }
696 
FindInstanceField(const DexCache * dex_cache,uint32_t dex_field_idx)697 ArtField* Class::FindInstanceField(const DexCache* dex_cache, uint32_t dex_field_idx) {
698   // Is the field in this class, or any of its superclasses?
699   // Interfaces are not relevant because they can't contain instance fields.
700   for (Class* c = this; c != nullptr; c = c->GetSuperClass()) {
701     ArtField* f = c->FindDeclaredInstanceField(dex_cache, dex_field_idx);
702     if (f != nullptr) {
703       return f;
704     }
705   }
706   return nullptr;
707 }
708 
FindDeclaredStaticField(const StringPiece & name,const StringPiece & type)709 ArtField* Class::FindDeclaredStaticField(const StringPiece& name, const StringPiece& type) {
710   DCHECK(type != nullptr);
711   return FindFieldByNameAndType(GetSFieldsPtr(), name, type);
712 }
713 
FindDeclaredStaticField(const DexCache * dex_cache,uint32_t dex_field_idx)714 ArtField* Class::FindDeclaredStaticField(const DexCache* dex_cache, uint32_t dex_field_idx) {
715   if (dex_cache == GetDexCache()) {
716     for (ArtField& field : GetSFields()) {
717       if (field.GetDexFieldIndex() == dex_field_idx) {
718         return &field;
719       }
720     }
721   }
722   return nullptr;
723 }
724 
FindStaticField(Thread * self,Handle<Class> klass,const StringPiece & name,const StringPiece & type)725 ArtField* Class::FindStaticField(Thread* self, Handle<Class> klass, const StringPiece& name,
726                                  const StringPiece& type) {
727   // Is the field in this class (or its interfaces), or any of its
728   // superclasses (or their interfaces)?
729   for (Class* k = klass.Get(); k != nullptr; k = k->GetSuperClass()) {
730     // Is the field in this class?
731     ArtField* f = k->FindDeclaredStaticField(name, type);
732     if (f != nullptr) {
733       return f;
734     }
735     // Wrap k incase it moves during GetDirectInterface.
736     StackHandleScope<1> hs(self);
737     HandleWrapper<mirror::Class> h_k(hs.NewHandleWrapper(&k));
738     // Is this field in any of this class' interfaces?
739     for (uint32_t i = 0; i < h_k->NumDirectInterfaces(); ++i) {
740       StackHandleScope<1> hs2(self);
741       Handle<mirror::Class> interface(hs2.NewHandle(GetDirectInterface(self, h_k, i)));
742       f = FindStaticField(self, interface, name, type);
743       if (f != nullptr) {
744         return f;
745       }
746     }
747   }
748   return nullptr;
749 }
750 
FindStaticField(Thread * self,Handle<Class> klass,const DexCache * dex_cache,uint32_t dex_field_idx)751 ArtField* Class::FindStaticField(Thread* self, Handle<Class> klass, const DexCache* dex_cache,
752                                  uint32_t dex_field_idx) {
753   for (Class* k = klass.Get(); k != nullptr; k = k->GetSuperClass()) {
754     // Is the field in this class?
755     ArtField* f = k->FindDeclaredStaticField(dex_cache, dex_field_idx);
756     if (f != nullptr) {
757       return f;
758     }
759     // Wrap k incase it moves during GetDirectInterface.
760     StackHandleScope<1> hs(self);
761     HandleWrapper<mirror::Class> h_k(hs.NewHandleWrapper(&k));
762     // Is this field in any of this class' interfaces?
763     for (uint32_t i = 0; i < h_k->NumDirectInterfaces(); ++i) {
764       StackHandleScope<1> hs2(self);
765       Handle<mirror::Class> interface(hs2.NewHandle(GetDirectInterface(self, h_k, i)));
766       f = FindStaticField(self, interface, dex_cache, dex_field_idx);
767       if (f != nullptr) {
768         return f;
769       }
770     }
771   }
772   return nullptr;
773 }
774 
FindField(Thread * self,Handle<Class> klass,const StringPiece & name,const StringPiece & type)775 ArtField* Class::FindField(Thread* self, Handle<Class> klass, const StringPiece& name,
776                            const StringPiece& type) {
777   // Find a field using the JLS field resolution order
778   for (Class* k = klass.Get(); k != nullptr; k = k->GetSuperClass()) {
779     // Is the field in this class?
780     ArtField* f = k->FindDeclaredInstanceField(name, type);
781     if (f != nullptr) {
782       return f;
783     }
784     f = k->FindDeclaredStaticField(name, type);
785     if (f != nullptr) {
786       return f;
787     }
788     // Is this field in any of this class' interfaces?
789     StackHandleScope<1> hs(self);
790     HandleWrapper<mirror::Class> h_k(hs.NewHandleWrapper(&k));
791     for (uint32_t i = 0; i < h_k->NumDirectInterfaces(); ++i) {
792       StackHandleScope<1> hs2(self);
793       Handle<mirror::Class> interface(hs2.NewHandle(GetDirectInterface(self, h_k, i)));
794       f = interface->FindStaticField(self, interface, name, type);
795       if (f != nullptr) {
796         return f;
797       }
798     }
799   }
800   return nullptr;
801 }
802 
SetSkipAccessChecksFlagOnAllMethods(size_t pointer_size)803 void Class::SetSkipAccessChecksFlagOnAllMethods(size_t pointer_size) {
804   DCHECK(IsVerified());
805   for (auto& m : GetMethods(pointer_size)) {
806     if (!m.IsNative() && m.IsInvokable()) {
807       m.SetSkipAccessChecks();
808     }
809   }
810 }
811 
GetDescriptor(std::string * storage)812 const char* Class::GetDescriptor(std::string* storage) {
813   if (IsPrimitive()) {
814     return Primitive::Descriptor(GetPrimitiveType());
815   } else if (IsArrayClass()) {
816     return GetArrayDescriptor(storage);
817   } else if (IsProxyClass()) {
818     *storage = Runtime::Current()->GetClassLinker()->GetDescriptorForProxy(this);
819     return storage->c_str();
820   } else {
821     const DexFile& dex_file = GetDexFile();
822     const DexFile::TypeId& type_id = dex_file.GetTypeId(GetClassDef()->class_idx_);
823     return dex_file.GetTypeDescriptor(type_id);
824   }
825 }
826 
GetArrayDescriptor(std::string * storage)827 const char* Class::GetArrayDescriptor(std::string* storage) {
828   std::string temp;
829   const char* elem_desc = GetComponentType()->GetDescriptor(&temp);
830   *storage = "[";
831   *storage += elem_desc;
832   return storage->c_str();
833 }
834 
GetClassDef()835 const DexFile::ClassDef* Class::GetClassDef() {
836   uint16_t class_def_idx = GetDexClassDefIndex();
837   if (class_def_idx == DexFile::kDexNoIndex16) {
838     return nullptr;
839   }
840   return &GetDexFile().GetClassDef(class_def_idx);
841 }
842 
GetDirectInterfaceTypeIdx(uint32_t idx)843 uint16_t Class::GetDirectInterfaceTypeIdx(uint32_t idx) {
844   DCHECK(!IsPrimitive());
845   DCHECK(!IsArrayClass());
846   return GetInterfaceTypeList()->GetTypeItem(idx).type_idx_;
847 }
848 
GetDirectInterface(Thread * self,Handle<mirror::Class> klass,uint32_t idx)849 mirror::Class* Class::GetDirectInterface(Thread* self, Handle<mirror::Class> klass,
850                                          uint32_t idx) {
851   DCHECK(klass.Get() != nullptr);
852   DCHECK(!klass->IsPrimitive());
853   if (klass->IsArrayClass()) {
854     ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
855     if (idx == 0) {
856       return class_linker->FindSystemClass(self, "Ljava/lang/Cloneable;");
857     } else {
858       DCHECK_EQ(1U, idx);
859       return class_linker->FindSystemClass(self, "Ljava/io/Serializable;");
860     }
861   } else if (klass->IsProxyClass()) {
862     mirror::ObjectArray<mirror::Class>* interfaces = klass.Get()->GetInterfaces();
863     DCHECK(interfaces != nullptr);
864     return interfaces->Get(idx);
865   } else {
866     uint16_t type_idx = klass->GetDirectInterfaceTypeIdx(idx);
867     mirror::Class* interface = klass->GetDexCache()->GetResolvedType(type_idx);
868     if (interface == nullptr) {
869       interface = Runtime::Current()->GetClassLinker()->ResolveType(klass->GetDexFile(), type_idx,
870                                                                     klass.Get());
871       CHECK(interface != nullptr || self->IsExceptionPending());
872     }
873     return interface;
874   }
875 }
876 
GetCommonSuperClass(Handle<Class> klass)877 mirror::Class* Class::GetCommonSuperClass(Handle<Class> klass) {
878   DCHECK(klass.Get() != nullptr);
879   DCHECK(!klass->IsInterface());
880   DCHECK(!IsInterface());
881   mirror::Class* common_super_class = this;
882   while (!common_super_class->IsAssignableFrom(klass.Get())) {
883     mirror::Class* old_common = common_super_class;
884     common_super_class = old_common->GetSuperClass();
885     DCHECK(common_super_class != nullptr) << PrettyClass(old_common);
886   }
887   return common_super_class;
888 }
889 
GetSourceFile()890 const char* Class::GetSourceFile() {
891   const DexFile& dex_file = GetDexFile();
892   const DexFile::ClassDef* dex_class_def = GetClassDef();
893   if (dex_class_def == nullptr) {
894     // Generated classes have no class def.
895     return nullptr;
896   }
897   return dex_file.GetSourceFile(*dex_class_def);
898 }
899 
GetLocation()900 std::string Class::GetLocation() {
901   mirror::DexCache* dex_cache = GetDexCache();
902   if (dex_cache != nullptr && !IsProxyClass()) {
903     return dex_cache->GetLocation()->ToModifiedUtf8();
904   }
905   // Arrays and proxies are generated and have no corresponding dex file location.
906   return "generated class";
907 }
908 
GetInterfaceTypeList()909 const DexFile::TypeList* Class::GetInterfaceTypeList() {
910   const DexFile::ClassDef* class_def = GetClassDef();
911   if (class_def == nullptr) {
912     return nullptr;
913   }
914   return GetDexFile().GetInterfacesList(*class_def);
915 }
916 
PopulateEmbeddedImtAndVTable(ArtMethod * const (& methods)[kImtSize],size_t pointer_size)917 void Class::PopulateEmbeddedImtAndVTable(ArtMethod* const (&methods)[kImtSize],
918                                          size_t pointer_size) {
919   for (size_t i = 0; i < kImtSize; i++) {
920     auto method = methods[i];
921     DCHECK(method != nullptr);
922     SetEmbeddedImTableEntry(i, method, pointer_size);
923   }
924   PointerArray* table = GetVTableDuringLinking();
925   CHECK(table != nullptr) << PrettyClass(this);
926   const size_t table_length = table->GetLength();
927   SetEmbeddedVTableLength(table_length);
928   for (size_t i = 0; i < table_length; i++) {
929     SetEmbeddedVTableEntry(i, table->GetElementPtrSize<ArtMethod*>(i, pointer_size), pointer_size);
930   }
931   // Keep java.lang.Object class's vtable around for since it's easier
932   // to be reused by array classes during their linking.
933   if (!IsObjectClass()) {
934     SetVTable(nullptr);
935   }
936 }
937 
938 class ReadBarrierOnNativeRootsVisitor {
939  public:
operator ()(mirror::Object * obj ATTRIBUTE_UNUSED,MemberOffset offset ATTRIBUTE_UNUSED,bool is_static ATTRIBUTE_UNUSED) const940   void operator()(mirror::Object* obj ATTRIBUTE_UNUSED,
941                   MemberOffset offset ATTRIBUTE_UNUSED,
942                   bool is_static ATTRIBUTE_UNUSED) const {}
943 
VisitRootIfNonNull(mirror::CompressedReference<mirror::Object> * root) const944   void VisitRootIfNonNull(mirror::CompressedReference<mirror::Object>* root) const
945       SHARED_REQUIRES(Locks::mutator_lock_) {
946     if (!root->IsNull()) {
947       VisitRoot(root);
948     }
949   }
950 
VisitRoot(mirror::CompressedReference<mirror::Object> * root) const951   void VisitRoot(mirror::CompressedReference<mirror::Object>* root) const
952       SHARED_REQUIRES(Locks::mutator_lock_) {
953     mirror::Object* old_ref = root->AsMirrorPtr();
954     mirror::Object* new_ref = ReadBarrier::BarrierForRoot(root);
955     if (old_ref != new_ref) {
956       // Update the field atomically. This may fail if mutator updates before us, but it's ok.
957       auto* atomic_root =
958           reinterpret_cast<Atomic<mirror::CompressedReference<mirror::Object>>*>(root);
959       atomic_root->CompareExchangeStrongSequentiallyConsistent(
960           mirror::CompressedReference<mirror::Object>::FromMirrorPtr(old_ref),
961           mirror::CompressedReference<mirror::Object>::FromMirrorPtr(new_ref));
962     }
963   }
964 };
965 
966 // The pre-fence visitor for Class::CopyOf().
967 class CopyClassVisitor {
968  public:
CopyClassVisitor(Thread * self,Handle<mirror::Class> * orig,size_t new_length,size_t copy_bytes,ArtMethod * const (& imt)[mirror::Class::kImtSize],size_t pointer_size)969   CopyClassVisitor(Thread* self, Handle<mirror::Class>* orig, size_t new_length,
970                    size_t copy_bytes, ArtMethod* const (&imt)[mirror::Class::kImtSize],
971                    size_t pointer_size)
972       : self_(self), orig_(orig), new_length_(new_length),
973         copy_bytes_(copy_bytes), imt_(imt), pointer_size_(pointer_size) {
974   }
975 
operator ()(mirror::Object * obj,size_t usable_size ATTRIBUTE_UNUSED) const976   void operator()(mirror::Object* obj, size_t usable_size ATTRIBUTE_UNUSED) const
977       SHARED_REQUIRES(Locks::mutator_lock_) {
978     StackHandleScope<1> hs(self_);
979     Handle<mirror::Class> h_new_class_obj(hs.NewHandle(obj->AsClass()));
980     mirror::Object::CopyObject(self_, h_new_class_obj.Get(), orig_->Get(), copy_bytes_);
981     mirror::Class::SetStatus(h_new_class_obj, Class::kStatusResolving, self_);
982     h_new_class_obj->PopulateEmbeddedImtAndVTable(imt_, pointer_size_);
983     h_new_class_obj->SetClassSize(new_length_);
984     // Visit all of the references to make sure there is no from space references in the native
985     // roots.
986     static_cast<mirror::Object*>(h_new_class_obj.Get())->VisitReferences(
987         ReadBarrierOnNativeRootsVisitor(), VoidFunctor());
988   }
989 
990  private:
991   Thread* const self_;
992   Handle<mirror::Class>* const orig_;
993   const size_t new_length_;
994   const size_t copy_bytes_;
995   ArtMethod* const (&imt_)[mirror::Class::kImtSize];
996   const size_t pointer_size_;
997   DISALLOW_COPY_AND_ASSIGN(CopyClassVisitor);
998 };
999 
CopyOf(Thread * self,int32_t new_length,ArtMethod * const (& imt)[mirror::Class::kImtSize],size_t pointer_size)1000 Class* Class::CopyOf(Thread* self, int32_t new_length,
1001                      ArtMethod* const (&imt)[mirror::Class::kImtSize], size_t pointer_size) {
1002   DCHECK_GE(new_length, static_cast<int32_t>(sizeof(Class)));
1003   // We may get copied by a compacting GC.
1004   StackHandleScope<1> hs(self);
1005   Handle<mirror::Class> h_this(hs.NewHandle(this));
1006   gc::Heap* heap = Runtime::Current()->GetHeap();
1007   // The num_bytes (3rd param) is sizeof(Class) as opposed to SizeOf()
1008   // to skip copying the tail part that we will overwrite here.
1009   CopyClassVisitor visitor(self, &h_this, new_length, sizeof(Class), imt, pointer_size);
1010   mirror::Object* new_class = kMovingClasses ?
1011       heap->AllocObject<true>(self, java_lang_Class_.Read(), new_length, visitor) :
1012       heap->AllocNonMovableObject<true>(self, java_lang_Class_.Read(), new_length, visitor);
1013   if (UNLIKELY(new_class == nullptr)) {
1014     self->AssertPendingOOMException();
1015     return nullptr;
1016   }
1017   return new_class->AsClass();
1018 }
1019 
ProxyDescriptorEquals(const char * match)1020 bool Class::ProxyDescriptorEquals(const char* match) {
1021   DCHECK(IsProxyClass());
1022   return Runtime::Current()->GetClassLinker()->GetDescriptorForProxy(this) == match;
1023 }
1024 
1025 // TODO: Move this to java_lang_Class.cc?
GetDeclaredConstructor(Thread * self,Handle<mirror::ObjectArray<mirror::Class>> args,size_t pointer_size)1026 ArtMethod* Class::GetDeclaredConstructor(
1027     Thread* self, Handle<mirror::ObjectArray<mirror::Class>> args, size_t pointer_size) {
1028   for (auto& m : GetDirectMethods(pointer_size)) {
1029     // Skip <clinit> which is a static constructor, as well as non constructors.
1030     if (m.IsStatic() || !m.IsConstructor()) {
1031       continue;
1032     }
1033     // May cause thread suspension and exceptions.
1034     if (m.GetInterfaceMethodIfProxy(sizeof(void*))->EqualParameters(args)) {
1035       return &m;
1036     }
1037     if (UNLIKELY(self->IsExceptionPending())) {
1038       return nullptr;
1039     }
1040   }
1041   return nullptr;
1042 }
1043 
Depth()1044 uint32_t Class::Depth() {
1045   uint32_t depth = 0;
1046   for (Class* klass = this; klass->GetSuperClass() != nullptr; klass = klass->GetSuperClass()) {
1047     depth++;
1048   }
1049   return depth;
1050 }
1051 
FindTypeIndexInOtherDexFile(const DexFile & dex_file)1052 uint32_t Class::FindTypeIndexInOtherDexFile(const DexFile& dex_file) {
1053   std::string temp;
1054   const DexFile::TypeId* type_id = dex_file.FindTypeId(GetDescriptor(&temp));
1055   return (type_id == nullptr) ? DexFile::kDexNoIndex : dex_file.GetIndexForTypeId(*type_id);
1056 }
1057 
1058 template <bool kTransactionActive>
GetDeclaredMethodInternal(Thread * self,mirror::Class * klass,mirror::String * name,mirror::ObjectArray<mirror::Class> * args)1059 mirror::Method* Class::GetDeclaredMethodInternal(Thread* self,
1060                                                  mirror::Class* klass,
1061                                                  mirror::String* name,
1062                                                  mirror::ObjectArray<mirror::Class>* args) {
1063   // Covariant return types permit the class to define multiple
1064   // methods with the same name and parameter types. Prefer to
1065   // return a non-synthetic method in such situations. We may
1066   // still return a synthetic method to handle situations like
1067   // escalated visibility. We never return miranda methods that
1068   // were synthesized by the runtime.
1069   constexpr uint32_t kSkipModifiers = kAccMiranda | kAccSynthetic;
1070   StackHandleScope<3> hs(self);
1071   auto h_method_name = hs.NewHandle(name);
1072   if (UNLIKELY(h_method_name.Get() == nullptr)) {
1073     ThrowNullPointerException("name == null");
1074     return nullptr;
1075   }
1076   auto h_args = hs.NewHandle(args);
1077   Handle<mirror::Class> h_klass = hs.NewHandle(klass);
1078   ArtMethod* result = nullptr;
1079   const size_t pointer_size = kTransactionActive
1080                                   ? Runtime::Current()->GetClassLinker()->GetImagePointerSize()
1081                                   : sizeof(void*);
1082   for (auto& m : h_klass->GetDeclaredVirtualMethods(pointer_size)) {
1083     auto* np_method = m.GetInterfaceMethodIfProxy(pointer_size);
1084     // May cause thread suspension.
1085     mirror::String* np_name = np_method->GetNameAsString(self);
1086     if (!np_name->Equals(h_method_name.Get()) || !np_method->EqualParameters(h_args)) {
1087       if (UNLIKELY(self->IsExceptionPending())) {
1088         return nullptr;
1089       }
1090       continue;
1091     }
1092     auto modifiers = m.GetAccessFlags();
1093     if ((modifiers & kSkipModifiers) == 0) {
1094       return mirror::Method::CreateFromArtMethod<kTransactionActive>(self, &m);
1095     }
1096     if ((modifiers & kAccMiranda) == 0) {
1097       result = &m;  // Remember as potential result if it's not a miranda method.
1098     }
1099   }
1100   if (result == nullptr) {
1101     for (auto& m : h_klass->GetDirectMethods(pointer_size)) {
1102       auto modifiers = m.GetAccessFlags();
1103       if ((modifiers & kAccConstructor) != 0) {
1104         continue;
1105       }
1106       auto* np_method = m.GetInterfaceMethodIfProxy(pointer_size);
1107       // May cause thread suspension.
1108       mirror::String* np_name = np_method->GetNameAsString(self);
1109       if (np_name == nullptr) {
1110         self->AssertPendingException();
1111         return nullptr;
1112       }
1113       if (!np_name->Equals(h_method_name.Get()) || !np_method->EqualParameters(h_args)) {
1114         if (UNLIKELY(self->IsExceptionPending())) {
1115           return nullptr;
1116         }
1117         continue;
1118       }
1119       if ((modifiers & kSkipModifiers) == 0) {
1120         return mirror::Method::CreateFromArtMethod<kTransactionActive>(self, &m);
1121       }
1122       // Direct methods cannot be miranda methods, so this potential result must be synthetic.
1123       result = &m;
1124     }
1125   }
1126   return result != nullptr
1127       ? mirror::Method::CreateFromArtMethod<kTransactionActive>(self, result)
1128       : nullptr;
1129 }
1130 
1131 template
1132 mirror::Method* Class::GetDeclaredMethodInternal<false>(Thread* self,
1133                                                         mirror::Class* klass,
1134                                                         mirror::String* name,
1135                                                         mirror::ObjectArray<mirror::Class>* args);
1136 template
1137 mirror::Method* Class::GetDeclaredMethodInternal<true>(Thread* self,
1138                                                        mirror::Class* klass,
1139                                                        mirror::String* name,
1140                                                        mirror::ObjectArray<mirror::Class>* args);
1141 
1142 template <bool kTransactionActive>
GetDeclaredConstructorInternal(Thread * self,mirror::Class * klass,mirror::ObjectArray<mirror::Class> * args)1143 mirror::Constructor* Class::GetDeclaredConstructorInternal(
1144     Thread* self,
1145     mirror::Class* klass,
1146     mirror::ObjectArray<mirror::Class>* args) {
1147   StackHandleScope<1> hs(self);
1148   const size_t pointer_size = kTransactionActive
1149                                   ? Runtime::Current()->GetClassLinker()->GetImagePointerSize()
1150                                   : sizeof(void*);
1151   ArtMethod* result = klass->GetDeclaredConstructor(self, hs.NewHandle(args), pointer_size);
1152   return result != nullptr
1153       ? mirror::Constructor::CreateFromArtMethod<kTransactionActive>(self, result)
1154       : nullptr;
1155 }
1156 
1157 // mirror::Constructor::CreateFromArtMethod<kTransactionActive>(self, result)
1158 
1159 template mirror::Constructor* Class::GetDeclaredConstructorInternal<false>(
1160     Thread* self,
1161     mirror::Class* klass,
1162     mirror::ObjectArray<mirror::Class>* args);
1163 template mirror::Constructor* Class::GetDeclaredConstructorInternal<true>(
1164     Thread* self,
1165     mirror::Class* klass,
1166     mirror::ObjectArray<mirror::Class>* args);
1167 
GetInnerClassFlags(Handle<Class> h_this,int32_t default_value)1168 int32_t Class::GetInnerClassFlags(Handle<Class> h_this, int32_t default_value) {
1169   if (h_this->IsProxyClass() || h_this->GetDexCache() == nullptr) {
1170     return default_value;
1171   }
1172   uint32_t flags;
1173   if (!h_this->GetDexFile().GetInnerClassFlags(h_this, &flags)) {
1174     return default_value;
1175   }
1176   return flags;
1177 }
1178 
1179 }  // namespace mirror
1180 }  // namespace art
1181