1961 resolve_preloaded_classes(CHECK); |
1961 resolve_preloaded_classes(CHECK); |
1962 } |
1962 } |
1963 |
1963 |
1964 // Compact table of directions on the initialization of klasses: |
1964 // Compact table of directions on the initialization of klasses: |
1965 static const short wk_init_info[] = { |
1965 static const short wk_init_info[] = { |
1966 #define WK_KLASS_INIT_INFO(name, symbol, option) \ |
1966 #define WK_KLASS_INIT_INFO(name, symbol) \ |
1967 ( ((int)vmSymbols::VM_SYMBOL_ENUM_NAME(symbol) \ |
1967 ((short)vmSymbols::VM_SYMBOL_ENUM_NAME(symbol)), |
1968 << SystemDictionary::CEIL_LG_OPTION_LIMIT) \ |
1968 |
1969 | (int)SystemDictionary::option ), |
|
1970 WK_KLASSES_DO(WK_KLASS_INIT_INFO) |
1969 WK_KLASSES_DO(WK_KLASS_INIT_INFO) |
1971 #undef WK_KLASS_INIT_INFO |
1970 #undef WK_KLASS_INIT_INFO |
1972 0 |
1971 0 |
1973 }; |
1972 }; |
1974 |
1973 |
1975 bool SystemDictionary::resolve_wk_klass(WKID id, int init_opt, TRAPS) { |
1974 bool SystemDictionary::resolve_wk_klass(WKID id, TRAPS) { |
1976 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
1975 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
1977 int info = wk_init_info[id - FIRST_WKID]; |
1976 int sid = wk_init_info[id - FIRST_WKID]; |
1978 int sid = (info >> CEIL_LG_OPTION_LIMIT); |
|
1979 Symbol* symbol = vmSymbols::symbol_at((vmSymbols::SID)sid); |
1977 Symbol* symbol = vmSymbols::symbol_at((vmSymbols::SID)sid); |
1980 InstanceKlass** klassp = &_well_known_klasses[id]; |
1978 InstanceKlass** klassp = &_well_known_klasses[id]; |
1981 |
1979 |
1982 bool must_load; |
1980 |
1983 #if INCLUDE_JVMCI |
1981 #if INCLUDE_JVMCI |
1984 if (EnableJVMCI) { |
1982 if (id >= FIRST_JVMCI_WKID) { |
1985 // If JVMCI is enabled we require its classes to be found. |
1983 assert(EnableJVMCI, "resolve JVMCI classes only when EnableJVMCI is true"); |
1986 must_load = (init_opt < SystemDictionary::Opt) || (init_opt == SystemDictionary::Jvmci); |
1984 } |
1987 } else |
|
1988 #endif |
1985 #endif |
1989 { |
|
1990 must_load = (init_opt < SystemDictionary::Opt); |
|
1991 } |
|
1992 |
1986 |
1993 if ((*klassp) == NULL) { |
1987 if ((*klassp) == NULL) { |
1994 Klass* k; |
1988 Klass* k = resolve_or_fail(symbol, true, CHECK_0); |
1995 if (must_load) { |
1989 (*klassp) = InstanceKlass::cast(k); |
1996 k = resolve_or_fail(symbol, true, CHECK_0); // load required class |
|
1997 } else { |
|
1998 k = resolve_or_null(symbol, CHECK_0); // load optional klass |
|
1999 } |
|
2000 (*klassp) = (k == NULL) ? NULL : InstanceKlass::cast(k); |
|
2001 } |
1990 } |
2002 return ((*klassp) != NULL); |
1991 return ((*klassp) != NULL); |
2003 } |
1992 } |
2004 |
1993 |
2005 void SystemDictionary::resolve_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS) { |
1994 void SystemDictionary::resolve_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS) { |
2006 assert((int)start_id <= (int)limit_id, "IDs are out of order!"); |
1995 assert((int)start_id <= (int)limit_id, "IDs are out of order!"); |
2007 for (int id = (int)start_id; id < (int)limit_id; id++) { |
1996 for (int id = (int)start_id; id < (int)limit_id; id++) { |
2008 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
1997 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); |
2009 int info = wk_init_info[id - FIRST_WKID]; |
1998 resolve_wk_klass((WKID)id, CHECK); |
2010 int sid = (info >> CEIL_LG_OPTION_LIMIT); |
|
2011 int opt = (info & right_n_bits(CEIL_LG_OPTION_LIMIT)); |
|
2012 |
|
2013 resolve_wk_klass((WKID)id, opt, CHECK); |
|
2014 } |
1999 } |
2015 |
2000 |
2016 // move the starting value forward to the limit: |
2001 // move the starting value forward to the limit: |
2017 start_id = limit_id; |
2002 start_id = limit_id; |
2018 } |
2003 } |