src/share/vm/interpreter/linkResolver.cpp

changeset 2941
60b8287df30e
parent 2856
acf5e660c71a
child 2982
ddd894528dbc
     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    }

mercurial