src/hotspot/share/classfile/systemDictionary.cpp
changeset 52195 f08c1d7a5c53
parent 52062 8dbf1a13af49
child 52319 625f6c742392
equal deleted inserted replaced
52194:6eb876ac6827 52195:f08c1d7a5c53
  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 }