--- a/hotspot/src/share/vm/runtime/frame.cpp Fri Jan 29 22:51:41 2010 -0800
+++ b/hotspot/src/share/vm/runtime/frame.cpp Mon Feb 01 19:29:46 2010 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -107,7 +107,11 @@
address frame::raw_pc() const {
if (is_deoptimized_frame()) {
- return ((nmethod*) cb())->deopt_handler_begin() - pc_return_offset;
+ nmethod* nm = cb()->as_nmethod_or_null();
+ if (nm->is_method_handle_return(pc()))
+ return nm->deopt_mh_handler_begin() - pc_return_offset;
+ else
+ return nm->deopt_handler_begin() - pc_return_offset;
} else {
return (pc() - pc_return_offset);
}
@@ -269,10 +273,16 @@
} // NeedsDeoptSuspend
- address deopt = nm->deopt_handler_begin();
+ // If the call site is a MethodHandle call site use the MH deopt
+ // handler.
+ address deopt = nm->is_method_handle_return(pc()) ?
+ nm->deopt_mh_handler_begin() :
+ nm->deopt_handler_begin();
+
// Save the original pc before we patch in the new one
nm->set_original_pc(this, pc());
patch_pc(thread, deopt);
+
#ifdef ASSERT
{
RegisterMap map(thread, false);