src/share/vm/code/dependencies.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/code/dependencies.cpp Thu Nov 13 15:07:26 2014
--- new/src/share/vm/code/dependencies.cpp Thu Nov 13 15:07:26 2014
*** 1127,1136 ****
--- 1127,1137 ----
// If it is an interface, search its direct implementors.
// (Their subclasses are additional indirect implementors.
// See InstanceKlass::add_implementor.)
// (Note: nof_implementors is always zero for non-interfaces.)
+ if (top_level_call) {
int nof_impls = InstanceKlass::cast(context_type)->nof_implementors();
if (nof_impls > 1) {
// Avoid this case: *I.m > { A.m, C }; B.m > C
// Here, I.m has 2 concrete implementations, but m appears unique
// as A.m, because the search misses B.m when checking C.
*** 1158,1173 ****
--- 1159,1180 ----
return impl;
} else {
ADD_SUBCLASS_CHAIN(impl);
}
}
+ }
// Recursively process each non-trivial sibling chain.
while (chaini > 0) {
Klass* chain = chains[--chaini];
for (Klass* sub = chain; sub != NULL; sub = sub->next_sibling()) {
if (do_counts) { NOT_PRODUCT(deps_find_witness_steps++); }
+ if (!sub->oop_is_instance()) {
+ // This may happen for Klass java.lang.Object because it is a superclass
+ // of all other Klasses including non-instance Klasses like ObjArrayKlass.
+ continue;
+ }
if (is_participant(sub)) {
if (participants_hide_witnesses) continue;
// else fall through to process this guy's subclasses
} else if (is_witness(sub) && !ignore_witness(sub)) {
return sub;
src/share/vm/code/dependencies.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File