# HG changeset patch # User dlong # Date 1357784332 18000 # Node ID 18c3c3fa291bc06aeffa5005059b1d89594cdc5c # Parent 1f6d10b4cc0c09430d5e0a62678796dcc2e9d4c6# Parent 0c8717a92b2d94b90d3a5958a8a3ae6c79b015ff Merge diff -r 1f6d10b4cc0c -r 18c3c3fa291b src/share/vm/c1/c1_LIR.hpp --- a/src/share/vm/c1/c1_LIR.hpp Wed Jan 09 18:06:34 2013 -0500 +++ b/src/share/vm/c1/c1_LIR.hpp Wed Jan 09 21:18:52 2013 -0500 @@ -2259,7 +2259,7 @@ typedef enum { inputMode, firstMode = inputMode, tempMode, outputMode, numModes, invalidMode = -1 } OprMode; enum { - maxNumberOfOperands = 16, + maxNumberOfOperands = 20, maxNumberOfInfos = 4 }; diff -r 1f6d10b4cc0c -r 18c3c3fa291b src/share/vm/interpreter/interpreterRuntime.cpp --- a/src/share/vm/interpreter/interpreterRuntime.cpp Wed Jan 09 18:06:34 2013 -0500 +++ b/src/share/vm/interpreter/interpreterRuntime.cpp Wed Jan 09 21:18:52 2013 -0500 @@ -417,7 +417,7 @@ // exception handler lookup KlassHandle h_klass(THREAD, h_exception->klass()); - handler_bci = h_method->fast_exception_handler_bci_for(h_klass, current_bci, THREAD); + handler_bci = Method::fast_exception_handler_bci_for(h_method, h_klass, current_bci, THREAD); if (HAS_PENDING_EXCEPTION) { // We threw an exception while trying to find the exception handler. // Transfer the new exception to the exception handle which will diff -r 1f6d10b4cc0c -r 18c3c3fa291b src/share/vm/oops/method.cpp --- a/src/share/vm/oops/method.cpp Wed Jan 09 18:06:34 2013 -0500 +++ b/src/share/vm/oops/method.cpp Wed Jan 09 21:18:52 2013 -0500 @@ -194,16 +194,16 @@ return buf; } -int Method::fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS) { +int Method::fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS) { // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index) // access exception table - ExceptionTable table(this); + ExceptionTable table(mh()); int length = table.length(); // iterate through all entries sequentially - constantPoolHandle pool(THREAD, constants()); + constantPoolHandle pool(THREAD, mh->constants()); for (int i = 0; i < length; i ++) { //reacquire the table in case a GC happened - ExceptionTable table(this); + ExceptionTable table(mh()); int beg_bci = table.start_pc(i); int end_bci = table.end_pc(i); assert(beg_bci <= end_bci, "inconsistent exception table"); diff -r 1f6d10b4cc0c -r 18c3c3fa291b src/share/vm/oops/method.hpp --- a/src/share/vm/oops/method.hpp Wed Jan 09 18:06:34 2013 -0500 +++ b/src/share/vm/oops/method.hpp Wed Jan 09 21:18:52 2013 -0500 @@ -351,7 +351,7 @@ // exception handler which caused the exception to be thrown, which // is needed for proper retries. See, for example, // InterpreterRuntime::exception_handler_for_exception. - int fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS); + static int fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS); // method data access MethodData* method_data() const { diff -r 1f6d10b4cc0c -r 18c3c3fa291b src/share/vm/prims/jvmtiExport.cpp --- a/src/share/vm/prims/jvmtiExport.cpp Wed Jan 09 18:06:34 2013 -0500 +++ b/src/share/vm/prims/jvmtiExport.cpp Wed Jan 09 21:18:52 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); diff -r 1f6d10b4cc0c -r 18c3c3fa291b src/share/vm/runtime/sharedRuntime.cpp --- a/src/share/vm/runtime/sharedRuntime.cpp Wed Jan 09 18:06:34 2013 -0500 +++ b/src/share/vm/runtime/sharedRuntime.cpp Wed Jan 09 21:18:52 2013 -0500 @@ -643,7 +643,8 @@ bool skip_scope_increment = false; // exception handler lookup KlassHandle ek (THREAD, exception->klass()); - handler_bci = sd->method()->fast_exception_handler_bci_for(ek, bci, THREAD); + methodHandle mh(THREAD, sd->method()); + handler_bci = Method::fast_exception_handler_bci_for(mh, ek, bci, THREAD); if (HAS_PENDING_EXCEPTION) { recursive_exception = true; // We threw an exception while trying to find the exception handler.