Mercurial > hg > graal-compiler
diff src/share/vm/runtime/frame.cpp @ 1204:18a389214829
6921352: JSR 292 needs its own deopt handler
Summary: We need to introduce a new MH deopt handler so we can easily determine if the deopt happened at a MH call site or not.
Reviewed-by: never, jrose
author | twisti |
---|---|
date | Mon, 01 Feb 2010 19:29:46 +0100 |
parents | 24128c2ffa87 |
children | e3a4305c6bc3 |
line wrap: on
line diff
--- a/src/share/vm/runtime/frame.cpp Fri Jan 29 22:51:41 2010 -0800 +++ b/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);