83 class ProtectionDomainCacheTable; |
83 class ProtectionDomainCacheTable; |
84 class ProtectionDomainCacheEntry; |
84 class ProtectionDomainCacheEntry; |
85 class GCTimer; |
85 class GCTimer; |
86 class OopStorage; |
86 class OopStorage; |
87 |
87 |
88 // Certain classes are preloaded, such as java.lang.Object and java.lang.String. |
88 #define WK_KLASS_ENUM_NAME(kname) kname##_knum |
89 // They are all "well-known", in the sense that no class loader is allowed |
89 |
|
90 // Certain classes, such as java.lang.Object and java.lang.String, |
|
91 // are "well-known", in the sense that no class loader is allowed |
90 // to provide a different definition. |
92 // to provide a different definition. |
91 // |
93 // |
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), |
94 // Each well-known class has a short klass name (like object_klass), |
97 // and a vmSymbol name (like java_lang_Object). |
95 // and a vmSymbol name (like java_lang_Object). |
98 // The order of these definitions is significant; it is the order in which |
96 // |
99 // preloading is actually performed by resolve_preloaded_classes. |
97 // The order of these definitions is significant: the classes are |
100 |
98 // resolved during early VM start-up by resolve_well_known_classes |
|
99 // in this order. Changing the order may require careful restructuring |
|
100 // of the VM start-up sequence. |
|
101 // |
101 #define WK_KLASSES_DO(do_klass) \ |
102 #define WK_KLASSES_DO(do_klass) \ |
102 /* well-known classes */ \ |
103 /* well-known classes */ \ |
103 do_klass(Object_klass, java_lang_Object ) \ |
104 do_klass(Object_klass, java_lang_Object ) \ |
104 do_klass(String_klass, java_lang_String ) \ |
105 do_klass(String_klass, java_lang_String ) \ |
105 do_klass(Class_klass, java_lang_Class ) \ |
106 do_klass(Class_klass, java_lang_Class ) \ |
125 do_klass(OutOfMemoryError_klass, java_lang_OutOfMemoryError ) \ |
126 do_klass(OutOfMemoryError_klass, java_lang_OutOfMemoryError ) \ |
126 do_klass(StackOverflowError_klass, java_lang_StackOverflowError ) \ |
127 do_klass(StackOverflowError_klass, java_lang_StackOverflowError ) \ |
127 do_klass(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException ) \ |
128 do_klass(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException ) \ |
128 do_klass(Reference_klass, java_lang_ref_Reference ) \ |
129 do_klass(Reference_klass, java_lang_ref_Reference ) \ |
129 \ |
130 \ |
130 /* Preload ref klasses and set reference types */ \ |
131 /* ref klasses and set reference types */ \ |
131 do_klass(SoftReference_klass, java_lang_ref_SoftReference ) \ |
132 do_klass(SoftReference_klass, java_lang_ref_SoftReference ) \ |
132 do_klass(WeakReference_klass, java_lang_ref_WeakReference ) \ |
133 do_klass(WeakReference_klass, java_lang_ref_WeakReference ) \ |
133 do_klass(FinalReference_klass, java_lang_ref_FinalReference ) \ |
134 do_klass(FinalReference_klass, java_lang_ref_FinalReference ) \ |
134 do_klass(PhantomReference_klass, java_lang_ref_PhantomReference ) \ |
135 do_klass(PhantomReference_klass, java_lang_ref_PhantomReference ) \ |
135 do_klass(Finalizer_klass, java_lang_ref_Finalizer ) \ |
136 do_klass(Finalizer_klass, java_lang_ref_Finalizer ) \ |
198 do_klass(LiveStackFrameInfo_klass, java_lang_LiveStackFrameInfo ) \ |
199 do_klass(LiveStackFrameInfo_klass, java_lang_LiveStackFrameInfo ) \ |
199 \ |
200 \ |
200 /* support for stack dump lock analysis */ \ |
201 /* support for stack dump lock analysis */ \ |
201 do_klass(java_util_concurrent_locks_AbstractOwnableSynchronizer_klass, java_util_concurrent_locks_AbstractOwnableSynchronizer) \ |
202 do_klass(java_util_concurrent_locks_AbstractOwnableSynchronizer_klass, java_util_concurrent_locks_AbstractOwnableSynchronizer) \ |
202 \ |
203 \ |
203 /* Preload boxing klasses */ \ |
204 /* boxing klasses */ \ |
204 do_klass(Boolean_klass, java_lang_Boolean ) \ |
205 do_klass(Boolean_klass, java_lang_Boolean ) \ |
205 do_klass(Character_klass, java_lang_Character ) \ |
206 do_klass(Character_klass, java_lang_Character ) \ |
206 do_klass(Float_klass, java_lang_Float ) \ |
207 do_klass(Float_klass, java_lang_Float ) \ |
207 do_klass(Double_klass, java_lang_Double ) \ |
208 do_klass(Double_klass, java_lang_Double ) \ |
208 do_klass(Byte_klass, java_lang_Byte ) \ |
209 do_klass(Byte_klass, java_lang_Byte ) \ |
389 static void verify(); |
390 static void verify(); |
390 |
391 |
391 // Initialization |
392 // Initialization |
392 static void initialize(TRAPS); |
393 static void initialize(TRAPS); |
393 |
394 |
394 // Checked fast access to commonly used classes - mostly preloaded |
395 // Checked fast access to the well-known classes -- so that you don't try to use them |
|
396 // before they are resolved. |
395 static InstanceKlass* check_klass(InstanceKlass* k) { |
397 static InstanceKlass* check_klass(InstanceKlass* k) { |
396 assert(k != NULL, "klass not loaded"); |
398 assert(k != NULL, "klass not loaded"); |
397 return k; |
399 return k; |
398 } |
400 } |
399 |
401 |
433 static InstanceKlass* box_klass(BasicType t) { |
435 static InstanceKlass* box_klass(BasicType t) { |
434 assert((uint)t < T_VOID+1, "range check"); |
436 assert((uint)t < T_VOID+1, "range check"); |
435 return check_klass(_box_klasses[t]); |
437 return check_klass(_box_klasses[t]); |
436 } |
438 } |
437 static BasicType box_klass_type(Klass* k); // inverse of box_klass |
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 |
438 |
446 |
439 protected: |
447 protected: |
440 // Returns the class loader data to be used when looking up/updating the |
448 // Returns the class loader data to be used when looking up/updating the |
441 // system dictionary. |
449 // system dictionary. |
442 static ClassLoaderData *class_loader_data(Handle class_loader) { |
450 static ClassLoaderData *class_loader_data(Handle class_loader) { |
693 // Won't throw, but can block. |
701 // Won't throw, but can block. |
694 static void resolution_cleanups(Symbol* class_name, |
702 static void resolution_cleanups(Symbol* class_name, |
695 ClassLoaderData* loader_data, |
703 ClassLoaderData* loader_data, |
696 TRAPS); |
704 TRAPS); |
697 |
705 |
698 // Resolve preloaded classes so they can be used like SystemDictionary::String_klass() |
706 // Resolve well-known classes so they can be used like SystemDictionary::String_klass() |
699 static void resolve_preloaded_classes(TRAPS); |
707 static void resolve_well_known_classes(TRAPS); |
700 |
708 |
701 // Class loader constraints |
709 // Class loader constraints |
702 static void check_constraints(unsigned int hash, |
710 static void check_constraints(unsigned int hash, |
703 InstanceKlass* k, Handle loader, |
711 InstanceKlass* k, Handle loader, |
704 bool defining, TRAPS); |
712 bool defining, TRAPS); |
705 static void update_dictionary(unsigned int d_hash, |
713 static void update_dictionary(unsigned int d_hash, |
706 int p_index, unsigned int p_hash, |
714 int p_index, unsigned int p_hash, |
707 InstanceKlass* k, Handle loader, |
715 InstanceKlass* k, Handle loader, |
708 TRAPS); |
716 TRAPS); |
709 |
717 |
710 // Variables holding commonly used klasses (preloaded) |
|
711 static InstanceKlass* _well_known_klasses[]; |
718 static InstanceKlass* _well_known_klasses[]; |
712 |
719 |
713 // table of box klasses (int_klass, etc.) |
720 // table of box klasses (int_klass, etc.) |
714 static InstanceKlass* _box_klasses[T_VOID+1]; |
721 static InstanceKlass* _box_klasses[T_VOID+1]; |
715 |
722 |