src/share/vm/interpreter/interpreterRuntime.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/interpreter

src/share/vm/interpreter/interpreterRuntime.cpp

Print this page




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
src/share/vm/interpreter/interpreterRuntime.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File