7106774: JSR 292: nightly test inlineMHTarget fails with wrong result
authortwisti
Thu, 03 Nov 2011 01:43:26 -0700
changeset 10979 c25dd872c62f
parent 10978 c68bfbbbd60b
child 10980 8b23df12c7f6
7106774: JSR 292: nightly test inlineMHTarget fails with wrong result Reviewed-by: kvn
hotspot/src/share/vm/interpreter/bytecode.hpp
hotspot/src/share/vm/runtime/deoptimization.cpp
--- a/hotspot/src/share/vm/interpreter/bytecode.hpp	Mon Oct 31 15:52:11 2011 -0700
+++ b/hotspot/src/share/vm/interpreter/bytecode.hpp	Thu Nov 03 01:43:26 2011 -0700
@@ -234,6 +234,13 @@
                                                           is_invokespecial()   ||
                                                           is_invokedynamic(); }
 
+  bool is_method_handle_invoke() const {
+    return (is_invokedynamic() ||
+            (is_invokevirtual() &&
+             method()->constants()->klass_ref_at_noresolve(index()) == vmSymbols::java_lang_invoke_MethodHandle() &&
+             methodOopDesc::is_method_handle_invoke_name(name())));
+  }
+
   // Helper to skip verification.   Used is_valid() to check if the result is really an invoke
   inline friend Bytecode_invoke Bytecode_invoke_check(methodHandle method, int bci);
 };
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp	Mon Oct 31 15:52:11 2011 -0700
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp	Thu Nov 03 01:43:26 2011 -0700
@@ -388,12 +388,8 @@
   bool caller_was_method_handle = false;
   if (deopt_sender.is_interpreted_frame()) {
     methodHandle method = deopt_sender.interpreter_frame_method();
-    Bytecode_invoke cur = Bytecode_invoke_check(method,
-                                                deopt_sender.interpreter_frame_bci());
-    if (cur.code() == Bytecodes::_invokedynamic ||
-        (cur.code() == Bytecodes::_invokevirtual &&
-         method->constants()->klass_ref_at_noresolve(cur.index()) == vmSymbols::java_lang_invoke_MethodHandle() &&
-         methodOopDesc::is_method_handle_invoke_name(cur.name()))) {
+    Bytecode_invoke cur = Bytecode_invoke_check(method, deopt_sender.interpreter_frame_bci());
+    if (cur.is_method_handle_invoke()) {
       // Method handle invokes may involve fairly arbitrary chains of
       // calls so it's impossible to know how much actual space the
       // caller has for locals.