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 |