--- old/src/cpu/sparc/vm/interpreter_sparc.cpp	2009-01-20 02:13:47.000000000 -0800
+++ new/src/cpu/sparc/vm/interpreter_sparc.cpp	2009-01-20 02:13:47.000000000 -0800
@@ -235,6 +235,37 @@
 }
 
 
+#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
 //
@@ -364,6 +395,7 @@
     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;
