src/cpu/sparc/vm/interpreter_sparc.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
hotspot-dvm Cdiff src/cpu/sparc/vm/interpreter_sparc.cpp
src/cpu/sparc/vm/interpreter_sparc.cpp
Print this page
rev 522 : [mq]: meth.patch
*** 233,242 ****
--- 233,273 ----
return entry;
}
+ #ifdef ASSERT
+ address last_WrongMethodType_caller;
+ #endif //ASSERT
+
+
+ // Method handle invoker
+ // Dispatch a method of the form java.dyn.MethodHandles::invoke(...)
+ address InterpreterGenerator::generate_method_handle_entry(void) {
+ if (!MethodHandleSupport) {
+ return generate_abstract_entry();
+ }
+
+ // incoming registers: O0 (mh), G5 (mtype), O1... (args)
+ Register G5_mtype = G5_inline_cache_reg;
+ Register O0_recv = O0;
+
+ Label wrong_method_type;
+ address entry_point = MethodHandles::generate_method_handle_interpreter_entry(_masm, wrong_method_type);
+
+ __ bind(wrong_method_type);
+ __ mov(O0_recv, O1); // bad mh (actual)
+ __ mov(G5_mtype, O0); // missed mtype (required)
+ DEBUG_ONLY(__ get_pc(O2));
+ __ throw_if_not_x(Assembler::never, Interpreter::_throw_WrongMethodType_entry, G3_scratch);
+
+ return entry_point;
+ }
+
+
+
+
//----------------------------------------------------------------------------------------------------
// Entry points & stack frame layout
//
// Here we generate the various kind of entries into the interpreter.
// The two main entry type are generic bytecode methods and native call method.
*** 362,371 ****
--- 393,403 ----
case Interpreter::native : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(false); break;
case Interpreter::native_synchronized : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(true); break;
case Interpreter::empty : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry(); break;
case Interpreter::accessor : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry(); break;
case Interpreter::abstract : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry(); break;
+ case Interpreter::method_handle : entry_point = ((InterpreterGenerator*)this)->generate_method_handle_entry(); break;
case Interpreter::java_lang_math_sin : break;
case Interpreter::java_lang_math_cos : break;
case Interpreter::java_lang_math_tan : break;
case Interpreter::java_lang_math_sqrt : break;
case Interpreter::java_lang_math_abs : break;
src/cpu/sparc/vm/interpreter_sparc.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File