6920977: G1: guarantee(k == probe->klass(),"klass should be in dictionary") fails
Summary: the guarantee is too strict and the test will fail (incorrectly) if the class is not in the system dictionary but in the placeholders.
Reviewed-by: acorn, phh
--- a/hotspot/src/share/vm/classfile/loaderConstraints.cpp Mon Feb 08 09:58:32 2010 -0800
+++ b/hotspot/src/share/vm/classfile/loaderConstraints.cpp Fri Feb 05 11:05:50 2010 -0500
@@ -457,7 +457,8 @@
}
-void LoaderConstraintTable::verify(Dictionary* dictionary) {
+void LoaderConstraintTable::verify(Dictionary* dictionary,
+ PlaceholderTable* placeholders) {
Thread *thread = Thread::current();
for (int cindex = 0; cindex < _loader_constraint_size; cindex++) {
for (LoaderConstraintEntry* probe = bucket(cindex);
@@ -472,7 +473,23 @@
unsigned int d_hash = dictionary->compute_hash(name, loader);
int d_index = dictionary->hash_to_index(d_hash);
klassOop k = dictionary->find_class(d_index, d_hash, name, loader);
- guarantee(k == probe->klass(), "klass should be in dictionary");
+ if (k != NULL) {
+ // We found the class in the system dictionary, so we should
+ // make sure that the klassOop matches what we already have.
+ guarantee(k == probe->klass(), "klass should be in dictionary");
+ } else {
+ // If we don't find the class in the system dictionary, it
+ // has to be in the placeholders table.
+ unsigned int p_hash = placeholders->compute_hash(name, loader);
+ int p_index = placeholders->hash_to_index(p_hash);
+ PlaceholderEntry* entry = placeholders->get_entry(p_index, p_hash,
+ name, loader);
+
+ // The instanceKlass might not be on the entry, so the only
+ // thing we can check here is whether we were successful in
+ // finding the class in the placeholders table.
+ guarantee(entry != NULL, "klass should be in the placeholders");
+ }
}
for (int n = 0; n< probe->num_loaders(); n++) {
guarantee(probe->loader(n)->is_oop_or_null(), "should be oop");
--- a/hotspot/src/share/vm/classfile/loaderConstraints.hpp Mon Feb 08 09:58:32 2010 -0800
+++ b/hotspot/src/share/vm/classfile/loaderConstraints.hpp Fri Feb 05 11:05:50 2010 -0500
@@ -84,7 +84,7 @@
void purge_loader_constraints(BoolObjectClosure* is_alive);
- void verify(Dictionary* dictionary);
+ void verify(Dictionary* dictionary, PlaceholderTable* placeholders);
#ifndef PRODUCT
void print();
#endif
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Mon Feb 08 09:58:32 2010 -0800
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Fri Feb 05 11:05:50 2010 -0500
@@ -2573,7 +2573,7 @@
// Verify constraint table
guarantee(constraints() != NULL, "Verify of loader constraints failed");
- constraints()->verify(dictionary());
+ constraints()->verify(dictionary(), placeholders());
}
--- a/hotspot/src/share/vm/includeDB_core Mon Feb 08 09:58:32 2010 -0800
+++ b/hotspot/src/share/vm/includeDB_core Fri Feb 05 11:05:50 2010 -0500
@@ -2654,6 +2654,7 @@
loaderConstraints.cpp safepoint.hpp
loaderConstraints.hpp dictionary.hpp
+loaderConstraints.hpp placeholders.hpp
loaderConstraints.hpp hashtable.hpp
location.cpp debugInfo.hpp