hotspot/src/share/vm/classfile/systemDictionary.cpp
changeset 33604 ad1cd9269bd4
parent 33602 16053580a684
child 33612 b1487e78deee
equal deleted inserted replaced
33603:450d454670a7 33604:ad1cd9269bd4
  1965 
  1965 
  1966 void SystemDictionary::check_constraints(int d_index, unsigned int d_hash,
  1966 void SystemDictionary::check_constraints(int d_index, unsigned int d_hash,
  1967                                          instanceKlassHandle k,
  1967                                          instanceKlassHandle k,
  1968                                          Handle class_loader, bool defining,
  1968                                          Handle class_loader, bool defining,
  1969                                          TRAPS) {
  1969                                          TRAPS) {
  1970   const char *linkage_error = NULL;
  1970   const char *linkage_error1 = NULL;
       
  1971   const char *linkage_error2 = NULL;
  1971   {
  1972   {
  1972     Symbol*  name  = k->name();
  1973     Symbol*  name  = k->name();
  1973     ClassLoaderData *loader_data = class_loader_data(class_loader);
  1974     ClassLoaderData *loader_data = class_loader_data(class_loader);
  1974 
  1975 
  1975     MutexLocker mu(SystemDictionary_lock, THREAD);
  1976     MutexLocker mu(SystemDictionary_lock, THREAD);
  1982       // system dictionary only holds instance classes, placeholders
  1983       // system dictionary only holds instance classes, placeholders
  1983       // also holds array classes
  1984       // also holds array classes
  1984 
  1985 
  1985       assert(check->oop_is_instance(), "noninstance in systemdictionary");
  1986       assert(check->oop_is_instance(), "noninstance in systemdictionary");
  1986       if ((defining == true) || (k() != check)) {
  1987       if ((defining == true) || (k() != check)) {
  1987         linkage_error = "loader (instance of  %s): attempted  duplicate class "
  1988         linkage_error1 = "loader (instance of  ";
  1988           "definition for name: \"%s\"";
  1989         linkage_error2 = "): attempted  duplicate class definition for name: \"";
  1989       } else {
  1990       } else {
  1990         return;
  1991         return;
  1991       }
  1992       }
  1992     }
  1993     }
  1993 
  1994 
  1994 #ifdef ASSERT
  1995 #ifdef ASSERT
  1995     Symbol* ph_check = find_placeholder(name, loader_data);
  1996     Symbol* ph_check = find_placeholder(name, loader_data);
  1996     assert(ph_check == NULL || ph_check == name, "invalid symbol");
  1997     assert(ph_check == NULL || ph_check == name, "invalid symbol");
  1997 #endif
  1998 #endif
  1998 
  1999 
  1999     if (linkage_error == NULL) {
  2000     if (linkage_error1 == NULL) {
  2000       if (constraints()->check_or_update(k, class_loader, name) == false) {
  2001       if (constraints()->check_or_update(k, class_loader, name) == false) {
  2001         linkage_error = "loader constraint violation: loader (instance of %s)"
  2002         linkage_error1 = "loader constraint violation: loader (instance of ";
  2002           " previously initiated loading for a different type with name \"%s\"";
  2003         linkage_error2 = ") previously initiated loading for a different type with name \"";
  2003       }
  2004       }
  2004     }
  2005     }
  2005   }
  2006   }
  2006 
  2007 
  2007   // Throw error now if needed (cannot throw while holding
  2008   // Throw error now if needed (cannot throw while holding
  2008   // SystemDictionary_lock because of rank ordering)
  2009   // SystemDictionary_lock because of rank ordering)
  2009 
  2010 
  2010   if (linkage_error) {
  2011   if (linkage_error1) {
  2011     ResourceMark rm(THREAD);
  2012     ResourceMark rm(THREAD);
  2012     const char* class_loader_name = loader_name(class_loader());
  2013     const char* class_loader_name = loader_name(class_loader());
  2013     char* type_name = k->name()->as_C_string();
  2014     char* type_name = k->name()->as_C_string();
  2014     size_t buflen = strlen(linkage_error) + strlen(class_loader_name) +
  2015     size_t buflen = strlen(linkage_error1) + strlen(class_loader_name) +
  2015       strlen(type_name);
  2016       strlen(linkage_error2) + strlen(type_name) + 2; // +2 for '"' and null byte.
  2016     char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
  2017     char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
  2017     jio_snprintf(buf, buflen, linkage_error, class_loader_name, type_name);
  2018     jio_snprintf(buf, buflen, "%s%s%s%s\"", linkage_error1, class_loader_name, linkage_error2, type_name);
  2018     THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
  2019     THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
  2019   }
  2020   }
  2020 }
  2021 }
  2021 
  2022 
  2022 
  2023