1250 } 1251 ResetNoHandleMark rnm; // In a LEAF entry. 1252 HandleMark hm; 1253 ResourceMark rm; 1254 frame fr = thread->last_frame(); 1255 assert(fr.is_interpreted_frame(), ""); 1256 jint bci = fr.interpreter_frame_bci(); 1257 methodHandle mh(thread, fr.interpreter_frame_method()); 1258 Bytecode_invoke invoke(mh, bci); 1259 ArgumentSizeComputer asc(invoke.signature()); 1260 int size_of_arguments = (asc.size() + (invoke.has_receiver() ? 1 : 0)); // receiver 1261 Copy::conjoint_jbytes(src_address, dest_address, 1262 size_of_arguments * Interpreter::stackElementSize); 1263 IRT_END 1264 #endif 1265 1266 #if INCLUDE_JVMTI 1267 // This is a support of the JVMTI PopFrame interface. 1268 // Make sure it is an invokestatic of a polymorphic intrinsic that has a member_name argument 1269 // and return it as a vm_result so that it can be reloaded in the list of invokestatic parameters. 1270 // The dmh argument is a reference to a DirectMethoHandle that has a member name field. 1271 IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address dmh, 1272 Method* method, address bcp)) 1273 Bytecodes::Code code = Bytecodes::code_at(method, bcp); 1274 if (code != Bytecodes::_invokestatic) { 1275 return; 1276 } 1277 ConstantPool* cpool = method->constants(); 1278 int cp_index = Bytes::get_native_u2(bcp + 1) + ConstantPool::CPCACHE_INDEX_TAG; 1279 Symbol* cname = cpool->klass_name_at(cpool->klass_ref_index_at(cp_index)); 1280 Symbol* mname = cpool->name_ref_at(cp_index); 1281 1282 if (MethodHandles::has_member_arg(cname, mname)) { 1283 oop member_name = java_lang_invoke_DirectMethodHandle::member((oop)dmh); 1284 thread->set_vm_result(member_name); 1285 } 1286 IRT_END 1287 #endif // INCLUDE_JVMTI | 1250 } 1251 ResetNoHandleMark rnm; // In a LEAF entry. 1252 HandleMark hm; 1253 ResourceMark rm; 1254 frame fr = thread->last_frame(); 1255 assert(fr.is_interpreted_frame(), ""); 1256 jint bci = fr.interpreter_frame_bci(); 1257 methodHandle mh(thread, fr.interpreter_frame_method()); 1258 Bytecode_invoke invoke(mh, bci); 1259 ArgumentSizeComputer asc(invoke.signature()); 1260 int size_of_arguments = (asc.size() + (invoke.has_receiver() ? 1 : 0)); // receiver 1261 Copy::conjoint_jbytes(src_address, dest_address, 1262 size_of_arguments * Interpreter::stackElementSize); 1263 IRT_END 1264 #endif 1265 1266 #if INCLUDE_JVMTI 1267 // This is a support of the JVMTI PopFrame interface. 1268 // Make sure it is an invokestatic of a polymorphic intrinsic that has a member_name argument 1269 // and return it as a vm_result so that it can be reloaded in the list of invokestatic parameters. 1270 // The member_name argument is a saved reference (in local#0) to the member_name. 1271 // For backward compatibility with some JDK versions (7, 8) it can also be a direct method handle. 1272 IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address member_name, 1273 Method* method, address bcp)) 1274 Bytecodes::Code code = Bytecodes::code_at(method, bcp); 1275 if (code != Bytecodes::_invokestatic) { 1276 return; 1277 } 1278 ConstantPool* cpool = method->constants(); 1279 int cp_index = Bytes::get_native_u2(bcp + 1) + ConstantPool::CPCACHE_INDEX_TAG; 1280 Symbol* cname = cpool->klass_name_at(cpool->klass_ref_index_at(cp_index)); 1281 Symbol* mname = cpool->name_ref_at(cp_index); 1282 1283 if (MethodHandles::has_member_arg(cname, mname)) { 1284 oop member_name_oop = (oop) member_name; 1285 if (java_lang_invoke_DirectMethodHandle::is_instance(member_name_oop)) { 1286 // FIXME: remove after j.l.i.InvokerBytecodeGenerator code shape is updated. 1287 member_name_oop = java_lang_invoke_DirectMethodHandle::member(member_name_oop); 1288 } 1289 thread->set_vm_result(member_name_oop); 1290 } 1291 IRT_END 1292 #endif // INCLUDE_JVMTI |