Mercurial > hg > truffle
diff src/share/vm/prims/jvmtiExport.cpp @ 7469:0c8717a92b2d
8001341: SIGSEGV in methodOopDesc::fast_exception_handler_bci_for(KlassHandle,int,Thread*)+0x3e9.
Summary: Use methodHandle.
Reviewed-by: coleenp, acorn, twisti, sspitsyn
author | jiangli |
---|---|
date | Tue, 08 Jan 2013 13:01:19 -0500 |
parents | 80e866b1d053 |
children | 8b46b0196eb0 db9981fd3124 |
line wrap: on
line diff
--- a/src/share/vm/prims/jvmtiExport.cpp Thu Jan 03 15:08:43 2013 -0500 +++ b/src/share/vm/prims/jvmtiExport.cpp Tue Jan 08 13:01:19 2013 -0500 @@ -1305,15 +1305,21 @@ vframeStream st(thread); assert(!st.at_end(), "cannot be at end"); Method* current_method = NULL; + // A GC may occur during the Method::fast_exception_handler_bci_for() + // call below if it needs to load the constraint class. Using a + // methodHandle to keep the 'current_method' from being deallocated + // if GC happens. + methodHandle current_mh = methodHandle(thread, current_method); int current_bci = -1; do { current_method = st.method(); + current_mh = methodHandle(thread, current_method); current_bci = st.bci(); do { should_repeat = false; KlassHandle eh_klass(thread, exception_handle()->klass()); - current_bci = current_method->fast_exception_handler_bci_for( - eh_klass, current_bci, THREAD); + current_bci = Method::fast_exception_handler_bci_for( + current_mh, eh_klass, current_bci, THREAD); if (HAS_PENDING_EXCEPTION) { exception_handle = Handle(thread, PENDING_EXCEPTION); CLEAR_PENDING_EXCEPTION; @@ -1328,8 +1334,7 @@ catch_jmethodID = 0; current_bci = 0; } else { - catch_jmethodID = jem.to_jmethodID( - methodHandle(thread, current_method)); + catch_jmethodID = jem.to_jmethodID(current_mh); } JvmtiJavaThreadEventTransition jet(thread);