< prev index next >

src/hotspot/share/classfile/systemDictionary.hpp

Print this page


  68 //    - entries must be fully formed before they are available to concurrent
  69 //         readers (we must ensure write ordering)
  70 //
  71 // Note that placeholders are deleted at any time, as they are removed
  72 // when a class is completely loaded. Therefore, readers as well as writers
  73 // of placeholders must hold the SystemDictionary_lock.
  74 //
  75 
  76 class ClassFileStream;
  77 class Dictionary;
  78 class PlaceholderTable;
  79 class LoaderConstraintTable;
  80 template <MEMFLAGS F> class HashtableBucket;
  81 class ResolutionErrorTable;
  82 class SymbolPropertyTable;
  83 class ProtectionDomainCacheTable;
  84 class ProtectionDomainCacheEntry;
  85 class GCTimer;
  86 class OopStorage;
  87 
  88 // Certain classes are preloaded, such as java.lang.Object and java.lang.String.
  89 // They are all "well-known", in the sense that no class loader is allowed
  90 // to provide a different definition.
  91 //
  92 // These klasses must all have names defined in vmSymbols.

  93 
  94 #define WK_KLASS_ENUM_NAME(kname)    kname##_knum
  95 
  96 // Each well-known class has a short klass name (like object_klass),
  97 // and a vmSymbol name (like java_lang_Object).
  98 // The order of these definitions is significant; it is the order in which
  99 // preloading is actually performed by resolve_preloaded_classes.
 100 
 101 #define WK_KLASSES_DO(do_klass)                                                                                 \
 102   /* well-known classes */                                                                                      \
 103   do_klass(Object_klass,                                java_lang_Object                                      ) \
 104   do_klass(String_klass,                                java_lang_String                                      ) \
 105   do_klass(Class_klass,                                 java_lang_Class                                       ) \
 106   do_klass(Cloneable_klass,                             java_lang_Cloneable                                   ) \
 107   do_klass(ClassLoader_klass,                           java_lang_ClassLoader                                 ) \
 108   do_klass(Serializable_klass,                          java_io_Serializable                                  ) \
 109   do_klass(System_klass,                                java_lang_System                                      ) \
 110   do_klass(Throwable_klass,                             java_lang_Throwable                                   ) \
 111   do_klass(Error_klass,                                 java_lang_Error                                       ) \
 112   do_klass(ThreadDeath_klass,                           java_lang_ThreadDeath                                 ) \
 113   do_klass(Exception_klass,                             java_lang_Exception                                   ) \
 114   do_klass(RuntimeException_klass,                      java_lang_RuntimeException                            ) \
 115   do_klass(SecurityManager_klass,                       java_lang_SecurityManager                             ) \
 116   do_klass(ProtectionDomain_klass,                      java_security_ProtectionDomain                        ) \
 117   do_klass(AccessControlContext_klass,                  java_security_AccessControlContext                    ) \
 118   do_klass(SecureClassLoader_klass,                     java_security_SecureClassLoader                       ) \
 119   do_klass(ClassNotFoundException_klass,                java_lang_ClassNotFoundException                      ) \
 120   do_klass(NoClassDefFoundError_klass,                  java_lang_NoClassDefFoundError                        ) \
 121   do_klass(LinkageError_klass,                          java_lang_LinkageError                                ) \
 122   do_klass(ClassCastException_klass,                    java_lang_ClassCastException                          ) \
 123   do_klass(ArrayStoreException_klass,                   java_lang_ArrayStoreException                         ) \
 124   do_klass(VirtualMachineError_klass,                   java_lang_VirtualMachineError                         ) \
 125   do_klass(OutOfMemoryError_klass,                      java_lang_OutOfMemoryError                            ) \
 126   do_klass(StackOverflowError_klass,                    java_lang_StackOverflowError                          ) \
 127   do_klass(IllegalMonitorStateException_klass,          java_lang_IllegalMonitorStateException                ) \
 128   do_klass(Reference_klass,                             java_lang_ref_Reference                               ) \
 129                                                                                                                 \
 130   /* Preload ref klasses and set reference types */                                                             \
 131   do_klass(SoftReference_klass,                         java_lang_ref_SoftReference                           ) \
 132   do_klass(WeakReference_klass,                         java_lang_ref_WeakReference                           ) \
 133   do_klass(FinalReference_klass,                        java_lang_ref_FinalReference                          ) \
 134   do_klass(PhantomReference_klass,                      java_lang_ref_PhantomReference                        ) \
 135   do_klass(Finalizer_klass,                             java_lang_ref_Finalizer                               ) \
 136                                                                                                                 \
 137   do_klass(Thread_klass,                                java_lang_Thread                                      ) \
 138   do_klass(ThreadGroup_klass,                           java_lang_ThreadGroup                                 ) \
 139   do_klass(Properties_klass,                            java_util_Properties                                  ) \
 140   do_klass(Module_klass,                                java_lang_Module                                      ) \
 141   do_klass(reflect_AccessibleObject_klass,              java_lang_reflect_AccessibleObject                    ) \
 142   do_klass(reflect_Field_klass,                         java_lang_reflect_Field                               ) \
 143   do_klass(reflect_Parameter_klass,                     java_lang_reflect_Parameter                           ) \
 144   do_klass(reflect_Method_klass,                        java_lang_reflect_Method                              ) \
 145   do_klass(reflect_Constructor_klass,                   java_lang_reflect_Constructor                         ) \
 146                                                                                                                 \
 147   /* NOTE: needed too early in bootstrapping process to have checks based on JDK version */                     \
 148   /* It's okay if this turns out to be NULL in non-1.4 JDKs. */                                                 \
 149   do_klass(reflect_MagicAccessorImpl_klass,             reflect_MagicAccessorImpl                             ) \
 150   do_klass(reflect_MethodAccessorImpl_klass,            reflect_MethodAccessorImpl                            ) \


 183   do_klass(Jar_Manifest_klass,                          java_util_jar_Manifest                                ) \
 184   do_klass(jdk_internal_loader_ClassLoaders_klass,      jdk_internal_loader_ClassLoaders                      ) \
 185   do_klass(jdk_internal_loader_ClassLoaders_AppClassLoader_klass,      jdk_internal_loader_ClassLoaders_AppClassLoader) \
 186   do_klass(jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass, jdk_internal_loader_ClassLoaders_PlatformClassLoader) \
 187   do_klass(CodeSource_klass,                            java_security_CodeSource                              ) \
 188                                                                                                                 \
 189   do_klass(StackTraceElement_klass,                     java_lang_StackTraceElement                           ) \
 190                                                                                                                 \
 191   /* It's okay if this turns out to be NULL in non-1.4 JDKs. */                                                 \
 192   do_klass(nio_Buffer_klass,                            java_nio_Buffer                                       ) \
 193                                                                                                                 \
 194   /* Stack Walking */                                                                                           \
 195   do_klass(StackWalker_klass,                           java_lang_StackWalker                                 ) \
 196   do_klass(AbstractStackWalker_klass,                   java_lang_StackStreamFactory_AbstractStackWalker      ) \
 197   do_klass(StackFrameInfo_klass,                        java_lang_StackFrameInfo                              ) \
 198   do_klass(LiveStackFrameInfo_klass,                    java_lang_LiveStackFrameInfo                          ) \
 199                                                                                                                 \
 200   /* support for stack dump lock analysis */                                                                    \
 201   do_klass(java_util_concurrent_locks_AbstractOwnableSynchronizer_klass, java_util_concurrent_locks_AbstractOwnableSynchronizer) \
 202                                                                                                                 \
 203   /* Preload boxing klasses */                                                                                  \
 204   do_klass(Boolean_klass,                               java_lang_Boolean                                     ) \
 205   do_klass(Character_klass,                             java_lang_Character                                   ) \
 206   do_klass(Float_klass,                                 java_lang_Float                                       ) \
 207   do_klass(Double_klass,                                java_lang_Double                                      ) \
 208   do_klass(Byte_klass,                                  java_lang_Byte                                        ) \
 209   do_klass(Short_klass,                                 java_lang_Short                                       ) \
 210   do_klass(Integer_klass,                               java_lang_Integer                                     ) \
 211   do_klass(Long_klass,                                  java_lang_Long                                        ) \
 212                                                                                                                 \
 213   /* JVMCI classes. These are loaded on-demand. */                                                              \
 214   JVMCI_WK_KLASSES_DO(do_klass)                                                                                 \
 215                                                                                                                 \
 216   /*end*/
 217 
 218 
 219 class SystemDictionary : AllStatic {
 220   friend class VMStructs;
 221   friend class SystemDictionaryHandles;
 222 
 223  public:


 374                                     int number_of_entries);
 375   // Printing
 376   static void print() { return print_on(tty); }
 377   static void print_on(outputStream* st);
 378   static void print_shared(outputStream* st);
 379   static void dump(outputStream* st, bool verbose);
 380 
 381   // Monotonically increasing counter which grows as classes are
 382   // loaded or modifications such as hot-swapping or setting/removing
 383   // of breakpoints are performed
 384   static inline int number_of_modifications()     { assert_locked_or_safepoint(Compile_lock); return _number_of_modifications; }
 385   // Needed by evolution and breakpoint code
 386   static inline void notice_modification()        { assert_locked_or_safepoint(Compile_lock); ++_number_of_modifications;      }
 387 
 388   // Verification
 389   static void verify();
 390 
 391   // Initialization
 392   static void initialize(TRAPS);
 393 
 394   // Checked fast access to commonly used classes - mostly preloaded

 395   static InstanceKlass* check_klass(InstanceKlass* k) {
 396     assert(k != NULL, "klass not loaded");
 397     return k;
 398   }
 399 
 400   static bool resolve_wk_klass(WKID id, TRAPS);
 401   static void resolve_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS);
 402   static void resolve_wk_klasses_through(WKID end_id, WKID &start_id, TRAPS) {
 403     int limit = (int)end_id + 1;
 404     resolve_wk_klasses_until((WKID) limit, start_id, THREAD);
 405   }
 406 
 407 public:
 408   #define WK_KLASS_DECLARE(name, symbol) \
 409     static InstanceKlass* name() { return check_klass(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \
 410     static InstanceKlass** name##_addr() {                                                              \
 411       return &_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)];                          \
 412     }                                                                                                   \
 413     static bool name##_is_loaded() {                                                                    \
 414       return _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)] != NULL;                   \


 418 
 419   static InstanceKlass* well_known_klass(WKID id) {
 420     assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
 421     return _well_known_klasses[id];
 422   }
 423 
 424   static InstanceKlass** well_known_klass_addr(WKID id) {
 425     assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
 426     return &_well_known_klasses[id];
 427   }
 428   static void well_known_klasses_do(MetaspaceClosure* it);
 429 
 430   // Local definition for direct access to the private array:
 431   #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]
 432 
 433   static InstanceKlass* box_klass(BasicType t) {
 434     assert((uint)t < T_VOID+1, "range check");
 435     return check_klass(_box_klasses[t]);
 436   }
 437   static BasicType box_klass_type(Klass* k);  // inverse of box_klass






 438 
 439 protected:
 440   // Returns the class loader data to be used when looking up/updating the
 441   // system dictionary.
 442   static ClassLoaderData *class_loader_data(Handle class_loader) {
 443     return ClassLoaderData::class_loader_data(class_loader());
 444   }
 445 
 446 public:
 447   // Tells whether ClassLoader.checkPackageAccess is present
 448   static bool has_checkPackageAccess()      { return _has_checkPackageAccess; }
 449 
 450   static bool Parameter_klass_loaded()      { return WK_KLASS(reflect_Parameter_klass) != NULL; }
 451   static bool Class_klass_loaded()          { return WK_KLASS(Class_klass) != NULL; }
 452   static bool Cloneable_klass_loaded()      { return WK_KLASS(Cloneable_klass) != NULL; }
 453   static bool Object_klass_loaded()         { return WK_KLASS(Object_klass) != NULL; }
 454   static bool ClassLoader_klass_loaded()    { return WK_KLASS(ClassLoader_klass) != NULL; }
 455 
 456   // Returns java system loader
 457   static oop java_system_loader();


 678   static InstanceKlass* find_class(Symbol* class_name, ClassLoaderData* loader_data);
 679 
 680   // Basic find on classes in the midst of being loaded
 681   static Symbol* find_placeholder(Symbol* name, ClassLoaderData* loader_data);
 682 
 683   // Add a placeholder for a class being loaded
 684   static void add_placeholder(int index,
 685                               Symbol* class_name,
 686                               ClassLoaderData* loader_data);
 687   static void remove_placeholder(int index,
 688                                  Symbol* class_name,
 689                                  ClassLoaderData* loader_data);
 690 
 691   // Performs cleanups after resolve_super_or_fail. This typically needs
 692   // to be called on failure.
 693   // Won't throw, but can block.
 694   static void resolution_cleanups(Symbol* class_name,
 695                                   ClassLoaderData* loader_data,
 696                                   TRAPS);
 697 
 698   // Resolve preloaded classes so they can be used like SystemDictionary::String_klass()
 699   static void resolve_preloaded_classes(TRAPS);
 700 
 701   // Class loader constraints
 702   static void check_constraints(unsigned int hash,
 703                                 InstanceKlass* k, Handle loader,
 704                                 bool defining, TRAPS);
 705   static void update_dictionary(unsigned int d_hash,
 706                                 int p_index, unsigned int p_hash,
 707                                 InstanceKlass* k, Handle loader,
 708                                 TRAPS);
 709 
 710   // Variables holding commonly used klasses (preloaded)
 711   static InstanceKlass* _well_known_klasses[];
 712 
 713   // table of box klasses (int_klass, etc.)
 714   static InstanceKlass* _box_klasses[T_VOID+1];
 715 
 716 private:
 717   static oop  _java_system_loader;
 718   static oop  _java_platform_loader;
 719 
 720   static bool _has_checkPackageAccess;
 721 };
 722 
 723 #endif // SHARE_VM_CLASSFILE_SYSTEMDICTIONARY_HPP


  68 //    - entries must be fully formed before they are available to concurrent
  69 //         readers (we must ensure write ordering)
  70 //
  71 // Note that placeholders are deleted at any time, as they are removed
  72 // when a class is completely loaded. Therefore, readers as well as writers
  73 // of placeholders must hold the SystemDictionary_lock.
  74 //
  75 
  76 class ClassFileStream;
  77 class Dictionary;
  78 class PlaceholderTable;
  79 class LoaderConstraintTable;
  80 template <MEMFLAGS F> class HashtableBucket;
  81 class ResolutionErrorTable;
  82 class SymbolPropertyTable;
  83 class ProtectionDomainCacheTable;
  84 class ProtectionDomainCacheEntry;
  85 class GCTimer;
  86 class OopStorage;
  87 
  88 // Certain classes, such as java.lang.Object and java.lang.String,
  89 // are all "well-known", in the sense that no class loader is allowed
  90 // to provide a different definition.
  91 //
  92 // These klasses must all have names defined in vmSymbols. They are
  93 // resolved during early VM start-up in a specific order.
  94 
  95 #define WK_KLASS_ENUM_NAME(kname)    kname##_knum
  96 
  97 // Each well-known class has a short klass name (like object_klass),
  98 // and a vmSymbol name (like java_lang_Object).
  99 // The order of these definitions is significant; it is the order in which
 100 // class resolution is actually performed by resolve_well_known_classes.
 101 
 102 #define WK_KLASSES_DO(do_klass)                                                                                 \
 103   /* well-known classes */                                                                                      \
 104   do_klass(Object_klass,                                java_lang_Object                                      ) \
 105   do_klass(String_klass,                                java_lang_String                                      ) \
 106   do_klass(Class_klass,                                 java_lang_Class                                       ) \
 107   do_klass(Cloneable_klass,                             java_lang_Cloneable                                   ) \
 108   do_klass(ClassLoader_klass,                           java_lang_ClassLoader                                 ) \
 109   do_klass(Serializable_klass,                          java_io_Serializable                                  ) \
 110   do_klass(System_klass,                                java_lang_System                                      ) \
 111   do_klass(Throwable_klass,                             java_lang_Throwable                                   ) \
 112   do_klass(Error_klass,                                 java_lang_Error                                       ) \
 113   do_klass(ThreadDeath_klass,                           java_lang_ThreadDeath                                 ) \
 114   do_klass(Exception_klass,                             java_lang_Exception                                   ) \
 115   do_klass(RuntimeException_klass,                      java_lang_RuntimeException                            ) \
 116   do_klass(SecurityManager_klass,                       java_lang_SecurityManager                             ) \
 117   do_klass(ProtectionDomain_klass,                      java_security_ProtectionDomain                        ) \
 118   do_klass(AccessControlContext_klass,                  java_security_AccessControlContext                    ) \
 119   do_klass(SecureClassLoader_klass,                     java_security_SecureClassLoader                       ) \
 120   do_klass(ClassNotFoundException_klass,                java_lang_ClassNotFoundException                      ) \
 121   do_klass(NoClassDefFoundError_klass,                  java_lang_NoClassDefFoundError                        ) \
 122   do_klass(LinkageError_klass,                          java_lang_LinkageError                                ) \
 123   do_klass(ClassCastException_klass,                    java_lang_ClassCastException                          ) \
 124   do_klass(ArrayStoreException_klass,                   java_lang_ArrayStoreException                         ) \
 125   do_klass(VirtualMachineError_klass,                   java_lang_VirtualMachineError                         ) \
 126   do_klass(OutOfMemoryError_klass,                      java_lang_OutOfMemoryError                            ) \
 127   do_klass(StackOverflowError_klass,                    java_lang_StackOverflowError                          ) \
 128   do_klass(IllegalMonitorStateException_klass,          java_lang_IllegalMonitorStateException                ) \
 129   do_klass(Reference_klass,                             java_lang_ref_Reference                               ) \
 130                                                                                                                 \
 131   /* ref klasses and set reference types */                                                                     \
 132   do_klass(SoftReference_klass,                         java_lang_ref_SoftReference                           ) \
 133   do_klass(WeakReference_klass,                         java_lang_ref_WeakReference                           ) \
 134   do_klass(FinalReference_klass,                        java_lang_ref_FinalReference                          ) \
 135   do_klass(PhantomReference_klass,                      java_lang_ref_PhantomReference                        ) \
 136   do_klass(Finalizer_klass,                             java_lang_ref_Finalizer                               ) \
 137                                                                                                                 \
 138   do_klass(Thread_klass,                                java_lang_Thread                                      ) \
 139   do_klass(ThreadGroup_klass,                           java_lang_ThreadGroup                                 ) \
 140   do_klass(Properties_klass,                            java_util_Properties                                  ) \
 141   do_klass(Module_klass,                                java_lang_Module                                      ) \
 142   do_klass(reflect_AccessibleObject_klass,              java_lang_reflect_AccessibleObject                    ) \
 143   do_klass(reflect_Field_klass,                         java_lang_reflect_Field                               ) \
 144   do_klass(reflect_Parameter_klass,                     java_lang_reflect_Parameter                           ) \
 145   do_klass(reflect_Method_klass,                        java_lang_reflect_Method                              ) \
 146   do_klass(reflect_Constructor_klass,                   java_lang_reflect_Constructor                         ) \
 147                                                                                                                 \
 148   /* NOTE: needed too early in bootstrapping process to have checks based on JDK version */                     \
 149   /* It's okay if this turns out to be NULL in non-1.4 JDKs. */                                                 \
 150   do_klass(reflect_MagicAccessorImpl_klass,             reflect_MagicAccessorImpl                             ) \
 151   do_klass(reflect_MethodAccessorImpl_klass,            reflect_MethodAccessorImpl                            ) \


 184   do_klass(Jar_Manifest_klass,                          java_util_jar_Manifest                                ) \
 185   do_klass(jdk_internal_loader_ClassLoaders_klass,      jdk_internal_loader_ClassLoaders                      ) \
 186   do_klass(jdk_internal_loader_ClassLoaders_AppClassLoader_klass,      jdk_internal_loader_ClassLoaders_AppClassLoader) \
 187   do_klass(jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass, jdk_internal_loader_ClassLoaders_PlatformClassLoader) \
 188   do_klass(CodeSource_klass,                            java_security_CodeSource                              ) \
 189                                                                                                                 \
 190   do_klass(StackTraceElement_klass,                     java_lang_StackTraceElement                           ) \
 191                                                                                                                 \
 192   /* It's okay if this turns out to be NULL in non-1.4 JDKs. */                                                 \
 193   do_klass(nio_Buffer_klass,                            java_nio_Buffer                                       ) \
 194                                                                                                                 \
 195   /* Stack Walking */                                                                                           \
 196   do_klass(StackWalker_klass,                           java_lang_StackWalker                                 ) \
 197   do_klass(AbstractStackWalker_klass,                   java_lang_StackStreamFactory_AbstractStackWalker      ) \
 198   do_klass(StackFrameInfo_klass,                        java_lang_StackFrameInfo                              ) \
 199   do_klass(LiveStackFrameInfo_klass,                    java_lang_LiveStackFrameInfo                          ) \
 200                                                                                                                 \
 201   /* support for stack dump lock analysis */                                                                    \
 202   do_klass(java_util_concurrent_locks_AbstractOwnableSynchronizer_klass, java_util_concurrent_locks_AbstractOwnableSynchronizer) \
 203                                                                                                                 \
 204   /* boxing klasses */                                                                                          \
 205   do_klass(Boolean_klass,                               java_lang_Boolean                                     ) \
 206   do_klass(Character_klass,                             java_lang_Character                                   ) \
 207   do_klass(Float_klass,                                 java_lang_Float                                       ) \
 208   do_klass(Double_klass,                                java_lang_Double                                      ) \
 209   do_klass(Byte_klass,                                  java_lang_Byte                                        ) \
 210   do_klass(Short_klass,                                 java_lang_Short                                       ) \
 211   do_klass(Integer_klass,                               java_lang_Integer                                     ) \
 212   do_klass(Long_klass,                                  java_lang_Long                                        ) \
 213                                                                                                                 \
 214   /* JVMCI classes. These are loaded on-demand. */                                                              \
 215   JVMCI_WK_KLASSES_DO(do_klass)                                                                                 \
 216                                                                                                                 \
 217   /*end*/
 218 
 219 
 220 class SystemDictionary : AllStatic {
 221   friend class VMStructs;
 222   friend class SystemDictionaryHandles;
 223 
 224  public:


 375                                     int number_of_entries);
 376   // Printing
 377   static void print() { return print_on(tty); }
 378   static void print_on(outputStream* st);
 379   static void print_shared(outputStream* st);
 380   static void dump(outputStream* st, bool verbose);
 381 
 382   // Monotonically increasing counter which grows as classes are
 383   // loaded or modifications such as hot-swapping or setting/removing
 384   // of breakpoints are performed
 385   static inline int number_of_modifications()     { assert_locked_or_safepoint(Compile_lock); return _number_of_modifications; }
 386   // Needed by evolution and breakpoint code
 387   static inline void notice_modification()        { assert_locked_or_safepoint(Compile_lock); ++_number_of_modifications;      }
 388 
 389   // Verification
 390   static void verify();
 391 
 392   // Initialization
 393   static void initialize(TRAPS);
 394 
 395   // Checked fast access to the well-known classes -- so that you don't try to use them
 396   // before they are resolved.
 397   static InstanceKlass* check_klass(InstanceKlass* k) {
 398     assert(k != NULL, "klass not loaded");
 399     return k;
 400   }
 401 
 402   static bool resolve_wk_klass(WKID id, TRAPS);
 403   static void resolve_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS);
 404   static void resolve_wk_klasses_through(WKID end_id, WKID &start_id, TRAPS) {
 405     int limit = (int)end_id + 1;
 406     resolve_wk_klasses_until((WKID) limit, start_id, THREAD);
 407   }
 408 
 409 public:
 410   #define WK_KLASS_DECLARE(name, symbol) \
 411     static InstanceKlass* name() { return check_klass(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \
 412     static InstanceKlass** name##_addr() {                                                              \
 413       return &_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)];                          \
 414     }                                                                                                   \
 415     static bool name##_is_loaded() {                                                                    \
 416       return _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)] != NULL;                   \


 420 
 421   static InstanceKlass* well_known_klass(WKID id) {
 422     assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
 423     return _well_known_klasses[id];
 424   }
 425 
 426   static InstanceKlass** well_known_klass_addr(WKID id) {
 427     assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
 428     return &_well_known_klasses[id];
 429   }
 430   static void well_known_klasses_do(MetaspaceClosure* it);
 431 
 432   // Local definition for direct access to the private array:
 433   #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]
 434 
 435   static InstanceKlass* box_klass(BasicType t) {
 436     assert((uint)t < T_VOID+1, "range check");
 437     return check_klass(_box_klasses[t]);
 438   }
 439   static BasicType box_klass_type(Klass* k);  // inverse of box_klass
 440 #ifdef ASSERT
 441   static bool is_well_known_klass(Klass* k) {
 442     return is_well_known_klass(k->name());
 443   }
 444   static bool is_well_known_klass(Symbol* class_name);
 445 #endif
 446 
 447 protected:
 448   // Returns the class loader data to be used when looking up/updating the
 449   // system dictionary.
 450   static ClassLoaderData *class_loader_data(Handle class_loader) {
 451     return ClassLoaderData::class_loader_data(class_loader());
 452   }
 453 
 454 public:
 455   // Tells whether ClassLoader.checkPackageAccess is present
 456   static bool has_checkPackageAccess()      { return _has_checkPackageAccess; }
 457 
 458   static bool Parameter_klass_loaded()      { return WK_KLASS(reflect_Parameter_klass) != NULL; }
 459   static bool Class_klass_loaded()          { return WK_KLASS(Class_klass) != NULL; }
 460   static bool Cloneable_klass_loaded()      { return WK_KLASS(Cloneable_klass) != NULL; }
 461   static bool Object_klass_loaded()         { return WK_KLASS(Object_klass) != NULL; }
 462   static bool ClassLoader_klass_loaded()    { return WK_KLASS(ClassLoader_klass) != NULL; }
 463 
 464   // Returns java system loader
 465   static oop java_system_loader();


 686   static InstanceKlass* find_class(Symbol* class_name, ClassLoaderData* loader_data);
 687 
 688   // Basic find on classes in the midst of being loaded
 689   static Symbol* find_placeholder(Symbol* name, ClassLoaderData* loader_data);
 690 
 691   // Add a placeholder for a class being loaded
 692   static void add_placeholder(int index,
 693                               Symbol* class_name,
 694                               ClassLoaderData* loader_data);
 695   static void remove_placeholder(int index,
 696                                  Symbol* class_name,
 697                                  ClassLoaderData* loader_data);
 698 
 699   // Performs cleanups after resolve_super_or_fail. This typically needs
 700   // to be called on failure.
 701   // Won't throw, but can block.
 702   static void resolution_cleanups(Symbol* class_name,
 703                                   ClassLoaderData* loader_data,
 704                                   TRAPS);
 705 
 706   // Resolve well_known classes so they can be used like SystemDictionary::String_klass()
 707   static void resolve_well_known_classes(TRAPS);
 708 
 709   // Class loader constraints
 710   static void check_constraints(unsigned int hash,
 711                                 InstanceKlass* k, Handle loader,
 712                                 bool defining, TRAPS);
 713   static void update_dictionary(unsigned int d_hash,
 714                                 int p_index, unsigned int p_hash,
 715                                 InstanceKlass* k, Handle loader,
 716                                 TRAPS);
 717 

 718   static InstanceKlass* _well_known_klasses[];
 719 
 720   // table of box klasses (int_klass, etc.)
 721   static InstanceKlass* _box_klasses[T_VOID+1];
 722 
 723 private:
 724   static oop  _java_system_loader;
 725   static oop  _java_platform_loader;
 726 
 727   static bool _has_checkPackageAccess;
 728 };
 729 
 730 #endif // SHARE_VM_CLASSFILE_SYSTEMDICTIONARY_HPP
< prev index next >