hotspot/src/share/vm/classfile/systemDictionary.cpp
Print this page
rev 611 : Merge
*** 1,10 ****
#ifdef USE_PRAGMA_IDENT_SRC
#pragma ident "@(#)systemDictionary.cpp 1.367 08/01/17 09:41:11 JVM"
#endif
/*
! * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,10 ----
#ifdef USE_PRAGMA_IDENT_SRC
#pragma ident "@(#)systemDictionary.cpp 1.367 08/01/17 09:41:11 JVM"
#endif
/*
! * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 38,112 ****
int SystemDictionary::_number_of_modifications = 0;
oop SystemDictionary::_system_loader_lock_obj = NULL;
! klassOop SystemDictionary::_object_klass = NULL;
! klassOop SystemDictionary::_string_klass = NULL;
! klassOop SystemDictionary::_class_klass = NULL;
! klassOop SystemDictionary::_cloneable_klass = NULL;
! klassOop SystemDictionary::_classloader_klass = NULL;
! klassOop SystemDictionary::_serializable_klass = NULL;
! klassOop SystemDictionary::_system_klass = NULL;
!
! klassOop SystemDictionary::_throwable_klass = NULL;
! klassOop SystemDictionary::_error_klass = NULL;
! klassOop SystemDictionary::_threaddeath_klass = NULL;
! klassOop SystemDictionary::_exception_klass = NULL;
! klassOop SystemDictionary::_runtime_exception_klass = NULL;
! klassOop SystemDictionary::_classNotFoundException_klass = NULL;
! klassOop SystemDictionary::_noClassDefFoundError_klass = NULL;
! klassOop SystemDictionary::_linkageError_klass = NULL;
! klassOop SystemDictionary::_classCastException_klass = NULL;
! klassOop SystemDictionary::_arrayStoreException_klass = NULL;
! klassOop SystemDictionary::_virtualMachineError_klass = NULL;
! klassOop SystemDictionary::_outOfMemoryError_klass = NULL;
! klassOop SystemDictionary::_StackOverflowError_klass = NULL;
! klassOop SystemDictionary::_illegalMonitorStateException_klass = NULL;
! klassOop SystemDictionary::_protectionDomain_klass = NULL;
! klassOop SystemDictionary::_AccessControlContext_klass = NULL;
!
! klassOop SystemDictionary::_reference_klass = NULL;
! klassOop SystemDictionary::_soft_reference_klass = NULL;
! klassOop SystemDictionary::_weak_reference_klass = NULL;
! klassOop SystemDictionary::_final_reference_klass = NULL;
! klassOop SystemDictionary::_phantom_reference_klass = NULL;
! klassOop SystemDictionary::_finalizer_klass = NULL;
!
! klassOop SystemDictionary::_thread_klass = NULL;
! klassOop SystemDictionary::_threadGroup_klass = NULL;
! klassOop SystemDictionary::_properties_klass = NULL;
! klassOop SystemDictionary::_reflect_accessible_object_klass = NULL;
! klassOop SystemDictionary::_reflect_field_klass = NULL;
! klassOop SystemDictionary::_reflect_method_klass = NULL;
! klassOop SystemDictionary::_reflect_constructor_klass = NULL;
! klassOop SystemDictionary::_reflect_magic_klass = NULL;
! klassOop SystemDictionary::_reflect_method_accessor_klass = NULL;
! klassOop SystemDictionary::_reflect_constructor_accessor_klass = NULL;
! klassOop SystemDictionary::_reflect_delegating_classloader_klass = NULL;
! klassOop SystemDictionary::_reflect_constant_pool_klass = NULL;
! klassOop SystemDictionary::_reflect_unsafe_static_field_accessor_impl_klass = NULL;
!
! klassOop SystemDictionary::_vector_klass = NULL;
! klassOop SystemDictionary::_hashtable_klass = NULL;
! klassOop SystemDictionary::_stringBuffer_klass = NULL;
!
! klassOop SystemDictionary::_stackTraceElement_klass = NULL;
!
! klassOop SystemDictionary::_java_nio_Buffer_klass = NULL;
!
! klassOop SystemDictionary::_sun_misc_AtomicLongCSImpl_klass = NULL;
! klassOop SystemDictionary::_sun_jkernel_DownloadManager_klass = NULL;
!
! klassOop SystemDictionary::_boolean_klass = NULL;
! klassOop SystemDictionary::_char_klass = NULL;
! klassOop SystemDictionary::_float_klass = NULL;
! klassOop SystemDictionary::_double_klass = NULL;
! klassOop SystemDictionary::_byte_klass = NULL;
! klassOop SystemDictionary::_short_klass = NULL;
! klassOop SystemDictionary::_int_klass = NULL;
! klassOop SystemDictionary::_long_klass = NULL;
klassOop SystemDictionary::_box_klasses[T_VOID+1] = { NULL /*, NULL...*/ };
oop SystemDictionary::_java_system_loader = NULL;
bool SystemDictionary::_has_loadClassInternal = false;
--- 38,50 ----
int SystemDictionary::_number_of_modifications = 0;
oop SystemDictionary::_system_loader_lock_obj = NULL;
! klassOop SystemDictionary::_well_known_klasses[SystemDictionary::WKID_LIMIT]
! = { NULL /*, NULL...*/ };
!
klassOop SystemDictionary::_box_klasses[T_VOID+1] = { NULL /*, NULL...*/ };
oop SystemDictionary::_java_system_loader = NULL;
bool SystemDictionary::_has_loadClassInternal = false;
*** 122,135 ****
oop SystemDictionary::java_system_loader() {
return _java_system_loader;
}
void SystemDictionary::compute_java_system_loader(TRAPS) {
! KlassHandle system_klass(THREAD, _classloader_klass);
JavaValue result(T_OBJECT);
JavaCalls::call_static(&result,
! KlassHandle(THREAD, _classloader_klass),
vmSymbolHandles::getSystemClassLoader_name(),
vmSymbolHandles::void_classloader_signature(),
CHECK);
_java_system_loader = (oop)result.get_jobject();
--- 60,73 ----
oop SystemDictionary::java_system_loader() {
return _java_system_loader;
}
void SystemDictionary::compute_java_system_loader(TRAPS) {
! KlassHandle system_klass(THREAD, WK_KLASS(classloader_klass));
JavaValue result(T_OBJECT);
JavaCalls::call_static(&result,
! KlassHandle(THREAD, WK_KLASS(classloader_klass)),
vmSymbolHandles::getSystemClassLoader_name(),
vmSymbolHandles::void_classloader_signature(),
CHECK);
_java_system_loader = (oop)result.get_jobject();
*** 293,302 ****
--- 231,249 ----
Handle class_loader,
Handle protection_domain,
bool is_superclass,
TRAPS) {
+ // Try to get one of the well-known klasses.
+ // They are trusted, and do not participate in circularities.
+ if (LinkWellKnownClasses) {
+ klassOop k = find_well_known_klass(class_name());
+ if (k != NULL) {
+ return k;
+ }
+ }
+
// Double-check, if child class is already loaded, just return super-class,interface
// Don't add a placedholder if already loaded, i.e. already in system dictionary
// Make sure there's a placeholder for the *child* before resolving.
// Used as a claim that this thread is currently loading superclass/classloader
// Used here for ClassCircularity checks and also for heap verification
*** 920,929 ****
--- 867,885 ----
Handle class_loader,
Handle protection_domain,
TRAPS) {
klassOop k = NULL;
assert(class_name() != NULL, "class name must be non NULL");
+
+ // Try to get one of the well-known klasses.
+ if (LinkWellKnownClasses) {
+ k = find_well_known_klass(class_name());
+ if (k != NULL) {
+ return k;
+ }
+ }
+
if (FieldType::is_array(class_name())) {
// The name refers to an array. Parse the name.
jint dimension;
symbolOop object_key;
*** 943,959 ****
--- 899,949 ----
k = find(class_name, class_loader, protection_domain, THREAD);
}
return k;
}
+ // Quick range check for names of well-known classes:
+ static symbolOop wk_klass_name_limits[2] = {NULL, NULL};
+
+ #ifndef PRODUCT
+ static int find_wkk_calls, find_wkk_probes, find_wkk_wins;
+ // counts for "hello world": 3983, 1616, 1075
+ // => 60% hit after limit guard, 25% total win rate
+ #endif
+
+ klassOop SystemDictionary::find_well_known_klass(symbolOop class_name) {
+ // A bounds-check on class_name will quickly get a negative result.
+ NOT_PRODUCT(find_wkk_calls++);
+ if (class_name >= wk_klass_name_limits[0] &&
+ class_name <= wk_klass_name_limits[1]) {
+ NOT_PRODUCT(find_wkk_probes++);
+ vmSymbols::SID sid = vmSymbols::find_sid(class_name);
+ if (sid != vmSymbols::NO_SID) {
+ klassOop k = NULL;
+ switch (sid) {
+ #define WK_KLASS_CASE(name, symbol, ignore_option) \
+ case vmSymbols::VM_SYMBOL_ENUM_NAME(symbol): \
+ k = WK_KLASS(name); break;
+ WK_KLASSES_DO(WK_KLASS_CASE)
+ #undef WK_KLASS_CASE
+ }
+ NOT_PRODUCT(if (k != NULL) find_wkk_wins++);
+ return k;
+ }
+ }
+ return NULL;
+ }
+
// Note: this method is much like resolve_from_stream, but
// updates no supplemental data structures.
// TODO consolidate the two methods with a helper routine?
klassOop SystemDictionary::parse_stream(symbolHandle class_name,
Handle class_loader,
Handle protection_domain,
ClassFileStream* st,
+ KlassHandle host_klass,
+ GrowableArray<Handle>* cp_patches,
TRAPS) {
symbolHandle parsed_name;
// Parse the stream. Note that we do this even though this klass might
// already be present in the SystemDictionary, otherwise we would not
*** 966,979 ****
// java.lang.Object through resolve_or_fail, not this path.
instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
class_loader,
protection_domain,
parsed_name,
THREAD);
-
// We don't redefine the class, so we just need to clean up whether there
// was an error or not (don't want to modify any system dictionary
// data structures).
// Parsed name could be null if we threw an error before we got far
// enough along to parse it -- in that case, there is nothing to clean up.
--- 956,969 ----
// java.lang.Object through resolve_or_fail, not this path.
instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
class_loader,
protection_domain,
+ cp_patches,
parsed_name,
THREAD);
// We don't redefine the class, so we just need to clean up whether there
// was an error or not (don't want to modify any system dictionary
// data structures).
// Parsed name could be null if we threw an error before we got far
// enough along to parse it -- in that case, there is nothing to clean up.
*** 986,995 ****
--- 976,1009 ----
placeholders()->find_and_remove(p_index, p_hash, parsed_name, class_loader, THREAD);
SystemDictionary_lock->notify_all();
}
}
+ if (host_klass.not_null() && k.not_null()) {
+ assert(AnonymousClasses, "");
+ // If it's anonymous, initialize it now, since nobody else will.
+ k->set_host_klass(host_klass());
+
+ {
+ MutexLocker mu_r(Compile_lock, THREAD);
+
+ // Add to class hierarchy, initialize vtables, and do possible
+ // deoptimizations.
+ add_to_hierarchy(k, CHECK_NULL); // No exception, but can block
+
+ // But, do not add to system dictionary.
+ }
+
+ k->eager_initialize(THREAD);
+
+ // notify jvmti
+ if (JvmtiExport::should_post_class_load()) {
+ assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
+ JvmtiExport::post_class_load((JavaThread *) THREAD, k());
+ }
+ }
+
return k();
}
// Add a klass to the system from a stream (called by jni_DefineClass and
// JVM_DefineClass).
*** 1685,1759 ****
resolution_errors()->oops_do(f);
}
void SystemDictionary::preloaded_oops_do(OopClosure* f) {
! f->do_oop((oop*) &_string_klass);
! f->do_oop((oop*) &_object_klass);
! f->do_oop((oop*) &_class_klass);
! f->do_oop((oop*) &_cloneable_klass);
! f->do_oop((oop*) &_classloader_klass);
! f->do_oop((oop*) &_serializable_klass);
! f->do_oop((oop*) &_system_klass);
!
! f->do_oop((oop*) &_throwable_klass);
! f->do_oop((oop*) &_error_klass);
! f->do_oop((oop*) &_threaddeath_klass);
! f->do_oop((oop*) &_exception_klass);
! f->do_oop((oop*) &_runtime_exception_klass);
! f->do_oop((oop*) &_classNotFoundException_klass);
! f->do_oop((oop*) &_noClassDefFoundError_klass);
! f->do_oop((oop*) &_linkageError_klass);
! f->do_oop((oop*) &_classCastException_klass);
! f->do_oop((oop*) &_arrayStoreException_klass);
! f->do_oop((oop*) &_virtualMachineError_klass);
! f->do_oop((oop*) &_outOfMemoryError_klass);
! f->do_oop((oop*) &_StackOverflowError_klass);
! f->do_oop((oop*) &_illegalMonitorStateException_klass);
! f->do_oop((oop*) &_protectionDomain_klass);
! f->do_oop((oop*) &_AccessControlContext_klass);
!
! f->do_oop((oop*) &_reference_klass);
! f->do_oop((oop*) &_soft_reference_klass);
! f->do_oop((oop*) &_weak_reference_klass);
! f->do_oop((oop*) &_final_reference_klass);
! f->do_oop((oop*) &_phantom_reference_klass);
! f->do_oop((oop*) &_finalizer_klass);
!
! f->do_oop((oop*) &_thread_klass);
! f->do_oop((oop*) &_threadGroup_klass);
! f->do_oop((oop*) &_properties_klass);
! f->do_oop((oop*) &_reflect_accessible_object_klass);
! f->do_oop((oop*) &_reflect_field_klass);
! f->do_oop((oop*) &_reflect_method_klass);
! f->do_oop((oop*) &_reflect_constructor_klass);
! f->do_oop((oop*) &_reflect_magic_klass);
! f->do_oop((oop*) &_reflect_method_accessor_klass);
! f->do_oop((oop*) &_reflect_constructor_accessor_klass);
! f->do_oop((oop*) &_reflect_delegating_classloader_klass);
! f->do_oop((oop*) &_reflect_constant_pool_klass);
! f->do_oop((oop*) &_reflect_unsafe_static_field_accessor_impl_klass);
!
! f->do_oop((oop*) &_stringBuffer_klass);
! f->do_oop((oop*) &_vector_klass);
! f->do_oop((oop*) &_hashtable_klass);
!
! f->do_oop((oop*) &_stackTraceElement_klass);
!
! f->do_oop((oop*) &_java_nio_Buffer_klass);
!
! f->do_oop((oop*) &_sun_misc_AtomicLongCSImpl_klass);
! f->do_oop((oop*) &_sun_jkernel_DownloadManager_klass);
!
! f->do_oop((oop*) &_boolean_klass);
! f->do_oop((oop*) &_char_klass);
! f->do_oop((oop*) &_float_klass);
! f->do_oop((oop*) &_double_klass);
! f->do_oop((oop*) &_byte_klass);
! f->do_oop((oop*) &_short_klass);
! f->do_oop((oop*) &_int_klass);
! f->do_oop((oop*) &_long_klass);
{
for (int i = 0; i < T_VOID+1; i++) {
if (_box_klasses[i] != NULL) {
assert(i >= T_BOOLEAN, "checking");
f->do_oop((oop*) &_box_klasses[i]);
--- 1699,1715 ----
resolution_errors()->oops_do(f);
}
void SystemDictionary::preloaded_oops_do(OopClosure* f) {
! f->do_oop((oop*) &wk_klass_name_limits[0]);
! f->do_oop((oop*) &wk_klass_name_limits[1]);
!
! for (int k = (int)FIRST_WKID; k < (int)WKID_LIMIT; k++) {
! f->do_oop((oop*) &_well_known_klasses[k]);
! }
!
{
for (int i = 0; i < T_VOID+1; i++) {
if (_box_klasses[i] != NULL) {
assert(i >= T_BOOLEAN, "checking");
f->do_oop((oop*) &_box_klasses[i]);
*** 1842,1961 ****
_system_loader_lock_obj = oopFactory::new_system_objArray(0, CHECK);
// Initialize basic classes
initialize_preloaded_classes(CHECK);
}
void SystemDictionary::initialize_preloaded_classes(TRAPS) {
! assert(_object_klass == NULL, "preloaded classes should only be initialized once");
// Preload commonly used klasses
! _object_klass = resolve_or_fail(vmSymbolHandles::java_lang_Object(), true, CHECK);
! _string_klass = resolve_or_fail(vmSymbolHandles::java_lang_String(), true, CHECK);
! _class_klass = resolve_or_fail(vmSymbolHandles::java_lang_Class(), true, CHECK);
! debug_only(instanceKlass::verify_class_klass_nonstatic_oop_maps(_class_klass));
// Fixup mirrors for classes loaded before java.lang.Class.
// These calls iterate over the objects currently in the perm gen
// so calling them at this point is matters (not before when there
// are fewer objects and not later after there are more objects
// in the perm gen.
Universe::initialize_basic_type_mirrors(CHECK);
Universe::fixup_mirrors(CHECK);
! _cloneable_klass = resolve_or_fail(vmSymbolHandles::java_lang_Cloneable(), true, CHECK);
! _classloader_klass = resolve_or_fail(vmSymbolHandles::java_lang_ClassLoader(), true, CHECK);
! _serializable_klass = resolve_or_fail(vmSymbolHandles::java_io_Serializable(), true, CHECK);
! _system_klass = resolve_or_fail(vmSymbolHandles::java_lang_System(), true, CHECK);
!
! _throwable_klass = resolve_or_fail(vmSymbolHandles::java_lang_Throwable(), true, CHECK);
! _error_klass = resolve_or_fail(vmSymbolHandles::java_lang_Error(), true, CHECK);
! _threaddeath_klass = resolve_or_fail(vmSymbolHandles::java_lang_ThreadDeath(), true, CHECK);
! _exception_klass = resolve_or_fail(vmSymbolHandles::java_lang_Exception(), true, CHECK);
! _runtime_exception_klass = resolve_or_fail(vmSymbolHandles::java_lang_RuntimeException(), true, CHECK);
! _protectionDomain_klass = resolve_or_fail(vmSymbolHandles::java_security_ProtectionDomain(), true, CHECK);
! _AccessControlContext_klass = resolve_or_fail(vmSymbolHandles::java_security_AccessControlContext(), true, CHECK);
! _classNotFoundException_klass = resolve_or_fail(vmSymbolHandles::java_lang_ClassNotFoundException(), true, CHECK);
! _noClassDefFoundError_klass = resolve_or_fail(vmSymbolHandles::java_lang_NoClassDefFoundError(), true, CHECK);
! _linkageError_klass = resolve_or_fail(vmSymbolHandles::java_lang_LinkageError(), true, CHECK);
! _classCastException_klass = resolve_or_fail(vmSymbolHandles::java_lang_ClassCastException(), true, CHECK);
! _arrayStoreException_klass = resolve_or_fail(vmSymbolHandles::java_lang_ArrayStoreException(), true, CHECK);
! _virtualMachineError_klass = resolve_or_fail(vmSymbolHandles::java_lang_VirtualMachineError(), true, CHECK);
! _outOfMemoryError_klass = resolve_or_fail(vmSymbolHandles::java_lang_OutOfMemoryError(), true, CHECK);
! _StackOverflowError_klass = resolve_or_fail(vmSymbolHandles::java_lang_StackOverflowError(), true, CHECK);
! _illegalMonitorStateException_klass = resolve_or_fail(vmSymbolHandles::java_lang_IllegalMonitorStateException(), true, CHECK);
// Preload ref klasses and set reference types
! _reference_klass = resolve_or_fail(vmSymbolHandles::java_lang_ref_Reference(), true, CHECK);
! instanceKlass::cast(_reference_klass)->set_reference_type(REF_OTHER);
! instanceRefKlass::update_nonstatic_oop_maps(_reference_klass);
!
! _soft_reference_klass = resolve_or_fail(vmSymbolHandles::java_lang_ref_SoftReference(), true, CHECK);
! instanceKlass::cast(_soft_reference_klass)->set_reference_type(REF_SOFT);
! _weak_reference_klass = resolve_or_fail(vmSymbolHandles::java_lang_ref_WeakReference(), true, CHECK);
! instanceKlass::cast(_weak_reference_klass)->set_reference_type(REF_WEAK);
! _final_reference_klass = resolve_or_fail(vmSymbolHandles::java_lang_ref_FinalReference(), true, CHECK);
! instanceKlass::cast(_final_reference_klass)->set_reference_type(REF_FINAL);
! _phantom_reference_klass = resolve_or_fail(vmSymbolHandles::java_lang_ref_PhantomReference(), true, CHECK);
! instanceKlass::cast(_phantom_reference_klass)->set_reference_type(REF_PHANTOM);
! _finalizer_klass = resolve_or_fail(vmSymbolHandles::java_lang_ref_Finalizer(), true, CHECK);
!
! _thread_klass = resolve_or_fail(vmSymbolHandles::java_lang_Thread(), true, CHECK);
! _threadGroup_klass = resolve_or_fail(vmSymbolHandles::java_lang_ThreadGroup(), true, CHECK);
! _properties_klass = resolve_or_fail(vmSymbolHandles::java_util_Properties(), true, CHECK);
! _reflect_accessible_object_klass = resolve_or_fail(vmSymbolHandles::java_lang_reflect_AccessibleObject(), true, CHECK);
! _reflect_field_klass = resolve_or_fail(vmSymbolHandles::java_lang_reflect_Field(), true, CHECK);
! _reflect_method_klass = resolve_or_fail(vmSymbolHandles::java_lang_reflect_Method(), true, CHECK);
! _reflect_constructor_klass = resolve_or_fail(vmSymbolHandles::java_lang_reflect_Constructor(), true, CHECK);
! // Universe::is_gte_jdk14x_version() is not set up by this point.
! // It's okay if these turn out to be NULL in non-1.4 JDKs.
! _reflect_magic_klass = resolve_or_null(vmSymbolHandles::sun_reflect_MagicAccessorImpl(), CHECK);
! _reflect_method_accessor_klass = resolve_or_null(vmSymbolHandles::sun_reflect_MethodAccessorImpl(), CHECK);
! _reflect_constructor_accessor_klass = resolve_or_null(vmSymbolHandles::sun_reflect_ConstructorAccessorImpl(), CHECK);
! _reflect_delegating_classloader_klass = resolve_or_null(vmSymbolHandles::sun_reflect_DelegatingClassLoader(), CHECK);
! _reflect_constant_pool_klass = resolve_or_null(vmSymbolHandles::sun_reflect_ConstantPool(), CHECK);
! _reflect_unsafe_static_field_accessor_impl_klass = resolve_or_null(vmSymbolHandles::sun_reflect_UnsafeStaticFieldAccessorImpl(), CHECK);
!
! _vector_klass = resolve_or_fail(vmSymbolHandles::java_util_Vector(), true, CHECK);
! _hashtable_klass = resolve_or_fail(vmSymbolHandles::java_util_Hashtable(), true, CHECK);
! _stringBuffer_klass = resolve_or_fail(vmSymbolHandles::java_lang_StringBuffer(), true, CHECK);
!
! // It's NULL in non-1.4 JDKs.
! _stackTraceElement_klass = resolve_or_null(vmSymbolHandles::java_lang_StackTraceElement(), CHECK);
!
! // Universe::is_gte_jdk14x_version() is not set up by this point.
! // It's okay if this turns out to be NULL in non-1.4 JDKs.
! _java_nio_Buffer_klass = resolve_or_null(vmSymbolHandles::java_nio_Buffer(), CHECK);
- // If this class isn't present, it won't be referenced.
- _sun_misc_AtomicLongCSImpl_klass = resolve_or_null(vmSymbolHandles::sun_misc_AtomicLongCSImpl(), CHECK);
#ifdef KERNEL
! _sun_jkernel_DownloadManager_klass = resolve_or_null(vmSymbolHandles::sun_jkernel_DownloadManager(), CHECK);
! if (_sun_jkernel_DownloadManager_klass == NULL) {
warning("Cannot find sun/jkernel/DownloadManager");
}
#endif // KERNEL
-
- // Preload boxing klasses
- _boolean_klass = resolve_or_fail(vmSymbolHandles::java_lang_Boolean(), true, CHECK);
- _char_klass = resolve_or_fail(vmSymbolHandles::java_lang_Character(), true, CHECK);
- _float_klass = resolve_or_fail(vmSymbolHandles::java_lang_Float(), true, CHECK);
- _double_klass = resolve_or_fail(vmSymbolHandles::java_lang_Double(), true, CHECK);
- _byte_klass = resolve_or_fail(vmSymbolHandles::java_lang_Byte(), true, CHECK);
- _short_klass = resolve_or_fail(vmSymbolHandles::java_lang_Short(), true, CHECK);
- _int_klass = resolve_or_fail(vmSymbolHandles::java_lang_Integer(), true, CHECK);
- _long_klass = resolve_or_fail(vmSymbolHandles::java_lang_Long(), true, CHECK);
-
- _box_klasses[T_BOOLEAN] = _boolean_klass;
- _box_klasses[T_CHAR] = _char_klass;
- _box_klasses[T_FLOAT] = _float_klass;
- _box_klasses[T_DOUBLE] = _double_klass;
- _box_klasses[T_BYTE] = _byte_klass;
- _box_klasses[T_SHORT] = _short_klass;
- _box_klasses[T_INT] = _int_klass;
- _box_klasses[T_LONG] = _long_klass;
- //_box_klasses[T_OBJECT] = _object_klass;
- //_box_klasses[T_ARRAY] = _object_klass;
-
{ // Compute whether we should use loadClass or loadClassInternal when loading classes.
methodOop method = instanceKlass::cast(classloader_klass())->find_method(vmSymbols::loadClassInternal_name(), vmSymbols::string_class_signature());
_has_loadClassInternal = (method != NULL);
}
--- 1798,1912 ----
_system_loader_lock_obj = oopFactory::new_system_objArray(0, CHECK);
// Initialize basic classes
initialize_preloaded_classes(CHECK);
}
+ // Compact table of directions on the initialization of klasses:
+ static const short wk_init_info[] = {
+ #define WK_KLASS_INIT_INFO(name, symbol, option) \
+ ( ((int)vmSymbols::VM_SYMBOL_ENUM_NAME(symbol) \
+ << SystemDictionary::CEIL_LG_OPTION_LIMIT) \
+ | (int)SystemDictionary::option ),
+ WK_KLASSES_DO(WK_KLASS_INIT_INFO)
+ #undef WK_KLASS_INIT_INFO
+ 0
+ };
+
+ bool SystemDictionary::initialize_wk_klass(WKID id, int init_opt, TRAPS) {
+ assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
+ int info = wk_init_info[id - FIRST_WKID];
+ int sid = (info >> CEIL_LG_OPTION_LIMIT);
+ symbolHandle symbol = vmSymbolHandles::symbol_handle_at((vmSymbols::SID)sid);
+ klassOop* klassp = &_well_known_klasses[id];
+ bool must_load = (init_opt < SystemDictionary::Opt);
+ bool try_load = true;
+ if (init_opt == SystemDictionary::Opt_Kernel) {
+ #ifndef KERNEL
+ try_load = false;
+ #endif //KERNEL
+ }
+ if ((*klassp) == NULL && try_load) {
+ if (must_load) {
+ (*klassp) = resolve_or_fail(symbol, true, CHECK_0); // load required class
+ } else {
+ (*klassp) = resolve_or_null(symbol, CHECK_0); // load optional klass
+ }
+ }
+ return ((*klassp) != NULL);
+ }
+
+ void SystemDictionary::initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS) {
+ assert((int)start_id <= (int)limit_id, "IDs are out of order!");
+ for (int id = (int)start_id; id < (int)limit_id; id++) {
+ assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
+ int info = wk_init_info[id - FIRST_WKID];
+ int sid = (info >> CEIL_LG_OPTION_LIMIT);
+ int opt = (info & right_n_bits(CEIL_LG_OPTION_LIMIT));
+
+ initialize_wk_klass((WKID)id, opt, CHECK);
+
+ // Update limits, so find_well_known_klass can be very fast:
+ symbolOop s = vmSymbols::symbol_at((vmSymbols::SID)sid);
+ if (wk_klass_name_limits[1] == NULL) {
+ wk_klass_name_limits[0] = wk_klass_name_limits[1] = s;
+ } else if (wk_klass_name_limits[1] < s) {
+ wk_klass_name_limits[1] = s;
+ } else if (wk_klass_name_limits[0] > s) {
+ wk_klass_name_limits[0] = s;
+ }
+ }
+ }
+
void SystemDictionary::initialize_preloaded_classes(TRAPS) {
! assert(WK_KLASS(object_klass) == NULL, "preloaded classes should only be initialized once");
// Preload commonly used klasses
! WKID scan = FIRST_WKID;
! // first do Object, String, Class
! initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(class_klass), scan, CHECK);
!
! debug_only(instanceKlass::verify_class_klass_nonstatic_oop_maps(WK_KLASS(class_klass)));
!
// Fixup mirrors for classes loaded before java.lang.Class.
// These calls iterate over the objects currently in the perm gen
// so calling them at this point is matters (not before when there
// are fewer objects and not later after there are more objects
// in the perm gen.
Universe::initialize_basic_type_mirrors(CHECK);
Universe::fixup_mirrors(CHECK);
! // do a bunch more:
! initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(reference_klass), scan, CHECK);
// Preload ref klasses and set reference types
! instanceKlass::cast(WK_KLASS(reference_klass))->set_reference_type(REF_OTHER);
! instanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(reference_klass));
!
! initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(phantom_reference_klass), scan, CHECK);
! instanceKlass::cast(WK_KLASS(soft_reference_klass))->set_reference_type(REF_SOFT);
! instanceKlass::cast(WK_KLASS(weak_reference_klass))->set_reference_type(REF_WEAK);
! instanceKlass::cast(WK_KLASS(final_reference_klass))->set_reference_type(REF_FINAL);
! instanceKlass::cast(WK_KLASS(phantom_reference_klass))->set_reference_type(REF_PHANTOM);
!
! initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK);
!
! _box_klasses[T_BOOLEAN] = WK_KLASS(boolean_klass);
! _box_klasses[T_CHAR] = WK_KLASS(char_klass);
! _box_klasses[T_FLOAT] = WK_KLASS(float_klass);
! _box_klasses[T_DOUBLE] = WK_KLASS(double_klass);
! _box_klasses[T_BYTE] = WK_KLASS(byte_klass);
! _box_klasses[T_SHORT] = WK_KLASS(short_klass);
! _box_klasses[T_INT] = WK_KLASS(int_klass);
! _box_klasses[T_LONG] = WK_KLASS(long_klass);
! //_box_klasses[T_OBJECT] = WK_KLASS(object_klass);
! //_box_klasses[T_ARRAY] = WK_KLASS(object_klass);
#ifdef KERNEL
! if (sun_jkernel_DownloadManager_klass() == NULL) {
warning("Cannot find sun/jkernel/DownloadManager");
}
#endif // KERNEL
{ // Compute whether we should use loadClass or loadClassInternal when loading classes.
methodOop method = instanceKlass::cast(classloader_klass())->find_method(vmSymbols::loadClassInternal_name(), vmSymbols::string_class_signature());
_has_loadClassInternal = (method != NULL);
}