401 |
401 |
402 // Initialization |
402 // Initialization |
403 static void initialize(TRAPS); |
403 static void initialize(TRAPS); |
404 |
404 |
405 // Fast access to commonly used classes (preloaded) |
405 // Fast access to commonly used classes (preloaded) |
406 static Klass* check_klass(Klass* k) { |
406 static InstanceKlass* check_klass(InstanceKlass* k) { |
407 assert(k != NULL, "preloaded klass not initialized"); |
407 assert(k != NULL, "preloaded klass not initialized"); |
408 return k; |
408 return k; |
409 } |
409 } |
410 |
410 |
411 static Klass* check_klass_Pre( Klass* k) { return check_klass(k); } |
411 static InstanceKlass* check_klass_Pre(InstanceKlass* k) { return check_klass(k); } |
412 static Klass* check_klass_Opt( Klass* k) { return k; } |
412 static InstanceKlass* check_klass_Opt(InstanceKlass* k) { return k; } |
413 |
413 |
414 JVMCI_ONLY(static Klass* check_klass_Jvmci(Klass* k) { return k; }) |
414 JVMCI_ONLY(static InstanceKlass* check_klass_Jvmci(InstanceKlass* k) { return k; }) |
415 |
415 |
416 static bool initialize_wk_klass(WKID id, int init_opt, TRAPS); |
416 static bool initialize_wk_klass(WKID id, int init_opt, TRAPS); |
417 static void initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS); |
417 static void initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS); |
418 static void initialize_wk_klasses_through(WKID end_id, WKID &start_id, TRAPS) { |
418 static void initialize_wk_klasses_through(WKID end_id, WKID &start_id, TRAPS) { |
419 int limit = (int)end_id + 1; |
419 int limit = (int)end_id + 1; |
420 initialize_wk_klasses_until((WKID) limit, start_id, THREAD); |
420 initialize_wk_klasses_until((WKID) limit, start_id, THREAD); |
421 } |
421 } |
422 |
422 |
423 public: |
423 public: |
424 #define WK_KLASS_DECLARE(name, symbol, option) \ |
424 #define WK_KLASS_DECLARE(name, symbol, option) \ |
425 static Klass* name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \ |
425 static InstanceKlass* name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \ |
426 static Klass** name##_addr() { \ |
426 static InstanceKlass** name##_addr() { \ |
427 return &SystemDictionary::_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]; \ |
427 return &SystemDictionary::_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]; \ |
428 } |
428 } |
429 WK_KLASSES_DO(WK_KLASS_DECLARE); |
429 WK_KLASSES_DO(WK_KLASS_DECLARE); |
430 #undef WK_KLASS_DECLARE |
430 #undef WK_KLASS_DECLARE |
431 |
431 |
432 static Klass* well_known_klass(WKID id) { |
432 static InstanceKlass* well_known_klass(WKID id) { |
433 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
433 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
434 return _well_known_klasses[id]; |
434 return _well_known_klasses[id]; |
435 } |
435 } |
436 |
436 |
437 static Klass** well_known_klass_addr(WKID id) { |
437 static InstanceKlass** well_known_klass_addr(WKID id) { |
438 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
438 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
439 return &_well_known_klasses[id]; |
439 return &_well_known_klasses[id]; |
440 } |
440 } |
441 |
441 |
442 // Local definition for direct access to the private array: |
442 // Local definition for direct access to the private array: |
443 #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)] |
443 #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)] |
444 |
444 |
445 static Klass* box_klass(BasicType t) { |
445 static InstanceKlass* box_klass(BasicType t) { |
446 assert((uint)t < T_VOID+1, "range check"); |
446 assert((uint)t < T_VOID+1, "range check"); |
447 return check_klass(_box_klasses[t]); |
447 return check_klass(_box_klasses[t]); |
448 } |
448 } |
449 static BasicType box_klass_type(Klass* k); // inverse of box_klass |
449 static BasicType box_klass_type(Klass* k); // inverse of box_klass |
450 |
450 |
451 // methods returning lazily loaded klasses |
451 // methods returning lazily loaded klasses |
452 // The corresponding method to load the class must be called before calling them. |
452 // The corresponding method to load the class must be called before calling them. |
453 static Klass* abstract_ownable_synchronizer_klass() { return check_klass(_abstract_ownable_synchronizer_klass); } |
453 static InstanceKlass* abstract_ownable_synchronizer_klass() { return check_klass(_abstract_ownable_synchronizer_klass); } |
454 |
454 |
455 static void load_abstract_ownable_synchronizer_klass(TRAPS); |
455 static void load_abstract_ownable_synchronizer_klass(TRAPS); |
456 |
456 |
457 protected: |
457 protected: |
458 // Tells whether ClassLoader.loadClassInternal is present |
458 // Tells whether ClassLoader.loadClassInternal is present |
698 int p_index, unsigned int p_hash, |
698 int p_index, unsigned int p_hash, |
699 instanceKlassHandle k, Handle loader, |
699 instanceKlassHandle k, Handle loader, |
700 TRAPS); |
700 TRAPS); |
701 |
701 |
702 // Variables holding commonly used klasses (preloaded) |
702 // Variables holding commonly used klasses (preloaded) |
703 static Klass* _well_known_klasses[]; |
703 static InstanceKlass* _well_known_klasses[]; |
704 |
704 |
705 // Lazily loaded klasses |
705 // Lazily loaded klasses |
706 static Klass* volatile _abstract_ownable_synchronizer_klass; |
706 static InstanceKlass* volatile _abstract_ownable_synchronizer_klass; |
707 |
707 |
708 // table of box klasses (int_klass, etc.) |
708 // table of box klasses (int_klass, etc.) |
709 static Klass* _box_klasses[T_VOID+1]; |
709 static InstanceKlass* _box_klasses[T_VOID+1]; |
710 |
710 |
711 static oop _java_system_loader; |
711 static oop _java_system_loader; |
712 |
712 |
713 static bool _has_loadClassInternal; |
713 static bool _has_loadClassInternal; |
714 static bool _has_checkPackageAccess; |
714 static bool _has_checkPackageAccess; |