src/share/vm/classfile/defaultMethods.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File hotspot-rt Cdiff src/share/vm/classfile/defaultMethods.cpp

src/share/vm/classfile/defaultMethods.cpp

Print this page

        

*** 719,737 **** --- 719,762 ---- ContextMark* cm = new ContextMark(_ctx->mark()); scope->add_mark(cm); // will restore context when scope is freed _ctx->apply_type_arguments(sub, klass, THREAD); + // apply_type_arguments may result in a ClassCirculatoryError + // exception while constructing a ClassDescriptor for klass. In + // such a situation, it indicates that _method_name can not be + // found in the hierarchy currently being traversed. Clear the + // exception and return to continue. + if (HAS_PENDING_EXCEPTION) { + if (PENDING_EXCEPTION->klass()->name() == vmSymbols::java_lang_ClassCircularityError()) { + CLEAR_PENDING_EXCEPTION; + return true; + } + } + int start, end = 0; start = klass->find_method_by_name(_method_name, &end); if (start != -1) { for (int i = start; i < end; ++i) { Method* m = klass->methods()->at(i); // This gets the method's parameter list with its generic type // parameters resolved generic::MethodDescriptor* md = _cache->descriptor_for(m, THREAD); + // Attempt to get the class descriptor of the method may + // result in a ClassCirculatoryError exception while + // constructing a ClassDescriptor for the holder of m. In such + // a situation, it indicates that m can not be found in the + // hierarchy currently being traversed and md is NULL. Clear + // the exception and return to continue. + + if (HAS_PENDING_EXCEPTION) { + if (PENDING_EXCEPTION->klass()->name() == vmSymbols::java_lang_ClassCircularityError()) { + CLEAR_PENDING_EXCEPTION; + return true; + } + } // Find all methods on this hierarchy that match this method // (name, signature). This class collects other families of this // method name. StatefulMethodFamily* family = _families.find_matching_or_create(md, _ctx);
src/share/vm/classfile/defaultMethods.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File