class.cc revision ef7d42fca18c16fbaf103822ad16f23246e2905d
12dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers/* 22dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Copyright (C) 2011 The Android Open Source Project 32dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * 42dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 52dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * you may not use this file except in compliance with the License. 62dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * You may obtain a copy of the License at 72dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * 82dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 92dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * 102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Unless required by applicable law or agreed to in writing, software 112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * See the License for the specific language governing permissions and 142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * limitations under the License. 152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers */ 162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class.h" 182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 19ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "art_field-inl.h" 20ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "art_method-inl.h" 212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class-inl.h" 222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class_linker.h" 232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class_loader.h" 242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "dex_cache.h" 254f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h" 261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/accounting/card_table-inl.h" 272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "object-inl.h" 282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "object_array-inl.h" 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "object_utils.h" 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "runtime.h" 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "sirt_ref.h" 322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "thread.h" 332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "throwable.h" 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "utils.h" 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "well_known_classes.h" 362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace art { 382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 402dd0e2cea360bc9206eb88ecc40d259e796c239dIan RogersClass* Class::java_lang_Class_ = NULL; 412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersvoid Class::SetClassClass(Class* java_lang_Class) { 432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK(java_lang_Class_ == NULL) << java_lang_Class_ << " " << java_lang_Class; 442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK(java_lang_Class != NULL); 452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers java_lang_Class_ = java_lang_Class; 462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersvoid Class::ResetClass() { 492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK(java_lang_Class_ != NULL); 502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers java_lang_Class_ = NULL; 512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 53c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartiervoid Class::VisitRoots(RootVisitor* visitor, void* arg) { 54c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier if (java_lang_Class_ != nullptr) { 55c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier java_lang_Class_ = down_cast<Class*>(visitor(java_lang_Class_, arg)); 56c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier } 57c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier} 58c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier 597dfb28c066159e6cde8181720f0c451a700ef966Ian Rogersvoid Class::SetStatus(Status new_status, Thread* self) { 607dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers Status old_status = GetStatus(); 61590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 62590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bool class_linker_initialized = class_linker != nullptr && class_linker->IsInitialized(); 637dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers if (LIKELY(class_linker_initialized)) { 647dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers if (UNLIKELY(new_status <= old_status && new_status != kStatusError)) { 658f3c9ae38df2460940a26dff889a84430b6c38d3Ian Rogers LOG(FATAL) << "Unexpected change back of class status for " << PrettyClass(this) << " " 667dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers << old_status << " -> " << new_status; 677dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers } 687dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers if (new_status >= kStatusResolved || old_status >= kStatusResolved) { 697dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers // When classes are being resolved the resolution code should hold the lock. 70d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers CHECK_EQ(GetLockOwnerThreadId(), self->GetThreadId()) 717dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers << "Attempt to change status of class while not holding its lock: " 727dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers << PrettyClass(this) << " " << old_status << " -> " << new_status; 738f3c9ae38df2460940a26dff889a84430b6c38d3Ian Rogers } 742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (new_status == kStatusError) { 768f3c9ae38df2460940a26dff889a84430b6c38d3Ian Rogers CHECK_NE(GetStatus(), kStatusError) 778f3c9ae38df2460940a26dff889a84430b6c38d3Ian Rogers << "Attempt to set as erroneous an already erroneous class " << PrettyClass(this); 782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers // Stash current exception. 8062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SirtRef<mirror::Object> old_throw_this_object(self, NULL); 81ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom SirtRef<mirror::ArtMethod> old_throw_method(self, NULL); 8262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SirtRef<mirror::Throwable> old_exception(self, NULL); 8362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers uint32_t old_throw_dex_pc; 8462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers { 8562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation old_throw_location; 8662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers mirror::Throwable* old_exception_obj = self->GetException(&old_throw_location); 8762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_throw_this_object.reset(old_throw_location.GetThis()); 8862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_throw_method.reset(old_throw_location.GetMethod()); 8962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_exception.reset(old_exception_obj); 9062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_throw_dex_pc = old_throw_location.GetDexPc(); 9162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->ClearException(); 9262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 9362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers CHECK(old_exception.get() != NULL); 942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // clear exception to call FindSystemClass 962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers self->ClearException(); 972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* eiie_class = class_linker->FindSystemClass("Ljava/lang/ExceptionInInitializerError;"); 992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK(!self->IsExceptionPending()); 1002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 10162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers // Only verification errors, not initialization problems, should set a verify error. 10262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers // This is to ensure that ThrowEarlierClassFailure will throw NoClassDefFoundError in that case. 10362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Class* exception_class = old_exception->GetClass(); 1042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (!eiie_class->IsAssignableFrom(exception_class)) { 1052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetVerifyErrorClass(exception_class); 1062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 10862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers // Restore exception. 10962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation gc_safe_throw_location(old_throw_this_object.get(), old_throw_method.get(), 11062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers old_throw_dex_pc); 11162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers 11262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetException(gc_safe_throw_location, old_exception.get()); 1132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1148f3c9ae38df2460940a26dff889a84430b6c38d3Ian Rogers CHECK(sizeof(Status) == sizeof(uint32_t)) << PrettyClass(this); 1157dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, status_), new_status, false); 1167dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers // Classes that are being resolved or initialized need to notify waiters that the class status 1177dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers // changed. See ClassLinker::EnsureResolved and ClassLinker::WaitForInitializeClass. 1187dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers if ((old_status >= kStatusResolved || new_status >= kStatusResolved) && 1197dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers class_linker_initialized) { 1207dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers NotifyAll(self); 1217dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers } 1222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersvoid Class::SetDexCache(DexCache* new_dex_cache) { 1252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetFieldObject(OFFSET_OF_OBJECT_MEMBER(Class, dex_cache_), new_dex_cache, false); 1262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 128ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersvoid Class::SetClassSize(uint32_t new_class_size) { 1298b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers if (kIsDebugBuild && (new_class_size < GetClassSize())) { 1308b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers DumpClass(LOG(ERROR), kDumpClassFullDetail); 1318b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers CHECK_GE(new_class_size, GetClassSize()) << " class=" << PrettyTypeOf(this); 1328b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers } 1332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, class_size_), new_class_size, false); 1342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// Return the class' name. The exact format is bizarre, but it's the specified behavior for 1372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// Class.getName: keywords for primitive types, regular "[I" form for primitive arrays (so "int" 1382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// but "[I"), and arrays of reference types written between "L" and ";" but with dots rather than 1392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// slashes (so "java.lang.String" but "[Ljava.lang.String;"). Madness. 1402dd0e2cea360bc9206eb88ecc40d259e796c239dIan RogersString* Class::ComputeName() { 1412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers String* name = GetName(); 142692fafd9778141fa6ef0048c9569abd7ee0253bfMathieu Chartier if (name != nullptr) { 1432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return name; 1442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 145692fafd9778141fa6ef0048c9569abd7ee0253bfMathieu Chartier Thread* self = Thread::Current(); 146692fafd9778141fa6ef0048c9569abd7ee0253bfMathieu Chartier SirtRef<mirror::Class> sirt_c(self, this); 147dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers std::string descriptor(ClassHelper(this).GetDescriptor()); 1482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if ((descriptor[0] != 'L') && (descriptor[0] != '[')) { 1492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // The descriptor indicates that this is the class for 1502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // a primitive type; special-case the return value. 1512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const char* c_name = NULL; 1522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers switch (descriptor[0]) { 1532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'Z': c_name = "boolean"; break; 1542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'B': c_name = "byte"; break; 1552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'C': c_name = "char"; break; 1562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'S': c_name = "short"; break; 1572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'I': c_name = "int"; break; 1582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'J': c_name = "long"; break; 1592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'F': c_name = "float"; break; 1602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'D': c_name = "double"; break; 1612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers case 'V': c_name = "void"; break; 1622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers default: 1632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers LOG(FATAL) << "Unknown primitive type: " << PrintableChar(descriptor[0]); 1642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 165692fafd9778141fa6ef0048c9569abd7ee0253bfMathieu Chartier name = String::AllocFromModifiedUtf8(self, c_name); 1662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 1672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Convert the UTF-8 name to a java.lang.String. The name must use '.' to separate package 1682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // components. 1692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (descriptor.size() > 2 && descriptor[0] == 'L' && descriptor[descriptor.size() - 1] == ';') { 1702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers descriptor.erase(0, 1); 1712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers descriptor.erase(descriptor.size() - 1); 1722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers std::replace(descriptor.begin(), descriptor.end(), '/', '.'); 174692fafd9778141fa6ef0048c9569abd7ee0253bfMathieu Chartier name = String::AllocFromModifiedUtf8(self, descriptor.c_str()); 1752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 176692fafd9778141fa6ef0048c9569abd7ee0253bfMathieu Chartier sirt_c->SetName(name); 1772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return name; 1782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 180ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersvoid Class::DumpClass(std::ostream& os, int flags) { 1812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if ((flags & kDumpClassFullDetail) == 0) { 1822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << PrettyClass(this); 1832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if ((flags & kDumpClassClassLoader) != 0) { 1842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << ' ' << GetClassLoader(); 1852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if ((flags & kDumpClassInitialized) != 0) { 1872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << ' ' << GetStatus(); 1882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << "\n"; 1902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return; 1912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* super = GetSuperClass(); 1942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers ClassHelper kh(this); 1952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << "----- " << (IsInterface() ? "interface" : "class") << " " 1962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers << "'" << kh.GetDescriptor() << "' cl=" << GetClassLoader() << " -----\n", 1972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " objectSize=" << SizeOf() << " " 1982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers << "(" << (super != NULL ? super->SizeOf() : -1) << " from super)\n", 1992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << StringPrintf(" access=0x%04x.%04x\n", 2002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers GetAccessFlags() >> 16, GetAccessFlags() & kAccJavaFlagsMask); 2012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (super != NULL) { 2022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " super='" << PrettyClass(super) << "' (cl=" << super->GetClassLoader() << ")\n"; 2032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (IsArrayClass()) { 2052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " componentType=" << PrettyClass(GetComponentType()) << "\n"; 2062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (kh.NumDirectInterfaces() > 0) { 2082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " interfaces (" << kh.NumDirectInterfaces() << "):\n"; 2092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < kh.NumDirectInterfaces(); ++i) { 2102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* interface = kh.GetDirectInterface(i); 2112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const ClassLoader* cl = interface->GetClassLoader(); 2122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << StringPrintf(" %2zd: %s (cl=%p)\n", i, PrettyClass(interface).c_str(), cl); 2132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " vtable (" << NumVirtualMethods() << " entries, " 2162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers << (super != NULL ? super->NumVirtualMethods() : 0) << " in super):\n"; 2172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumVirtualMethods(); ++i) { 2182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << StringPrintf(" %2zd: %s\n", i, PrettyMethod(GetVirtualMethodDuringLinking(i)).c_str()); 2192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " direct methods (" << NumDirectMethods() << " entries):\n"; 2212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumDirectMethods(); ++i) { 2222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << StringPrintf(" %2zd: %s\n", i, PrettyMethod(GetDirectMethod(i)).c_str()); 2232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (NumStaticFields() > 0) { 2252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " static fields (" << NumStaticFields() << " entries):\n"; 2262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (IsResolved() || IsErroneous()) { 2272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumStaticFields(); ++i) { 2282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << StringPrintf(" %2zd: %s\n", i, PrettyField(GetStaticField(i)).c_str()); 2292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 2312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " <not yet available>"; 2322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (NumInstanceFields() > 0) { 2352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " instance fields (" << NumInstanceFields() << " entries):\n"; 2362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (IsResolved() || IsErroneous()) { 2372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumInstanceFields(); ++i) { 2382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << StringPrintf(" %2zd: %s\n", i, PrettyField(GetInstanceField(i)).c_str()); 2392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 2412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers os << " <not yet available>"; 2422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersvoid Class::SetReferenceInstanceOffsets(uint32_t new_reference_offsets) { 2472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (new_reference_offsets != CLASS_WALK_SUPER) { 2482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Sanity check that the number of bits set in the reference offset bitmap 2492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // agrees with the number of references 2502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t count = 0; 2512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (Class* c = this; c != NULL; c = c->GetSuperClass()) { 2522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers count += c->NumReferenceInstanceFieldsDuringLinking(); 2532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_EQ((size_t)__builtin_popcount(new_reference_offsets), count); 2552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, reference_instance_offsets_), 2572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers new_reference_offsets, false); 2582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersvoid Class::SetReferenceStaticOffsets(uint32_t new_reference_offsets) { 2612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (new_reference_offsets != CLASS_WALK_SUPER) { 2622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Sanity check that the number of bits set in the reference offset bitmap 2632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // agrees with the number of references 2642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_EQ((size_t)__builtin_popcount(new_reference_offsets), 2652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers NumReferenceStaticFieldsDuringLinking()); 2662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, reference_static_offsets_), 2682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers new_reference_offsets, false); 2692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersbool Class::IsInSamePackage(const StringPiece& descriptor1, const StringPiece& descriptor2) { 2722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t i = 0; 2732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers while (descriptor1[i] != '\0' && descriptor1[i] == descriptor2[i]) { 2742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers ++i; 2752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (descriptor1.find('/', i) != StringPiece::npos || 2772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers descriptor2.find('/', i) != StringPiece::npos) { 2782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return false; 2792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 2802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return true; 2812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 284ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersbool Class::IsInSamePackage(Class* that) { 285ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers Class* klass1 = this; 286ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers Class* klass2 = that; 2872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (klass1 == klass2) { 2882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return true; 2892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Class loaders must match. 2912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (klass1->GetClassLoader() != klass2->GetClassLoader()) { 2922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return false; 2932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Arrays are in the same package when their element classes are. 2952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers while (klass1->IsArrayClass()) { 2962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers klass1 = klass1->GetComponentType(); 2972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers while (klass2->IsArrayClass()) { 2992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers klass2 = klass2->GetComponentType(); 3002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3019fa3f20c5fa101a4f55f123d817590b7cfbdbfc0Anwar Ghuloum // trivial check again for array types 3029fa3f20c5fa101a4f55f123d817590b7cfbdbfc0Anwar Ghuloum if (klass1 == klass2) { 3039fa3f20c5fa101a4f55f123d817590b7cfbdbfc0Anwar Ghuloum return true; 3049fa3f20c5fa101a4f55f123d817590b7cfbdbfc0Anwar Ghuloum } 3052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Compare the package part of the descriptor string. 306dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers return IsInSamePackage(ClassHelper(klass1).GetDescriptor(), 307dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers ClassHelper(klass2).GetDescriptor()); 3082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 310ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersbool Class::IsClassClass() { 3112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* java_lang_Class = GetClass()->GetClass(); 3122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return this == java_lang_Class; 3132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersbool Class::IsStringClass() const { 3162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return this == String::GetJavaLangString(); 3172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 319ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersbool Class::IsThrowableClass() { 3202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return WellKnownClasses::ToClass(WellKnownClasses::java_lang_Throwable)->IsAssignableFrom(this); 3212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 323ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersbool Class::IsArtFieldClass() { 3242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* java_lang_Class = GetClass(); 325ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom Class* java_lang_reflect_ArtField = java_lang_Class->GetInstanceField(0)->GetClass(); 326ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom return this == java_lang_reflect_ArtField; 3272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 329ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersbool Class::IsArtMethodClass() { 330ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom return this == ArtMethod::GetJavaLangReflectArtMethod(); 3312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersvoid Class::SetClassLoader(ClassLoader* new_class_loader) { 3342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetFieldObject(OFFSET_OF_OBJECT_MEMBER(Class, class_loader_), new_class_loader, false); 3352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 337ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindInterfaceMethod(const StringPiece& name, const Signature& signature) { 3382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Check the current class before checking the interfaces. 339ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = FindDeclaredVirtualMethod(name, signature); 3402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method != NULL) { 3412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 3422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers int32_t iftable_count = GetIfTableCount(); 3452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers IfTable* iftable = GetIfTable(); 3462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (int32_t i = 0; i < iftable_count; i++) { 3472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers method = iftable->GetInterface(i)->FindDeclaredVirtualMethod(name, signature); 3482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method != NULL) { 3492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 3502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 3532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 355ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindInterfaceMethod(const DexCache* dex_cache, uint32_t dex_method_idx) { 3562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Check the current class before checking the interfaces. 357ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = FindDeclaredVirtualMethod(dex_cache, dex_method_idx); 3582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method != NULL) { 3592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 3602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers int32_t iftable_count = GetIfTableCount(); 3632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers IfTable* iftable = GetIfTable(); 3642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (int32_t i = 0; i < iftable_count; i++) { 3652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers method = iftable->GetInterface(i)->FindDeclaredVirtualMethod(dex_cache, dex_method_idx); 3662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method != NULL) { 3672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 3682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 3712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 373ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindDeclaredDirectMethod(const StringPiece& name, const StringPiece& signature) { 3742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers MethodHelper mh; 3752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumDirectMethods(); ++i) { 376ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = GetDirectMethod(i); 3772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mh.ChangeMethod(method); 378dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers if (name == mh.GetName() && mh.GetSignature() == signature) { 379d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return method; 380d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 381d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 382d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return NULL; 383d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers} 384d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers 385ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindDeclaredDirectMethod(const StringPiece& name, const Signature& signature) { 386d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers MethodHelper mh; 387d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers for (size_t i = 0; i < NumDirectMethods(); ++i) { 388d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers ArtMethod* method = GetDirectMethod(i); 389d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers mh.ChangeMethod(method); 390dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers if (name == mh.GetName() && signature == mh.GetSignature()) { 3912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 3922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 3952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 397ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindDeclaredDirectMethod(const DexCache* dex_cache, uint32_t dex_method_idx) { 3982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (GetDexCache() == dex_cache) { 3992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumDirectMethods(); ++i) { 400ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = GetDirectMethod(i); 4012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method->GetDexMethodIndex() == dex_method_idx) { 4022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 4032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 4072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 4082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 409ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindDirectMethod(const StringPiece& name, const StringPiece& signature) { 410ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers for (Class* klass = this; klass != NULL; klass = klass->GetSuperClass()) { 411ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = klass->FindDeclaredDirectMethod(name, signature); 4122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method != NULL) { 4132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 4142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 4172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 4182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 419ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindDirectMethod(const StringPiece& name, const Signature& signature) { 420ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers for (Class* klass = this; klass != NULL; klass = klass->GetSuperClass()) { 421d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers ArtMethod* method = klass->FindDeclaredDirectMethod(name, signature); 422d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers if (method != NULL) { 423d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return method; 424d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 425d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 426d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return NULL; 427d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers} 428d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers 429ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindDirectMethod(const DexCache* dex_cache, uint32_t dex_method_idx) { 430ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers for (Class* klass = this; klass != NULL; klass = klass->GetSuperClass()) { 431ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = klass->FindDeclaredDirectMethod(dex_cache, dex_method_idx); 4322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method != NULL) { 4332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 4342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 4372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 4382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 439ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindDeclaredVirtualMethod(const StringPiece& name, const StringPiece& signature) { 440d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers MethodHelper mh; 441d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers for (size_t i = 0; i < NumVirtualMethods(); ++i) { 442d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers ArtMethod* method = GetVirtualMethod(i); 443d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers mh.ChangeMethod(method); 444dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers if (name == mh.GetName() && mh.GetSignature() == signature) { 445d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return method; 446d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 447d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 448d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return NULL; 449d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers} 450d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers 451ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtMethod* Class::FindDeclaredVirtualMethod(const StringPiece& name, 452ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const Signature& signature) { 4532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers MethodHelper mh; 4542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumVirtualMethods(); ++i) { 455ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = GetVirtualMethod(i); 4562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mh.ChangeMethod(method); 457dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers if (name == mh.GetName() && signature == mh.GetSignature()) { 4582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 4592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 4622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 4632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 464ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindDeclaredVirtualMethod(const DexCache* dex_cache, uint32_t dex_method_idx) { 4652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (GetDexCache() == dex_cache) { 4662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumVirtualMethods(); ++i) { 467ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = GetVirtualMethod(i); 4682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method->GetDexMethodIndex() == dex_method_idx) { 4692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 4702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 4742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 4752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 476ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindVirtualMethod(const StringPiece& name, const StringPiece& signature) { 477ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers for (Class* klass = this; klass != NULL; klass = klass->GetSuperClass()) { 478ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = klass->FindDeclaredVirtualMethod(name, signature); 4792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method != NULL) { 4802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 4812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 4842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 4852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 486ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindVirtualMethod(const StringPiece& name, const Signature& signature) { 487ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers for (Class* klass = this; klass != NULL; klass = klass->GetSuperClass()) { 488d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers ArtMethod* method = klass->FindDeclaredVirtualMethod(name, signature); 489d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers if (method != NULL) { 490d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return method; 491d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 492d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 493d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return NULL; 494d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers} 495d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers 496ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindVirtualMethod(const DexCache* dex_cache, uint32_t dex_method_idx) { 497ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers for (Class* klass = this; klass != NULL; klass = klass->GetSuperClass()) { 498ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* method = klass->FindDeclaredVirtualMethod(dex_cache, dex_method_idx); 4992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (method != NULL) { 5002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return method; 5012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 502d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 503d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return NULL; 504d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers} 505d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers 506ef7d42fca18c16fbaf103822ad16f23246e2905dIan RogersArtMethod* Class::FindClassInitializer() { 507d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers for (size_t i = 0; i < NumDirectMethods(); ++i) { 508d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers ArtMethod* method = GetDirectMethod(i); 509d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers if (method->IsConstructor() && method->IsStatic()) { 510d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers if (kIsDebugBuild) { 511d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers MethodHelper mh(method); 512241b5de2d3cf06868ac31f1153aa0b32ddb07b20Ian Rogers CHECK(mh.IsClassInitializer()); 513d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers CHECK_STREQ(mh.GetName(), "<clinit>"); 514d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers CHECK_STREQ(mh.GetSignature().ToString().c_str(), "()V"); 515d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 516d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers return method; 517d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers } 5182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 5202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 5212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 522ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindDeclaredInstanceField(const StringPiece& name, const StringPiece& type) { 5232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is the field in this class? 5242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Interfaces are not relevant because they can't contain instance fields. 5252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers FieldHelper fh; 5262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumInstanceFields(); ++i) { 527ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = GetInstanceField(i); 5282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers fh.ChangeField(f); 529dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers if (name == fh.GetName() && type == fh.GetTypeDescriptor()) { 5302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 5312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 5342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 5352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 536ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindDeclaredInstanceField(const DexCache* dex_cache, uint32_t dex_field_idx) { 5372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (GetDexCache() == dex_cache) { 5382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumInstanceFields(); ++i) { 539ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = GetInstanceField(i); 5402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f->GetDexFieldIndex() == dex_field_idx) { 5412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 5422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 5462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 5472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 548ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindInstanceField(const StringPiece& name, const StringPiece& type) { 5492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is the field in this class, or any of its superclasses? 5502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Interfaces are not relevant because they can't contain instance fields. 5512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (Class* c = this; c != NULL; c = c->GetSuperClass()) { 552ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = c->FindDeclaredInstanceField(name, type); 5532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 5542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 5552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 5582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 5592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 560ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindInstanceField(const DexCache* dex_cache, uint32_t dex_field_idx) { 5612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is the field in this class, or any of its superclasses? 5622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Interfaces are not relevant because they can't contain instance fields. 5632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (Class* c = this; c != NULL; c = c->GetSuperClass()) { 564ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = c->FindDeclaredInstanceField(dex_cache, dex_field_idx); 5652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 5662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 5672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 5702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 5712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 572ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindDeclaredStaticField(const StringPiece& name, const StringPiece& type) { 5732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(type != NULL); 5742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers FieldHelper fh; 5752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumStaticFields(); ++i) { 576ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = GetStaticField(i); 5772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers fh.ChangeField(f); 578dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers if (name == fh.GetName() && type == fh.GetTypeDescriptor()) { 5792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 5802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 5832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 5842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 585ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindDeclaredStaticField(const DexCache* dex_cache, uint32_t dex_field_idx) { 5862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (dex_cache == GetDexCache()) { 5872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (size_t i = 0; i < NumStaticFields(); ++i) { 588ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = GetStaticField(i); 5892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f->GetDexFieldIndex() == dex_field_idx) { 5902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 5912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 5952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 5962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 597ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindStaticField(const StringPiece& name, const StringPiece& type) { 5982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is the field in this class (or its interfaces), or any of its 5992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // superclasses (or their interfaces)? 6002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (Class* k = this; k != NULL; k = k->GetSuperClass()) { 6012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is the field in this class? 602ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = k->FindDeclaredStaticField(name, type); 6032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 6042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 6052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is this field in any of this class' interfaces? 607590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ClassHelper kh(k); 6082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (uint32_t i = 0; i < kh.NumDirectInterfaces(); ++i) { 6092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* interface = kh.GetDirectInterface(i); 6102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers f = interface->FindStaticField(name, type); 6112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 6122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 6132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 6172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 6182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 619ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindStaticField(const DexCache* dex_cache, uint32_t dex_field_idx) { 6202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (Class* k = this; k != NULL; k = k->GetSuperClass()) { 6212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is the field in this class? 622ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = k->FindDeclaredStaticField(dex_cache, dex_field_idx); 6232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 6242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 6252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is this field in any of this class' interfaces? 627590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ClassHelper kh(k); 6282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (uint32_t i = 0; i < kh.NumDirectInterfaces(); ++i) { 6292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* interface = kh.GetDirectInterface(i); 6302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers f = interface->FindStaticField(dex_cache, dex_field_idx); 6312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 6322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 6332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 6372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 6382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 639ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromArtField* Class::FindField(const StringPiece& name, const StringPiece& type) { 6402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Find a field using the JLS field resolution order 6412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (Class* k = this; k != NULL; k = k->GetSuperClass()) { 6422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is the field in this class? 643ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* f = k->FindDeclaredInstanceField(name, type); 6442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 6452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 6462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers f = k->FindDeclaredStaticField(name, type); 6482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 6492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 6502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Is this field in any of this class' interfaces? 652590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ClassHelper kh(k); 6532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (uint32_t i = 0; i < kh.NumDirectInterfaces(); ++i) { 6542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* interface = kh.GetDirectInterface(i); 6552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers f = interface->FindStaticField(name, type); 6562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (f != NULL) { 6572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return f; 6582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return NULL; 6622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 6632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 664ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromstatic void SetPreverifiedFlagOnMethods(mirror::ObjectArray<mirror::ArtMethod>* methods) 665233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 666233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz if (methods != NULL) { 667233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz for (int32_t index = 0, end = methods->GetLength(); index < end; ++index) { 668ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtMethod* method = methods->GetWithoutChecks(index); 669233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DCHECK(method != NULL); 6701eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers if (!method->IsNative() && !method->IsAbstract()) { 6711eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers method->SetPreverified(); 6721eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers } 673233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } 674233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } 675233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz} 676233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 677233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzvoid Class::SetPreverifiedFlagOnAllMethods() { 678233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DCHECK(IsVerified()); 679233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz SetPreverifiedFlagOnMethods(GetDirectMethods()); 680233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz SetPreverifiedFlagOnMethods(GetVirtualMethods()); 681233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz} 682233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 6832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 6842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace art 685