--- old/src/share/vm/runtime/sharedRuntime.cpp 2013-10-24 10:24:34.040451172 +0200 +++ new/src/share/vm/runtime/sharedRuntime.cpp 2013-10-24 10:24:33.940451173 +0200 @@ -2563,11 +2563,13 @@ #endif -// Create a native wrapper for this native method. The wrapper converts the -// java compiled calling convention to the native convention, handlizes -// arguments, and transitions to native. On return from the native we transition -// back to java blocking if a safepoint is in progress. -nmethod *AdapterHandlerLibrary::create_native_wrapper(methodHandle method, int compile_id) { +/** + * Create a native wrapper for this native method. The wrapper converts the + * Java-compiled calling convention to the native convention, handles + * arguments, and transitions to native. On return from the native we transition + * back to java blocking if a safepoint is in progress. + */ +void AdapterHandlerLibrary::create_native_wrapper(methodHandle method) { ResourceMark rm; nmethod* nm = NULL; @@ -2580,12 +2582,23 @@ MutexLocker mu(AdapterHandlerLibrary_lock); // See if somebody beat us to it nm = method->code(); - if (nm) { - return nm; + if (nm != NULL) { + return; + } + + const int compile_id = CompileBroker::assign_compile_id(method, CompileBroker::standard_entry_bci); + if (compile_id == 0) { + // The compilation falls outside the allowed range. Note that this can only happen in debug + // build if the cIStart(OSR) and CIStop(OSR) flags at are specified. Since currently this wrapper + // must be generated for method handle intrinsics (8026407), print out a warning. + if (method->is_method_handle_intrinsic()) { + warning("Must generate wrapper for method handle intrinsic"); + return; + } } - ResourceMark rm; + ResourceMark rm; BufferBlob* buf = buffer_blob(); // the temporary code buffer in CodeCache if (buf != NULL) { CodeBuffer buffer(buf); @@ -2617,16 +2630,14 @@ int comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, is_outgoing); // Generate the compiled-to-native wrapper code - nm = SharedRuntime::generate_native_wrapper(&_masm, - method, - compile_id, - sig_bt, - regs, - ret_type); + nm = SharedRuntime::generate_native_wrapper(&_masm, method, compile_id, sig_bt, regs, ret_type); + + if (nm != NULL) { + method->set_code(method, nm); + } } - } + } // Unlock AdapterHandlerLibrary_lock - // Must unlock before calling set_code // Install the generated code. if (nm != NULL) { @@ -2634,13 +2645,11 @@ ttyLocker ttyl; CompileTask::print_compilation(tty, nm, method->is_static() ? "(static)" : ""); } - method->set_code(method, nm); nm->post_compiled_method_load_event(); } else { // CodeCache is full, disable compilation CompileBroker::handle_full_code_cache(); } - return nm; } JRT_ENTRY_NO_ASYNC(void, SharedRuntime::block_for_jni_critical(JavaThread* thread))