src/share/vm/interpreter/interpreterRuntime.cpp

Print this page




1192 
1193 #if defined(IA32) || defined(AMD64) || defined(ARM)
1194 IRT_LEAF(void, InterpreterRuntime::popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address))
1195   if (src_address == dest_address) {
1196     return;
1197   }
1198   ResetNoHandleMark rnm; // In a LEAF entry.
1199   HandleMark hm;
1200   ResourceMark rm;
1201   frame fr = thread->last_frame();
1202   assert(fr.is_interpreted_frame(), "");
1203   jint bci = fr.interpreter_frame_bci();
1204   methodHandle mh(thread, fr.interpreter_frame_method());
1205   Bytecode_invoke invoke(mh, bci);
1206   ArgumentSizeComputer asc(invoke.signature());
1207   int size_of_arguments = (asc.size() + (invoke.has_receiver() ? 1 : 0)); // receiver
1208   Copy::conjoint_jbytes(src_address, dest_address,
1209                        size_of_arguments * Interpreter::stackElementSize);
1210 IRT_END
1211 #endif

























1192 
1193 #if defined(IA32) || defined(AMD64) || defined(ARM)
1194 IRT_LEAF(void, InterpreterRuntime::popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address))
1195   if (src_address == dest_address) {
1196     return;
1197   }
1198   ResetNoHandleMark rnm; // In a LEAF entry.
1199   HandleMark hm;
1200   ResourceMark rm;
1201   frame fr = thread->last_frame();
1202   assert(fr.is_interpreted_frame(), "");
1203   jint bci = fr.interpreter_frame_bci();
1204   methodHandle mh(thread, fr.interpreter_frame_method());
1205   Bytecode_invoke invoke(mh, bci);
1206   ArgumentSizeComputer asc(invoke.signature());
1207   int size_of_arguments = (asc.size() + (invoke.has_receiver() ? 1 : 0)); // receiver
1208   Copy::conjoint_jbytes(src_address, dest_address,
1209                        size_of_arguments * Interpreter::stackElementSize);
1210 IRT_END
1211 #endif
1212 
1213 #if INCLUDE_JVMTI
1214 // This is a support of the JVMTI PopFrame interface.
1215 // Make sure it is an invokestatic of a polymorphic intrinsic that has a member_name argument
1216 // and return it as a vm_result so that it can be reloaded in the list of invokestatic parameters.
1217 // The dmh argument is a reference to a DirectMethoHandle that has a member name field.
1218 IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address dmh,
1219                                                             Method* method, address bcp))
1220   Bytecodes::Code code = Bytecodes::code_at(method, bcp);
1221   if (code != Bytecodes::_invokestatic) {
1222     return;
1223   }
1224   ConstantPool* cpool = method->constants();
1225   int cp_index = Bytes::get_native_u2(bcp + 1) + ConstantPool::CPCACHE_INDEX_TAG;
1226   Symbol* cname = cpool->klass_name_at(cpool->klass_ref_index_at(cp_index));
1227   Symbol* mname = cpool->name_ref_at(cp_index);
1228 
1229   if (MethodHandles::has_member_arg(cname, mname)) {
1230     oop member_name = java_lang_invoke_DirectMethodHandle::member((oop)dmh);
1231     thread->set_vm_result(member_name);
1232   }
1233 IRT_END
1234 #endif // INCLUDE_JVMTI