src/share/vm/classfile/systemDictionary.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 8000263 Sdiff src/share/vm/classfile

src/share/vm/classfile/systemDictionary.cpp

Print this page




 956 
 957 // Quick range check for names of well-known classes:
 958 static Symbol* wk_klass_name_limits[2] = {NULL, NULL};
 959 
 960 #ifndef PRODUCT
 961 static int find_wkk_calls, find_wkk_probes, find_wkk_wins;
 962 // counts for "hello world": 3983, 1616, 1075
 963 //  => 60% hit after limit guard, 25% total win rate
 964 #endif
 965 
 966 Klass* SystemDictionary::find_well_known_klass(Symbol* class_name) {
 967   // A bounds-check on class_name will quickly get a negative result.
 968   NOT_PRODUCT(find_wkk_calls++);
 969   if (class_name >= wk_klass_name_limits[0] &&
 970       class_name <= wk_klass_name_limits[1]) {
 971     NOT_PRODUCT(find_wkk_probes++);
 972     vmSymbols::SID sid = vmSymbols::find_sid(class_name);
 973     if (sid != vmSymbols::NO_SID) {
 974       Klass* k = NULL;
 975       switch (sid) {
 976         #define WK_KLASS_CASE(name, symbol, ignore_option) \
 977         case vmSymbols::VM_SYMBOL_ENUM_NAME(symbol): \
 978           k = WK_KLASS(name); break;



 979         WK_KLASSES_DO(WK_KLASS_CASE)
 980         #undef WK_KLASS_CASE
 981       }
 982       NOT_PRODUCT(if (k != NULL)  find_wkk_wins++);
 983       return k;
 984     }
 985   }
 986   return NULL;
 987 }
 988 
 989 // Note: this method is much like resolve_from_stream, but
 990 // updates no supplemental data structures.
 991 // TODO consolidate the two methods with a helper routine?
 992 Klass* SystemDictionary::parse_stream(Symbol* class_name,
 993                                         Handle class_loader,
 994                                         Handle protection_domain,
 995                                         ClassFileStream* st,
 996                                         KlassHandle host_klass,
 997                                         GrowableArray<Handle>* cp_patches,
 998                                         TRAPS) {


1938     int sid  = (info >> CEIL_LG_OPTION_LIMIT);
1939     int opt  = (info & right_n_bits(CEIL_LG_OPTION_LIMIT));
1940 
1941     initialize_wk_klass((WKID)id, opt, CHECK);
1942 
1943     // Update limits, so find_well_known_klass can be very fast:
1944     Symbol* s = vmSymbols::symbol_at((vmSymbols::SID)sid);
1945     if (wk_klass_name_limits[1] == NULL) {
1946       wk_klass_name_limits[0] = wk_klass_name_limits[1] = s;
1947     } else if (wk_klass_name_limits[1] < s) {
1948       wk_klass_name_limits[1] = s;
1949     } else if (wk_klass_name_limits[0] > s) {
1950       wk_klass_name_limits[0] = s;
1951     }
1952   }
1953 
1954   // move the starting value forward to the limit:
1955   start_id = limit_id;
1956 }
1957 










1958 
1959 void SystemDictionary::initialize_preloaded_classes(TRAPS) {
1960   assert(WK_KLASS(Object_klass) == NULL, "preloaded classes should only be initialized once");
1961   // Preload commonly used klasses
1962   WKID scan = FIRST_WKID;
1963   // first do Object, then String, Class
1964   if (UseSharedSpaces) {
1965     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Object_klass), scan, CHECK);
1966     // Initialize the constant pool for the Object_class
1967     InstanceKlass* ik = InstanceKlass::cast(Object_klass());
1968     ik->constants()->restore_unshareable_info(CHECK);
1969     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK);
1970   } else {
1971     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK);
1972   }
1973 
1974   // Calculate offsets for String and Class classes since they are loaded and
1975   // can be used after this point.
1976   java_lang_String::compute_offsets();
1977   java_lang_Class::compute_offsets();


1993 
1994   initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK);
1995   InstanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT);
1996   InstanceKlass::cast(WK_KLASS(WeakReference_klass))->set_reference_type(REF_WEAK);
1997   InstanceKlass::cast(WK_KLASS(FinalReference_klass))->set_reference_type(REF_FINAL);
1998   InstanceKlass::cast(WK_KLASS(PhantomReference_klass))->set_reference_type(REF_PHANTOM);
1999 
2000   // JSR 292 classes
2001   WKID jsr292_group_start = WK_KLASS_ENUM_NAME(MethodHandle_klass);
2002   WKID jsr292_group_end   = WK_KLASS_ENUM_NAME(VolatileCallSite_klass);
2003   initialize_wk_klasses_until(jsr292_group_start, scan, CHECK);
2004   if (EnableInvokeDynamic) {
2005     initialize_wk_klasses_through(jsr292_group_end, scan, CHECK);
2006   } else {
2007     // Skip the JSR 292 classes, if not enabled.
2008     scan = WKID(jsr292_group_end + 1);
2009   }
2010 
2011   initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK);
2012 


2013   _box_klasses[T_BOOLEAN] = WK_KLASS(Boolean_klass);
2014   _box_klasses[T_CHAR]    = WK_KLASS(Character_klass);
2015   _box_klasses[T_FLOAT]   = WK_KLASS(Float_klass);
2016   _box_klasses[T_DOUBLE]  = WK_KLASS(Double_klass);
2017   _box_klasses[T_BYTE]    = WK_KLASS(Byte_klass);
2018   _box_klasses[T_SHORT]   = WK_KLASS(Short_klass);
2019   _box_klasses[T_INT]     = WK_KLASS(Integer_klass);
2020   _box_klasses[T_LONG]    = WK_KLASS(Long_klass);
2021   //_box_klasses[T_OBJECT]  = WK_KLASS(object_klass);
2022   //_box_klasses[T_ARRAY]   = WK_KLASS(object_klass);
2023 
2024 #ifdef KERNEL
2025   if (DownloadManager_klass() == NULL) {
2026     warning("Cannot find sun/jkernel/DownloadManager");
2027   }
2028 #endif // KERNEL
2029 
2030   { // Compute whether we should use loadClass or loadClassInternal when loading classes.
2031     Method* method = InstanceKlass::cast(ClassLoader_klass())->find_method(vmSymbols::loadClassInternal_name(), vmSymbols::string_class_signature());
2032     _has_loadClassInternal = (method != NULL);




 956 
 957 // Quick range check for names of well-known classes:
 958 static Symbol* wk_klass_name_limits[2] = {NULL, NULL};
 959 
 960 #ifndef PRODUCT
 961 static int find_wkk_calls, find_wkk_probes, find_wkk_wins;
 962 // counts for "hello world": 3983, 1616, 1075
 963 //  => 60% hit after limit guard, 25% total win rate
 964 #endif
 965 
 966 Klass* SystemDictionary::find_well_known_klass(Symbol* class_name) {
 967   // A bounds-check on class_name will quickly get a negative result.
 968   NOT_PRODUCT(find_wkk_calls++);
 969   if (class_name >= wk_klass_name_limits[0] &&
 970       class_name <= wk_klass_name_limits[1]) {
 971     NOT_PRODUCT(find_wkk_probes++);
 972     vmSymbols::SID sid = vmSymbols::find_sid(class_name);
 973     if (sid != vmSymbols::NO_SID) {
 974       Klass* k = NULL;
 975       switch (sid) {
 976         #define WK_KLASS_CASE(name, symbol, option) \
 977         case vmSymbols::VM_SYMBOL_ENUM_NAME(symbol): \
 978           if (option == Pre_Link) { \
 979             k = WK_KLASS(name); \
 980           } \
 981           break;
 982         WK_KLASSES_DO(WK_KLASS_CASE)
 983         #undef WK_KLASS_CASE
 984       }
 985       NOT_PRODUCT(if (k != NULL)  find_wkk_wins++);
 986       return k;
 987     }
 988   }
 989   return NULL;
 990 }
 991 
 992 // Note: this method is much like resolve_from_stream, but
 993 // updates no supplemental data structures.
 994 // TODO consolidate the two methods with a helper routine?
 995 Klass* SystemDictionary::parse_stream(Symbol* class_name,
 996                                         Handle class_loader,
 997                                         Handle protection_domain,
 998                                         ClassFileStream* st,
 999                                         KlassHandle host_klass,
1000                                         GrowableArray<Handle>* cp_patches,
1001                                         TRAPS) {


1941     int sid  = (info >> CEIL_LG_OPTION_LIMIT);
1942     int opt  = (info & right_n_bits(CEIL_LG_OPTION_LIMIT));
1943 
1944     initialize_wk_klass((WKID)id, opt, CHECK);
1945 
1946     // Update limits, so find_well_known_klass can be very fast:
1947     Symbol* s = vmSymbols::symbol_at((vmSymbols::SID)sid);
1948     if (wk_klass_name_limits[1] == NULL) {
1949       wk_klass_name_limits[0] = wk_klass_name_limits[1] = s;
1950     } else if (wk_klass_name_limits[1] < s) {
1951       wk_klass_name_limits[1] = s;
1952     } else if (wk_klass_name_limits[0] > s) {
1953       wk_klass_name_limits[0] = s;
1954     }
1955   }
1956 
1957   // move the starting value forward to the limit:
1958   start_id = limit_id;
1959 }
1960 
1961 #ifdef ASSERT
1962 void SystemDictionary::check_wk_pre_link_klasses() {
1963   #define WK_KLASS_CHECK(name, symbol, option) \
1964     if (option == Pre_Link) { \
1965       assert(name()->is_public(), ""); \
1966     }
1967   WK_KLASSES_DO(WK_KLASS_CHECK);
1968   #undef WK_KLASS_CHECK
1969 }
1970 #endif
1971 
1972 void SystemDictionary::initialize_preloaded_classes(TRAPS) {
1973   assert(WK_KLASS(Object_klass) == NULL, "preloaded classes should only be initialized once");
1974   // Preload commonly used klasses
1975   WKID scan = FIRST_WKID;
1976   // first do Object, then String, Class
1977   if (UseSharedSpaces) {
1978     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Object_klass), scan, CHECK);
1979     // Initialize the constant pool for the Object_class
1980     InstanceKlass* ik = InstanceKlass::cast(Object_klass());
1981     ik->constants()->restore_unshareable_info(CHECK);
1982     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK);
1983   } else {
1984     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK);
1985   }
1986 
1987   // Calculate offsets for String and Class classes since they are loaded and
1988   // can be used after this point.
1989   java_lang_String::compute_offsets();
1990   java_lang_Class::compute_offsets();


2006 
2007   initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK);
2008   InstanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT);
2009   InstanceKlass::cast(WK_KLASS(WeakReference_klass))->set_reference_type(REF_WEAK);
2010   InstanceKlass::cast(WK_KLASS(FinalReference_klass))->set_reference_type(REF_FINAL);
2011   InstanceKlass::cast(WK_KLASS(PhantomReference_klass))->set_reference_type(REF_PHANTOM);
2012 
2013   // JSR 292 classes
2014   WKID jsr292_group_start = WK_KLASS_ENUM_NAME(MethodHandle_klass);
2015   WKID jsr292_group_end   = WK_KLASS_ENUM_NAME(VolatileCallSite_klass);
2016   initialize_wk_klasses_until(jsr292_group_start, scan, CHECK);
2017   if (EnableInvokeDynamic) {
2018     initialize_wk_klasses_through(jsr292_group_end, scan, CHECK);
2019   } else {
2020     // Skip the JSR 292 classes, if not enabled.
2021     scan = WKID(jsr292_group_end + 1);
2022   }
2023 
2024   initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK);
2025 
2026   check_wk_pre_link_klasses();
2027 
2028   _box_klasses[T_BOOLEAN] = WK_KLASS(Boolean_klass);
2029   _box_klasses[T_CHAR]    = WK_KLASS(Character_klass);
2030   _box_klasses[T_FLOAT]   = WK_KLASS(Float_klass);
2031   _box_klasses[T_DOUBLE]  = WK_KLASS(Double_klass);
2032   _box_klasses[T_BYTE]    = WK_KLASS(Byte_klass);
2033   _box_klasses[T_SHORT]   = WK_KLASS(Short_klass);
2034   _box_klasses[T_INT]     = WK_KLASS(Integer_klass);
2035   _box_klasses[T_LONG]    = WK_KLASS(Long_klass);
2036   //_box_klasses[T_OBJECT]  = WK_KLASS(object_klass);
2037   //_box_klasses[T_ARRAY]   = WK_KLASS(object_klass);
2038 
2039 #ifdef KERNEL
2040   if (DownloadManager_klass() == NULL) {
2041     warning("Cannot find sun/jkernel/DownloadManager");
2042   }
2043 #endif // KERNEL
2044 
2045   { // Compute whether we should use loadClass or loadClassInternal when loading classes.
2046     Method* method = InstanceKlass::cast(ClassLoader_klass())->find_method(vmSymbols::loadClassInternal_name(), vmSymbols::string_class_signature());
2047     _has_loadClassInternal = (method != NULL);


src/share/vm/classfile/systemDictionary.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File