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