1303 |
1303 |
1304 bool should_repeat; |
1304 bool should_repeat; |
1305 vframeStream st(thread); |
1305 vframeStream st(thread); |
1306 assert(!st.at_end(), "cannot be at end"); |
1306 assert(!st.at_end(), "cannot be at end"); |
1307 Method* current_method = NULL; |
1307 Method* current_method = NULL; |
|
1308 // A GC may occur during the Method::fast_exception_handler_bci_for() |
|
1309 // call below if it needs to load the constraint class. Using a |
|
1310 // methodHandle to keep the 'current_method' from being deallocated |
|
1311 // if GC happens. |
|
1312 methodHandle current_mh = methodHandle(thread, current_method); |
1308 int current_bci = -1; |
1313 int current_bci = -1; |
1309 do { |
1314 do { |
1310 current_method = st.method(); |
1315 current_method = st.method(); |
|
1316 current_mh = methodHandle(thread, current_method); |
1311 current_bci = st.bci(); |
1317 current_bci = st.bci(); |
1312 do { |
1318 do { |
1313 should_repeat = false; |
1319 should_repeat = false; |
1314 KlassHandle eh_klass(thread, exception_handle()->klass()); |
1320 KlassHandle eh_klass(thread, exception_handle()->klass()); |
1315 current_bci = current_method->fast_exception_handler_bci_for( |
1321 current_bci = Method::fast_exception_handler_bci_for( |
1316 eh_klass, current_bci, THREAD); |
1322 current_mh, eh_klass, current_bci, THREAD); |
1317 if (HAS_PENDING_EXCEPTION) { |
1323 if (HAS_PENDING_EXCEPTION) { |
1318 exception_handle = Handle(thread, PENDING_EXCEPTION); |
1324 exception_handle = Handle(thread, PENDING_EXCEPTION); |
1319 CLEAR_PENDING_EXCEPTION; |
1325 CLEAR_PENDING_EXCEPTION; |
1320 should_repeat = true; |
1326 should_repeat = true; |
1321 } |
1327 } |
1326 jmethodID catch_jmethodID; |
1332 jmethodID catch_jmethodID; |
1327 if (current_bci < 0) { |
1333 if (current_bci < 0) { |
1328 catch_jmethodID = 0; |
1334 catch_jmethodID = 0; |
1329 current_bci = 0; |
1335 current_bci = 0; |
1330 } else { |
1336 } else { |
1331 catch_jmethodID = jem.to_jmethodID( |
1337 catch_jmethodID = jem.to_jmethodID(current_mh); |
1332 methodHandle(thread, current_method)); |
|
1333 } |
1338 } |
1334 |
1339 |
1335 JvmtiJavaThreadEventTransition jet(thread); |
1340 JvmtiJavaThreadEventTransition jet(thread); |
1336 jvmtiEventException callback = env->callbacks()->Exception; |
1341 jvmtiEventException callback = env->callbacks()->Exception; |
1337 if (callback != NULL) { |
1342 if (callback != NULL) { |