< prev index next >

src/share/vm/interpreter/linkResolver.cpp

Print this page

        

*** 1688,1699 **** // Resolve the bootstrap specifier (BSM + optional arguments). Handle bootstrap_specifier; // Check if CallSite has been bound already: ConstantPoolCacheEntry* cpce = pool->invokedynamic_cp_cache_entry_at(index); - if (cpce->is_f1_null()) { int pool_index = cpce->constant_pool_index(); oop bsm_info = pool->resolve_bootstrap_specifier_at(pool_index, THREAD); wrap_invokedynamic_exception(CHECK); assert(bsm_info != NULL, ""); // FIXME: Cache this once per BootstrapMethods entry, not once per CONSTANT_InvokeDynamic. bootstrap_specifier = Handle(THREAD, bsm_info); --- 1688,1705 ---- // Resolve the bootstrap specifier (BSM + optional arguments). Handle bootstrap_specifier; // Check if CallSite has been bound already: ConstantPoolCacheEntry* cpce = pool->invokedynamic_cp_cache_entry_at(index); int pool_index = cpce->constant_pool_index(); + if (pool()->tag_at(pool_index).is_invoke_dynamic_in_error()) { + // Throw saved exception. + ConstantPool::throw_resolution_error(pool, pool_index, CHECK); + return; + } + + if (cpce->is_f1_null()) { oop bsm_info = pool->resolve_bootstrap_specifier_at(pool_index, THREAD); wrap_invokedynamic_exception(CHECK); assert(bsm_info != NULL, ""); // FIXME: Cache this once per BootstrapMethods entry, not once per CONSTANT_InvokeDynamic. bootstrap_specifier = Handle(THREAD, bsm_info);
*** 1714,1724 **** method_name->as_C_string(), method_signature->as_C_string(), current_klass->name()->as_C_string()); tty->print(" BSM info: "); bootstrap_specifier->print(); } ! resolve_dynamic_call(result, bootstrap_specifier, method_name, method_signature, current_klass, CHECK); } void LinkResolver::resolve_dynamic_call(CallInfo& result, Handle bootstrap_specifier, Symbol* method_name, Symbol* method_signature, --- 1720,1740 ---- method_name->as_C_string(), method_signature->as_C_string(), current_klass->name()->as_C_string()); tty->print(" BSM info: "); bootstrap_specifier->print(); } ! resolve_dynamic_call(result, bootstrap_specifier, method_name, method_signature, current_klass, THREAD); ! if (HAS_PENDING_EXCEPTION) { ! if (pool()->tag_at(pool_index).is_invoke_dynamic()&& ! PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) { ! // Record the exception then throw it. ! ConstantPool::save_and_throw_exception(pool, pool_index, pool()->tag_at(pool_index), CHECK); ! } else if (pool()->tag_at(pool_index).is_invoke_dynamic_in_error()) { ! // Throw saved exception. ! ConstantPool::throw_resolution_error(pool, pool_index, CHECK); ! } // else return the original exception. ! } } void LinkResolver::resolve_dynamic_call(CallInfo& result, Handle bootstrap_specifier, Symbol* method_name, Symbol* method_signature,
< prev index next >