class_linker.h revision 42ef8ab151a3d0cbb42cb43f6841c3708d65fca3
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#ifndef ART_RUNTIME_CLASS_LINKER_H_ 18#define ART_RUNTIME_CLASS_LINKER_H_ 19 20#include <string> 21#include <unordered_map> 22#include <utility> 23#include <vector> 24 25#include "base/allocator.h" 26#include "base/hash_set.h" 27#include "base/macros.h" 28#include "base/mutex.h" 29#include "class_table.h" 30#include "dex_file.h" 31#include "gc_root.h" 32#include "jni.h" 33#include "oat_file.h" 34#include "object_callbacks.h" 35 36namespace art { 37 38namespace gc { 39namespace space { 40 class ImageSpace; 41} // namespace space 42} // namespace gc 43namespace mirror { 44 class ClassLoader; 45 class DexCache; 46 class DexCachePointerArray; 47 class DexCacheTest_Open_Test; 48 class IfTable; 49 template<class T> class ObjectArray; 50 class StackTraceElement; 51} // namespace mirror 52 53template<class T> class Handle; 54template<class T> class MutableHandle; 55class InternTable; 56template<class T> class ObjectLock; 57class Runtime; 58class ScopedObjectAccessAlreadyRunnable; 59template<size_t kNumReferences> class PACKED(4) StackHandleScope; 60 61enum VisitRootFlags : uint8_t; 62 63class ClassLoaderVisitor { 64 public: 65 virtual ~ClassLoaderVisitor() {} 66 virtual void Visit(mirror::ClassLoader* class_loader) 67 SHARED_REQUIRES(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0; 68}; 69 70class ClassLinker { 71 public: 72 // Well known mirror::Class roots accessed via GetClassRoot. 73 enum ClassRoot { 74 kJavaLangClass, 75 kJavaLangObject, 76 kClassArrayClass, 77 kObjectArrayClass, 78 kJavaLangString, 79 kJavaLangDexCache, 80 kJavaLangRefReference, 81 kJavaLangReflectConstructor, 82 kJavaLangReflectField, 83 kJavaLangReflectMethod, 84 kJavaLangReflectProxy, 85 kJavaLangStringArrayClass, 86 kJavaLangReflectConstructorArrayClass, 87 kJavaLangReflectFieldArrayClass, 88 kJavaLangReflectMethodArrayClass, 89 kJavaLangClassLoader, 90 kJavaLangThrowable, 91 kJavaLangClassNotFoundException, 92 kJavaLangStackTraceElement, 93 kPrimitiveBoolean, 94 kPrimitiveByte, 95 kPrimitiveChar, 96 kPrimitiveDouble, 97 kPrimitiveFloat, 98 kPrimitiveInt, 99 kPrimitiveLong, 100 kPrimitiveShort, 101 kPrimitiveVoid, 102 kBooleanArrayClass, 103 kByteArrayClass, 104 kCharArrayClass, 105 kDoubleArrayClass, 106 kFloatArrayClass, 107 kIntArrayClass, 108 kLongArrayClass, 109 kShortArrayClass, 110 kJavaLangStackTraceElementArrayClass, 111 kClassRootsMax, 112 }; 113 114 explicit ClassLinker(InternTable* intern_table); 115 ~ClassLinker(); 116 117 // Initialize class linker by bootstraping from dex files. 118 bool InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path, 119 std::string* error_msg) 120 SHARED_REQUIRES(Locks::mutator_lock_) 121 REQUIRES(!dex_lock_); 122 123 // Initialize class linker from one or more images. 124 bool InitFromImage(std::string* error_msg) 125 SHARED_REQUIRES(Locks::mutator_lock_) 126 REQUIRES(!dex_lock_); 127 128 // Finds a class by its descriptor, loading it if necessary. 129 // If class_loader is null, searches boot_class_path_. 130 mirror::Class* FindClass(Thread* self, 131 const char* descriptor, 132 Handle<mirror::ClassLoader> class_loader) 133 SHARED_REQUIRES(Locks::mutator_lock_) 134 REQUIRES(!dex_lock_); 135 136 // Finds a class in the path class loader, loading it if necessary without using JNI. Hash 137 // function is supposed to be ComputeModifiedUtf8Hash(descriptor). Returns true if the 138 // class-loader chain could be handled, false otherwise, i.e., a non-supported class-loader 139 // was encountered while walking the parent chain (currently only BootClassLoader and 140 // PathClassLoader are supported). 141 bool FindClassInPathClassLoader(ScopedObjectAccessAlreadyRunnable& soa, 142 Thread* self, 143 const char* descriptor, 144 size_t hash, 145 Handle<mirror::ClassLoader> class_loader, 146 mirror::Class** result) 147 SHARED_REQUIRES(Locks::mutator_lock_) 148 REQUIRES(!dex_lock_); 149 150 // Finds a class by its descriptor using the "system" class loader, ie by searching the 151 // boot_class_path_. 152 mirror::Class* FindSystemClass(Thread* self, const char* descriptor) 153 SHARED_REQUIRES(Locks::mutator_lock_) 154 REQUIRES(!dex_lock_); 155 156 // Finds the array class given for the element class. 157 mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class) 158 SHARED_REQUIRES(Locks::mutator_lock_) 159 REQUIRES(!dex_lock_); 160 161 // Returns true if the class linker is initialized. 162 bool IsInitialized() const { 163 return init_done_; 164 } 165 166 // Define a new a class based on a ClassDef from a DexFile 167 mirror::Class* DefineClass(Thread* self, 168 const char* descriptor, 169 size_t hash, 170 Handle<mirror::ClassLoader> class_loader, 171 const DexFile& dex_file, 172 const DexFile::ClassDef& dex_class_def) 173 SHARED_REQUIRES(Locks::mutator_lock_) 174 REQUIRES(!dex_lock_); 175 176 // Finds a class by its descriptor, returning null if it isn't wasn't loaded 177 // by the given 'class_loader'. 178 mirror::Class* LookupClass(Thread* self, 179 const char* descriptor, 180 size_t hash, 181 mirror::ClassLoader* class_loader) 182 REQUIRES(!Locks::classlinker_classes_lock_) 183 SHARED_REQUIRES(Locks::mutator_lock_); 184 185 // Finds all the classes with the given descriptor, regardless of ClassLoader. 186 void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes) 187 REQUIRES(!Locks::classlinker_classes_lock_) 188 SHARED_REQUIRES(Locks::mutator_lock_); 189 190 mirror::Class* FindPrimitiveClass(char type) SHARED_REQUIRES(Locks::mutator_lock_); 191 192 // General class unloading is not supported, this is used to prune 193 // unwanted classes during image writing. 194 bool RemoveClass(const char* descriptor, mirror::ClassLoader* class_loader) 195 REQUIRES(!Locks::classlinker_classes_lock_) 196 SHARED_REQUIRES(Locks::mutator_lock_); 197 198 void DumpAllClasses(int flags) 199 REQUIRES(!Locks::classlinker_classes_lock_) 200 SHARED_REQUIRES(Locks::mutator_lock_); 201 202 void DumpForSigQuit(std::ostream& os) REQUIRES(!Locks::classlinker_classes_lock_); 203 204 size_t NumLoadedClasses() 205 REQUIRES(!Locks::classlinker_classes_lock_) 206 SHARED_REQUIRES(Locks::mutator_lock_); 207 208 // Resolve a String with the given index from the DexFile, storing the 209 // result in the DexCache. The referrer is used to identify the 210 // target DexCache and ClassLoader to use for resolution. 211 mirror::String* ResolveString(uint32_t string_idx, ArtMethod* referrer) 212 SHARED_REQUIRES(Locks::mutator_lock_); 213 214 // Resolve a String with the given index from the DexFile, storing the 215 // result in the DexCache. 216 mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx, 217 Handle<mirror::DexCache> dex_cache) 218 SHARED_REQUIRES(Locks::mutator_lock_); 219 220 // Resolve a Type with the given index from the DexFile, storing the 221 // result in the DexCache. The referrer is used to identity the 222 // target DexCache and ClassLoader to use for resolution. 223 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer) 224 SHARED_REQUIRES(Locks::mutator_lock_) 225 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 226 227 // Resolve a Type with the given index from the DexFile, storing the 228 // result in the DexCache. The referrer is used to identify the 229 // target DexCache and ClassLoader to use for resolution. 230 mirror::Class* ResolveType(uint16_t type_idx, ArtMethod* referrer) 231 SHARED_REQUIRES(Locks::mutator_lock_) 232 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 233 234 mirror::Class* ResolveType(uint16_t type_idx, ArtField* referrer) 235 SHARED_REQUIRES(Locks::mutator_lock_) 236 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 237 238 // Resolve a type with the given ID from the DexFile, storing the 239 // result in DexCache. The ClassLoader is used to search for the 240 // type, since it may be referenced from but not contained within 241 // the given DexFile. 242 mirror::Class* ResolveType(const DexFile& dex_file, 243 uint16_t type_idx, 244 Handle<mirror::DexCache> dex_cache, 245 Handle<mirror::ClassLoader> class_loader) 246 SHARED_REQUIRES(Locks::mutator_lock_) 247 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 248 249 // Determine whether a dex cache result should be trusted, or an IncompatibleClassChangeError 250 // check should be performed even after a hit. 251 enum ResolveMode { // private. 252 kNoICCECheckForCache, 253 kForceICCECheck 254 }; 255 256 // Resolve a method with a given ID from the DexFile, storing the 257 // result in DexCache. The ClassLinker and ClassLoader are used as 258 // in ResolveType. What is unique is the method type argument which 259 // is used to determine if this method is a direct, static, or 260 // virtual method. 261 template <ResolveMode kResolveMode> 262 ArtMethod* ResolveMethod(const DexFile& dex_file, 263 uint32_t method_idx, 264 Handle<mirror::DexCache> dex_cache, 265 Handle<mirror::ClassLoader> class_loader, 266 ArtMethod* referrer, 267 InvokeType type) 268 SHARED_REQUIRES(Locks::mutator_lock_) 269 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 270 271 ArtMethod* GetResolvedMethod(uint32_t method_idx, ArtMethod* referrer) 272 SHARED_REQUIRES(Locks::mutator_lock_); 273 template <ResolveMode kResolveMode> 274 ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, ArtMethod* referrer, InvokeType type) 275 SHARED_REQUIRES(Locks::mutator_lock_) 276 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 277 ArtMethod* ResolveMethodWithoutInvokeType(const DexFile& dex_file, 278 uint32_t method_idx, 279 Handle<mirror::DexCache> dex_cache, 280 Handle<mirror::ClassLoader> class_loader) 281 SHARED_REQUIRES(Locks::mutator_lock_) 282 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 283 284 ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class) 285 SHARED_REQUIRES(Locks::mutator_lock_); 286 ArtField* GetResolvedField(uint32_t field_idx, mirror::DexCache* dex_cache) 287 SHARED_REQUIRES(Locks::mutator_lock_); 288 ArtField* ResolveField(uint32_t field_idx, ArtMethod* referrer, bool is_static) 289 SHARED_REQUIRES(Locks::mutator_lock_) 290 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 291 292 // Resolve a field with a given ID from the DexFile, storing the 293 // result in DexCache. The ClassLinker and ClassLoader are used as 294 // in ResolveType. What is unique is the is_static argument which is 295 // used to determine if we are resolving a static or non-static 296 // field. 297 ArtField* ResolveField(const DexFile& dex_file, uint32_t field_idx, 298 Handle<mirror::DexCache> dex_cache, 299 Handle<mirror::ClassLoader> class_loader, bool is_static) 300 SHARED_REQUIRES(Locks::mutator_lock_) 301 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 302 303 // Resolve a field with a given ID from the DexFile, storing the 304 // result in DexCache. The ClassLinker and ClassLoader are used as 305 // in ResolveType. No is_static argument is provided so that Java 306 // field resolution semantics are followed. 307 ArtField* ResolveFieldJLS(const DexFile& dex_file, 308 uint32_t field_idx, 309 Handle<mirror::DexCache> dex_cache, 310 Handle<mirror::ClassLoader> class_loader) 311 SHARED_REQUIRES(Locks::mutator_lock_) 312 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 313 314 // Get shorty from method index without resolution. Used to do handlerization. 315 const char* MethodShorty(uint32_t method_idx, ArtMethod* referrer, uint32_t* length) 316 SHARED_REQUIRES(Locks::mutator_lock_); 317 318 // Returns true on success, false if there's an exception pending. 319 // can_run_clinit=false allows the compiler to attempt to init a class, 320 // given the restriction that no <clinit> execution is possible. 321 bool EnsureInitialized(Thread* self, 322 Handle<mirror::Class> c, 323 bool can_init_fields, 324 bool can_init_parents) 325 SHARED_REQUIRES(Locks::mutator_lock_) 326 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 327 328 // Initializes classes that have instances in the image but that have 329 // <clinit> methods so they could not be initialized by the compiler. 330 void RunRootClinits() 331 SHARED_REQUIRES(Locks::mutator_lock_) 332 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 333 334 mirror::DexCache* RegisterDexFile(const DexFile& dex_file, LinearAlloc* linear_alloc) 335 REQUIRES(!dex_lock_) 336 SHARED_REQUIRES(Locks::mutator_lock_); 337 void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 338 REQUIRES(!dex_lock_) 339 SHARED_REQUIRES(Locks::mutator_lock_); 340 341 const std::vector<const DexFile*>& GetBootClassPath() { 342 return boot_class_path_; 343 } 344 345 void VisitClasses(ClassVisitor* visitor) 346 REQUIRES(!Locks::classlinker_classes_lock_) 347 SHARED_REQUIRES(Locks::mutator_lock_); 348 349 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage 350 // so that it can visit individual classes without holding the doesn't hold the 351 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code 352 // can race with insertion and deletion of classes while the visitor is being called. 353 void VisitClassesWithoutClassesLock(ClassVisitor* visitor) 354 SHARED_REQUIRES(Locks::mutator_lock_) 355 REQUIRES(!dex_lock_); 356 357 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags) 358 REQUIRES(!Locks::classlinker_classes_lock_) 359 SHARED_REQUIRES(Locks::mutator_lock_); 360 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags) 361 REQUIRES(!dex_lock_) 362 SHARED_REQUIRES(Locks::mutator_lock_); 363 364 mirror::DexCache* FindDexCache(Thread* self, 365 const DexFile& dex_file, 366 bool allow_failure = false) 367 REQUIRES(!dex_lock_) 368 SHARED_REQUIRES(Locks::mutator_lock_); 369 void FixupDexCaches(ArtMethod* resolution_method) 370 REQUIRES(!dex_lock_) 371 SHARED_REQUIRES(Locks::mutator_lock_); 372 373 // Allocate an instance of a java.lang.Object. 374 mirror::Object* AllocObject(Thread* self) 375 SHARED_REQUIRES(Locks::mutator_lock_) 376 REQUIRES(!Roles::uninterruptible_); 377 378 // TODO: replace this with multiple methods that allocate the correct managed type. 379 template <class T> 380 mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length) 381 SHARED_REQUIRES(Locks::mutator_lock_) 382 REQUIRES(!Roles::uninterruptible_); 383 384 mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length) 385 SHARED_REQUIRES(Locks::mutator_lock_) 386 REQUIRES(!Roles::uninterruptible_); 387 388 mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length) 389 SHARED_REQUIRES(Locks::mutator_lock_) 390 REQUIRES(!Roles::uninterruptible_); 391 392 LengthPrefixedArray<ArtField>* AllocArtFieldArray(Thread* self, 393 LinearAlloc* allocator, 394 size_t length); 395 396 LengthPrefixedArray<ArtMethod>* AllocArtMethodArray(Thread* self, 397 LinearAlloc* allocator, 398 size_t length); 399 400 mirror::PointerArray* AllocPointerArray(Thread* self, size_t length) 401 SHARED_REQUIRES(Locks::mutator_lock_) 402 REQUIRES(!Roles::uninterruptible_); 403 404 mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount) 405 SHARED_REQUIRES(Locks::mutator_lock_) 406 REQUIRES(!Roles::uninterruptible_); 407 408 mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self, 409 size_t length) 410 SHARED_REQUIRES(Locks::mutator_lock_) 411 REQUIRES(!Roles::uninterruptible_); 412 413 void VerifyClass(Thread* self, Handle<mirror::Class> klass) 414 SHARED_REQUIRES(Locks::mutator_lock_) 415 REQUIRES(!dex_lock_); 416 bool VerifyClassUsingOatFile(const DexFile& dex_file, 417 mirror::Class* klass, 418 mirror::Class::Status& oat_file_class_status) 419 SHARED_REQUIRES(Locks::mutator_lock_) 420 REQUIRES(!dex_lock_); 421 void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, 422 Handle<mirror::Class> klass) 423 SHARED_REQUIRES(Locks::mutator_lock_) 424 REQUIRES(!dex_lock_); 425 void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, ArtMethod* klass) 426 SHARED_REQUIRES(Locks::mutator_lock_) 427 REQUIRES(!dex_lock_); 428 429 mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, 430 jstring name, 431 jobjectArray interfaces, 432 jobject loader, 433 jobjectArray methods, 434 jobjectArray throws) 435 SHARED_REQUIRES(Locks::mutator_lock_); 436 std::string GetDescriptorForProxy(mirror::Class* proxy_class) 437 SHARED_REQUIRES(Locks::mutator_lock_); 438 ArtMethod* FindMethodForProxy(mirror::Class* proxy_class, ArtMethod* proxy_method) 439 REQUIRES(!dex_lock_) 440 SHARED_REQUIRES(Locks::mutator_lock_); 441 442 // Get the oat code for a method when its class isn't yet initialized 443 const void* GetQuickOatCodeFor(ArtMethod* method) 444 SHARED_REQUIRES(Locks::mutator_lock_); 445 446 // Get the oat code for a method from a method index. 447 const void* GetQuickOatCodeFor(const DexFile& dex_file, 448 uint16_t class_def_idx, 449 uint32_t method_idx) 450 SHARED_REQUIRES(Locks::mutator_lock_); 451 452 // Get compiled code for a method, return null if no code 453 // exists. This is unlike Get..OatCodeFor which will return a bridge 454 // or interpreter entrypoint. 455 const void* GetOatMethodQuickCodeFor(ArtMethod* method) 456 SHARED_REQUIRES(Locks::mutator_lock_); 457 458 const OatFile::OatMethod FindOatMethodFor(ArtMethod* method, bool* found) 459 SHARED_REQUIRES(Locks::mutator_lock_); 460 461 pid_t GetClassesLockOwner(); // For SignalCatcher. 462 pid_t GetDexLockOwner(); // For SignalCatcher. 463 464 mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_REQUIRES(Locks::mutator_lock_); 465 466 static const char* GetClassRootDescriptor(ClassRoot class_root); 467 468 // Is the given entry point quick code to run the resolution stub? 469 bool IsQuickResolutionStub(const void* entry_point) const; 470 471 // Is the given entry point quick code to bridge into the interpreter? 472 bool IsQuickToInterpreterBridge(const void* entry_point) const; 473 474 // Is the given entry point quick code to run the generic JNI stub? 475 bool IsQuickGenericJniStub(const void* entry_point) const; 476 477 InternTable* GetInternTable() const { 478 return intern_table_; 479 } 480 481 // Set the entrypoints up for method to the given code. 482 void SetEntryPointsToCompiledCode(ArtMethod* method, const void* method_code) const 483 SHARED_REQUIRES(Locks::mutator_lock_); 484 485 // Set the entrypoints up for method to the enter the interpreter. 486 void SetEntryPointsToInterpreter(ArtMethod* method) const 487 SHARED_REQUIRES(Locks::mutator_lock_); 488 489 // Attempts to insert a class into a class table. Returns null if 490 // the class was inserted, otherwise returns an existing class with 491 // the same descriptor and ClassLoader. 492 mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash) 493 REQUIRES(!Locks::classlinker_classes_lock_) 494 SHARED_REQUIRES(Locks::mutator_lock_); 495 496 mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_REQUIRES(Locks::mutator_lock_) { 497 mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read(); 498 DCHECK(class_roots != nullptr); 499 return class_roots; 500 } 501 502 // Move all of the boot image classes into the class table for faster lookups. 503 void AddBootImageClassesToClassTable() 504 REQUIRES(!Locks::classlinker_classes_lock_) 505 SHARED_REQUIRES(Locks::mutator_lock_); 506 507 // Add image classes to the class table. 508 void AddImageClassesToClassTable(gc::space::ImageSpace* image_space, 509 mirror::ClassLoader* class_loader) 510 REQUIRES(!Locks::classlinker_classes_lock_) 511 SHARED_REQUIRES(Locks::mutator_lock_); 512 513 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring 514 // that no more classes are ever added to the pre zygote table which makes it that the pages 515 // always remain shared dirty instead of private dirty. 516 void MoveClassTableToPreZygote() 517 REQUIRES(!Locks::classlinker_classes_lock_) 518 SHARED_REQUIRES(Locks::mutator_lock_); 519 520 // Returns true if the method can be called with its direct code pointer, false otherwise. 521 bool MayBeCalledWithDirectCodePointer(ArtMethod* m) 522 SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!dex_lock_); 523 524 // Creates a GlobalRef PathClassLoader that can be used to load classes from the given dex files. 525 // Note: the objects are not completely set up. Do not use this outside of tests and the compiler. 526 // If parent_loader is null then we use the boot class loader. 527 jobject CreatePathClassLoader(Thread* self, 528 std::vector<const DexFile*>& dex_files, 529 jobject parent_loader) 530 SHARED_REQUIRES(Locks::mutator_lock_) 531 REQUIRES(!dex_lock_); 532 533 size_t GetImagePointerSize() const { 534 DCHECK(ValidPointerSize(image_pointer_size_)) << image_pointer_size_; 535 return image_pointer_size_; 536 } 537 538 // Used by image writer for checking. 539 bool ClassInClassTable(mirror::Class* klass) 540 REQUIRES(Locks::classlinker_classes_lock_) 541 SHARED_REQUIRES(Locks::mutator_lock_); 542 543 ArtMethod* CreateRuntimeMethod(); 544 545 // Clear the ArrayClass cache. This is necessary when cleaning up for the image, as the cache 546 // entries are roots, but potentially not image classes. 547 void DropFindArrayClassCache() SHARED_REQUIRES(Locks::mutator_lock_); 548 549 // Clean up class loaders, this needs to happen after JNI weak globals are cleared. 550 void CleanupClassLoaders() 551 REQUIRES(!Locks::classlinker_classes_lock_) 552 SHARED_REQUIRES(Locks::mutator_lock_); 553 554 // Unlike GetOrCreateAllocatorForClassLoader, GetAllocatorForClassLoader asserts that the 555 // allocator for this class loader is already created. 556 static LinearAlloc* GetAllocatorForClassLoader(mirror::ClassLoader* class_loader) 557 SHARED_REQUIRES(Locks::mutator_lock_); 558 559 // Return the linear alloc for a class loader if it is already allocated, otherwise allocate and 560 // set it. TODO: Consider using a lock other than classlinker_classes_lock_. 561 static LinearAlloc* GetOrCreateAllocatorForClassLoader(mirror::ClassLoader* class_loader) 562 REQUIRES(!Locks::classlinker_classes_lock_) 563 SHARED_REQUIRES(Locks::mutator_lock_); 564 565 void InsertDexFileInToClassLoader(mirror::Object* dex_file, mirror::ClassLoader* class_loader) 566 REQUIRES(!Locks::classlinker_classes_lock_) 567 SHARED_REQUIRES(Locks::mutator_lock_); 568 569 struct DexCacheData { 570 // Weak root to the DexCache. Note: Do not decode this unnecessarily or else class unloading may 571 // not work properly. 572 jweak weak_root; 573 // The following two fields are caches to the DexCache's fields and here to avoid unnecessary 574 // jweak decode that triggers read barriers (and mark them alive unnecessarily and mess with 575 // class unloading.) 576 const DexFile* dex_file; 577 GcRoot<mirror::Class>* resolved_types; 578 }; 579 580 private: 581 struct ClassLoaderData { 582 jweak weak_root; // Weak root to enable class unloading. 583 ClassTable* class_table; 584 LinearAlloc* allocator; 585 }; 586 587 // Ensures that the supertype of 'klass' ('supertype') is verified. Returns false and throws 588 // appropriate exceptions if verification failed hard. Returns true for successful verification or 589 // soft-failures. 590 bool AttemptSupertypeVerification(Thread* self, 591 Handle<mirror::Class> klass, 592 Handle<mirror::Class> supertype) 593 REQUIRES(!dex_lock_) 594 SHARED_REQUIRES(Locks::mutator_lock_); 595 596 static void DeleteClassLoader(Thread* self, const ClassLoaderData& data) 597 REQUIRES(Locks::classlinker_classes_lock_) 598 SHARED_REQUIRES(Locks::mutator_lock_); 599 600 void VisitClassLoaders(ClassLoaderVisitor* visitor) const 601 SHARED_REQUIRES(Locks::classlinker_classes_lock_, Locks::mutator_lock_); 602 603 void VisitClassesInternal(ClassVisitor* visitor) 604 SHARED_REQUIRES(Locks::classlinker_classes_lock_, Locks::mutator_lock_); 605 606 // Returns the number of zygote and image classes. 607 size_t NumZygoteClasses() const 608 REQUIRES(Locks::classlinker_classes_lock_) 609 SHARED_REQUIRES(Locks::mutator_lock_); 610 611 // Returns the number of non zygote nor image classes. 612 size_t NumNonZygoteClasses() const 613 REQUIRES(Locks::classlinker_classes_lock_) 614 SHARED_REQUIRES(Locks::mutator_lock_); 615 616 void FinishInit(Thread* self) 617 SHARED_REQUIRES(Locks::mutator_lock_) 618 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 619 620 // For early bootstrapping by Init 621 mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size) 622 SHARED_REQUIRES(Locks::mutator_lock_) 623 REQUIRES(!Roles::uninterruptible_); 624 625 // Alloc* convenience functions to avoid needing to pass in mirror::Class* 626 // values that are known to the ClassLinker such as 627 // kObjectArrayClass and kJavaLangString etc. 628 mirror::Class* AllocClass(Thread* self, uint32_t class_size) 629 SHARED_REQUIRES(Locks::mutator_lock_) 630 REQUIRES(!Roles::uninterruptible_); 631 mirror::DexCache* AllocDexCache(Thread* self, 632 const DexFile& dex_file, 633 LinearAlloc* linear_alloc) 634 SHARED_REQUIRES(Locks::mutator_lock_) 635 REQUIRES(!Roles::uninterruptible_); 636 637 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type) 638 SHARED_REQUIRES(Locks::mutator_lock_) 639 REQUIRES(!Roles::uninterruptible_); 640 mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type) 641 SHARED_REQUIRES(Locks::mutator_lock_) 642 REQUIRES(!Roles::uninterruptible_); 643 644 mirror::Class* CreateArrayClass(Thread* self, 645 const char* descriptor, 646 size_t hash, 647 Handle<mirror::ClassLoader> class_loader) 648 SHARED_REQUIRES(Locks::mutator_lock_) 649 REQUIRES(!dex_lock_, !Roles::uninterruptible_); 650 651 void AppendToBootClassPath(Thread* self, const DexFile& dex_file) 652 SHARED_REQUIRES(Locks::mutator_lock_) 653 REQUIRES(!dex_lock_); 654 void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 655 SHARED_REQUIRES(Locks::mutator_lock_) 656 REQUIRES(!dex_lock_); 657 658 // Precomputes size needed for Class, in the case of a non-temporary class this size must be 659 // sufficient to hold all static fields. 660 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file, 661 const DexFile::ClassDef& dex_class_def); 662 663 // Setup the classloader, class def index, type idx so that we can insert this class in the class 664 // table. 665 void SetupClass(const DexFile& dex_file, 666 const DexFile::ClassDef& dex_class_def, 667 Handle<mirror::Class> klass, 668 mirror::ClassLoader* class_loader) 669 SHARED_REQUIRES(Locks::mutator_lock_); 670 671 void LoadClass(Thread* self, 672 const DexFile& dex_file, 673 const DexFile::ClassDef& dex_class_def, 674 Handle<mirror::Class> klass) 675 SHARED_REQUIRES(Locks::mutator_lock_); 676 void LoadClassMembers(Thread* self, 677 const DexFile& dex_file, 678 const uint8_t* class_data, 679 Handle<mirror::Class> klass, 680 const OatFile::OatClass* oat_class) 681 SHARED_REQUIRES(Locks::mutator_lock_); 682 683 void LoadField(const ClassDataItemIterator& it, Handle<mirror::Class> klass, ArtField* dst) 684 SHARED_REQUIRES(Locks::mutator_lock_); 685 686 void LoadMethod(Thread* self, 687 const DexFile& dex_file, 688 const ClassDataItemIterator& it, 689 Handle<mirror::Class> klass, ArtMethod* dst) 690 SHARED_REQUIRES(Locks::mutator_lock_); 691 692 void FixupStaticTrampolines(mirror::Class* klass) SHARED_REQUIRES(Locks::mutator_lock_); 693 694 // Finds the associated oat class for a dex_file and descriptor. Returns an invalid OatClass on 695 // error and sets found to false. 696 OatFile::OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found) 697 SHARED_REQUIRES(Locks::mutator_lock_); 698 699 void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 700 REQUIRES(dex_lock_) 701 SHARED_REQUIRES(Locks::mutator_lock_); 702 mirror::DexCache* FindDexCacheLocked(Thread* self, const DexFile& dex_file, bool allow_failure) 703 REQUIRES(dex_lock_) 704 SHARED_REQUIRES(Locks::mutator_lock_); 705 706 bool InitializeClass(Thread* self, 707 Handle<mirror::Class> klass, 708 bool can_run_clinit, 709 bool can_init_parents) 710 SHARED_REQUIRES(Locks::mutator_lock_) 711 REQUIRES(!dex_lock_); 712 bool InitializeDefaultInterfaceRecursive(Thread* self, 713 Handle<mirror::Class> klass, 714 bool can_run_clinit, 715 bool can_init_parents) 716 REQUIRES(!dex_lock_) 717 SHARED_REQUIRES(Locks::mutator_lock_); 718 bool WaitForInitializeClass(Handle<mirror::Class> klass, 719 Thread* self, 720 ObjectLock<mirror::Class>& lock); 721 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass) 722 SHARED_REQUIRES(Locks::mutator_lock_); 723 724 bool IsSameDescriptorInDifferentClassContexts(Thread* self, 725 const char* descriptor, 726 Handle<mirror::ClassLoader> class_loader1, 727 Handle<mirror::ClassLoader> class_loader2) 728 SHARED_REQUIRES(Locks::mutator_lock_); 729 730 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, 731 ArtMethod* method, 732 mirror::Class* klass1, 733 mirror::Class* klass2) 734 SHARED_REQUIRES(Locks::mutator_lock_); 735 736 bool LinkClass(Thread* self, 737 const char* descriptor, 738 Handle<mirror::Class> klass, 739 Handle<mirror::ObjectArray<mirror::Class>> interfaces, 740 MutableHandle<mirror::Class>* h_new_class_out) 741 SHARED_REQUIRES(Locks::mutator_lock_) 742 REQUIRES(!Locks::classlinker_classes_lock_); 743 744 bool LinkSuperClass(Handle<mirror::Class> klass) 745 SHARED_REQUIRES(Locks::mutator_lock_); 746 747 bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file) 748 SHARED_REQUIRES(Locks::mutator_lock_) 749 REQUIRES(!dex_lock_); 750 751 bool LinkMethods(Thread* self, 752 Handle<mirror::Class> klass, 753 Handle<mirror::ObjectArray<mirror::Class>> interfaces, 754 ArtMethod** out_imt) 755 SHARED_REQUIRES(Locks::mutator_lock_); 756 757 // Does anything needed to make sure that the compiler will not generate a direct invoke to this 758 // method. Should only be called on non-invokable methods. 759 void EnsureThrowsInvocationError(ArtMethod* method) 760 SHARED_REQUIRES(Locks::mutator_lock_); 761 762 // A wrapper class representing the result of a method translation used for linking methods and 763 // updating superclass default methods. For each method in a classes vtable there are 4 states it 764 // could be in: 765 // 1) No translation is necessary. In this case there is no MethodTranslation object for it. This 766 // is the standard case and is true when the method is not overridable by a default method, 767 // the class defines a concrete implementation of the method, the default method implementation 768 // remains the same, or an abstract method stayed abstract. 769 // 2) The method must be translated to a different default method. We note this with 770 // CreateTranslatedMethod. 771 // 3) The method must be replaced with a conflict method. This happens when a superclass 772 // implements an interface with a default method and this class implements an unrelated 773 // interface that also defines that default method. We note this with CreateConflictingMethod. 774 // 4) The method must be replaced with an abstract miranda method. This happens when a superclass 775 // implements an interface with a default method and this class implements a subinterface of 776 // the superclass's interface which declares the default method abstract. We note this with 777 // CreateAbstractMethod. 778 // 779 // When a method translation is unnecessary (case #1), we don't put it into the 780 // default_translation maps. So an instance of MethodTranslation must be in one of #2-#4. 781 class MethodTranslation { 782 public: 783 // This slot must become a default conflict method. 784 static MethodTranslation CreateConflictingMethod() { 785 return MethodTranslation(Type::kConflict, /*translation*/nullptr); 786 } 787 788 // This slot must become an abstract method. 789 static MethodTranslation CreateAbstractMethod() { 790 return MethodTranslation(Type::kAbstract, /*translation*/nullptr); 791 } 792 793 // Use the given method as the current value for this vtable slot during translation. 794 static MethodTranslation CreateTranslatedMethod(ArtMethod* new_method) { 795 return MethodTranslation(Type::kTranslation, new_method); 796 } 797 798 // Returns true if this is a method that must become a conflict method. 799 bool IsInConflict() const { 800 return type_ == Type::kConflict; 801 } 802 803 // Returns true if this is a method that must become an abstract method. 804 bool IsAbstract() const { 805 return type_ == Type::kAbstract; 806 } 807 808 // Returns true if this is a method that must become a different method. 809 bool IsTranslation() const { 810 return type_ == Type::kTranslation; 811 } 812 813 // Get the translated version of this method. 814 ArtMethod* GetTranslation() const { 815 DCHECK(IsTranslation()); 816 DCHECK(translation_ != nullptr); 817 return translation_; 818 } 819 820 private: 821 enum class Type { 822 kTranslation, 823 kConflict, 824 kAbstract, 825 }; 826 827 MethodTranslation(Type type, ArtMethod* translation) 828 : translation_(translation), type_(type) {} 829 830 ArtMethod* const translation_; 831 const Type type_; 832 }; 833 834 // Links the virtual methods for the given class and records any default methods that will need to 835 // be updated later. 836 // 837 // Arguments: 838 // * self - The current thread. 839 // * klass - class, whose vtable will be filled in. 840 // * default_translations - Vtable index to new method map. 841 // Any vtable entries that need to be updated with new default methods 842 // are stored into the default_translations map. The default_translations 843 // map is keyed on the vtable index that needs to be updated. We use this 844 // map because if we override a default method with another default 845 // method we need to update the vtable to point to the new method. 846 // Unfortunately since we copy the ArtMethod* we cannot just do a simple 847 // scan, we therefore store the vtable index's that might need to be 848 // updated with the method they will turn into. 849 // TODO This whole default_translations thing is very dirty. There should be a better way. 850 bool LinkVirtualMethods( 851 Thread* self, 852 Handle<mirror::Class> klass, 853 /*out*/std::unordered_map<size_t, MethodTranslation>* default_translations) 854 SHARED_REQUIRES(Locks::mutator_lock_); 855 856 // Sets up the interface lookup table (IFTable) in the correct order to allow searching for 857 // default methods. 858 bool SetupInterfaceLookupTable(Thread* self, 859 Handle<mirror::Class> klass, 860 Handle<mirror::ObjectArray<mirror::Class>> interfaces) 861 SHARED_REQUIRES(Locks::mutator_lock_); 862 863 864 enum class DefaultMethodSearchResult { 865 kDefaultFound, 866 kAbstractFound, 867 kDefaultConflict 868 }; 869 870 // Find the default method implementation for 'interface_method' in 'klass', if one exists. 871 // 872 // Arguments: 873 // * self - The current thread. 874 // * target_method - The method we are trying to find a default implementation for. 875 // * klass - The class we are searching for a definition of target_method. 876 // * out_default_method - The pointer we will store the found default method to on success. 877 // 878 // Return value: 879 // * kDefaultFound - There were no conflicting method implementations found in the class while 880 // searching for target_method. The default method implementation is stored into 881 // out_default_method. 882 // * kAbstractFound - There were no conflicting method implementations found in the class while 883 // searching for target_method but no default implementation was found either. 884 // out_default_method is set to null and the method should be considered not 885 // implemented. 886 // * kDefaultConflict - Conflicting method implementations were found when searching for 887 // target_method. The value of *out_default_method is null. 888 DefaultMethodSearchResult FindDefaultMethodImplementation( 889 Thread* self, 890 ArtMethod* target_method, 891 Handle<mirror::Class> klass, 892 /*out*/ArtMethod** out_default_method) const 893 SHARED_REQUIRES(Locks::mutator_lock_); 894 895 // Sets the imt entries and fixes up the vtable for the given class by linking all the interface 896 // methods. See LinkVirtualMethods for an explanation of what default_translations is. 897 bool LinkInterfaceMethods( 898 Thread* self, 899 Handle<mirror::Class> klass, 900 const std::unordered_map<size_t, MethodTranslation>& default_translations, 901 ArtMethod** out_imt) 902 SHARED_REQUIRES(Locks::mutator_lock_); 903 904 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size) 905 SHARED_REQUIRES(Locks::mutator_lock_); 906 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass) 907 SHARED_REQUIRES(Locks::mutator_lock_); 908 bool LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_static, size_t* class_size) 909 SHARED_REQUIRES(Locks::mutator_lock_); 910 void LinkCode(ArtMethod* method, 911 const OatFile::OatClass* oat_class, 912 uint32_t class_def_method_index) 913 SHARED_REQUIRES(Locks::mutator_lock_); 914 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) 915 SHARED_REQUIRES(Locks::mutator_lock_); 916 917 void CheckProxyConstructor(ArtMethod* constructor) const 918 SHARED_REQUIRES(Locks::mutator_lock_); 919 void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const 920 SHARED_REQUIRES(Locks::mutator_lock_); 921 922 // For use by ImageWriter to find DexCaches for its roots 923 ReaderWriterMutex* DexLock() 924 SHARED_REQUIRES(Locks::mutator_lock_) 925 LOCK_RETURNED(dex_lock_) { 926 return &dex_lock_; 927 } 928 size_t GetDexCacheCount() SHARED_REQUIRES(Locks::mutator_lock_, dex_lock_) { 929 return dex_caches_.size(); 930 } 931 const std::list<DexCacheData>& GetDexCachesData() 932 SHARED_REQUIRES(Locks::mutator_lock_, dex_lock_) { 933 return dex_caches_; 934 } 935 936 void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out) 937 SHARED_REQUIRES(Locks::mutator_lock_); 938 void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out) 939 SHARED_REQUIRES(Locks::mutator_lock_); 940 941 // Ensures that methods have the kAccPreverified bit set. We use the kAccPreverfied bit on the 942 // class access flags to determine whether this has been done before. 943 void EnsurePreverifiedMethods(Handle<mirror::Class> c) 944 SHARED_REQUIRES(Locks::mutator_lock_); 945 946 mirror::Class* LookupClassFromBootImage(const char* descriptor) 947 SHARED_REQUIRES(Locks::mutator_lock_); 948 949 // Returns null if not found. 950 ClassTable* ClassTableForClassLoader(mirror::ClassLoader* class_loader) 951 SHARED_REQUIRES(Locks::mutator_lock_, Locks::classlinker_classes_lock_); 952 // Insert a new class table if not found. 953 ClassTable* InsertClassTableForClassLoader(mirror::ClassLoader* class_loader) 954 SHARED_REQUIRES(Locks::mutator_lock_) 955 REQUIRES(Locks::classlinker_classes_lock_); 956 957 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved 958 // before returning it to the caller. Its the responsibility of the thread that placed the class 959 // in the table to make it resolved. The thread doing resolution must notify on the class' lock 960 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may 961 // retire a class, the version of the class in the table is returned and this may differ from 962 // the class passed in. 963 mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass) 964 WARN_UNUSED 965 SHARED_REQUIRES(Locks::mutator_lock_) 966 REQUIRES(!dex_lock_); 967 968 void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class) 969 SHARED_REQUIRES(Locks::mutator_lock_); 970 971 void SetClassRoot(ClassRoot class_root, mirror::Class* klass) 972 SHARED_REQUIRES(Locks::mutator_lock_); 973 974 // Return the quick generic JNI stub for testing. 975 const void* GetRuntimeQuickGenericJniStub() const; 976 977 // Throw the class initialization failure recorded when first trying to initialize the given 978 // class. 979 void ThrowEarlierClassFailure(mirror::Class* c, bool wrap_in_no_class_def = false) 980 SHARED_REQUIRES(Locks::mutator_lock_) 981 REQUIRES(!dex_lock_); 982 983 bool CanWeInitializeClass(mirror::Class* klass, bool can_init_statics, bool can_init_parents) 984 SHARED_REQUIRES(Locks::mutator_lock_); 985 986 void UpdateClassVirtualMethods(mirror::Class* klass, 987 LengthPrefixedArray<ArtMethod>* new_methods) 988 SHARED_REQUIRES(Locks::mutator_lock_) 989 REQUIRES(!Locks::classlinker_classes_lock_); 990 991 std::vector<const DexFile*> boot_class_path_; 992 std::vector<std::unique_ptr<const DexFile>> opened_dex_files_; 993 994 mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 995 // JNI weak globals and side data to allow dex caches to get unloaded. We lazily delete weak 996 // globals when we register new dex files. 997 std::list<DexCacheData> dex_caches_ GUARDED_BY(dex_lock_); 998 999 // This contains the class loaders which have class tables. It is populated by 1000 // InsertClassTableForClassLoader. 1001 std::list<ClassLoaderData> class_loaders_ 1002 GUARDED_BY(Locks::classlinker_classes_lock_); 1003 1004 // Boot class path table. Since the class loader for this is null. 1005 ClassTable boot_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_); 1006 1007 // New class roots, only used by CMS since the GC needs to mark these in the pause. 1008 std::vector<GcRoot<mirror::Class>> new_class_roots_ GUARDED_BY(Locks::classlinker_classes_lock_); 1009 1010 // Do we need to search dex caches to find boot image classes? 1011 bool dex_cache_boot_image_class_lookup_required_; 1012 // Number of times we've searched dex caches for a class. After a certain number of misses we move 1013 // the classes into the class_table_ to avoid dex cache based searches. 1014 Atomic<uint32_t> failed_dex_cache_class_lookups_; 1015 1016 // Well known mirror::Class roots. 1017 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_; 1018 1019 // The interface table used by all arrays. 1020 GcRoot<mirror::IfTable> array_iftable_; 1021 1022 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class 1023 // descriptors for the sake of performing FindClass. 1024 static constexpr size_t kFindArrayCacheSize = 16; 1025 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize]; 1026 size_t find_array_class_cache_next_victim_; 1027 1028 bool init_done_; 1029 bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_); 1030 1031 InternTable* intern_table_; 1032 1033 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single 1034 // patch point within the image. TODO: make these proper relocations. 1035 const void* quick_resolution_trampoline_; 1036 const void* quick_imt_conflict_trampoline_; 1037 const void* quick_generic_jni_trampoline_; 1038 const void* quick_to_interpreter_bridge_trampoline_; 1039 1040 // Image pointer size. 1041 size_t image_pointer_size_; 1042 1043 friend class ImageDumper; // for DexLock 1044 friend class ImageWriter; // for GetClassRoots 1045 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub 1046 friend class JniInternalTest; // for GetRuntimeQuickGenericJniStub 1047 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache 1048 1049 DISALLOW_COPY_AND_ASSIGN(ClassLinker); 1050}; 1051 1052} // namespace art 1053 1054#endif // ART_RUNTIME_CLASS_LINKER_H_ 1055