1.1 --- a/src/share/vm/interpreter/linkResolver.cpp Tue May 31 10:05:36 2011 -0700 1.2 +++ b/src/share/vm/interpreter/linkResolver.cpp Wed Jun 01 23:25:20 2011 -0700 1.3 @@ -1117,7 +1117,24 @@ 1.4 // The extra MH receiver will be inserted into the stack on every call. 1.5 methodHandle resolved_method; 1.6 KlassHandle current_klass(THREAD, pool->pool_holder()); 1.7 - lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK); 1.8 + lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, THREAD); 1.9 + if (HAS_PENDING_EXCEPTION) { 1.10 + if (PENDING_EXCEPTION->is_a(SystemDictionary::BootstrapMethodError_klass())) { 1.11 + // throw these guys, since they are already wrapped 1.12 + return; 1.13 + } 1.14 + if (!PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) { 1.15 + // intercept only LinkageErrors which might have failed to wrap 1.16 + return; 1.17 + } 1.18 + // See the "Linking Exceptions" section for the invokedynamic instruction in the JVMS. 1.19 + Handle ex(THREAD, PENDING_EXCEPTION); 1.20 + CLEAR_PENDING_EXCEPTION; 1.21 + oop bsme = Klass::cast(SystemDictionary::BootstrapMethodError_klass())->java_mirror(); 1.22 + MethodHandles::raise_exception(Bytecodes::_athrow, ex(), bsme, CHECK); 1.23 + // java code should not return, but if it does throw out anyway 1.24 + THROW(vmSymbols::java_lang_InternalError()); 1.25 + } 1.26 if (resolved_method.is_null()) { 1.27 THROW(vmSymbols::java_lang_InternalError()); 1.28 }