8178119: [JVMCI] when rethrowing exceptions at deopt the exception must be fetched after materialization
Reviewed-by: kvn
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp Tue Apr 11 19:39:16 2017 -0400
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Thu Apr 06 00:03:18 2017 -0700
@@ -189,19 +189,6 @@
assert(vf->is_compiled_frame(), "Wrong frame type");
chunk->push(compiledVFrame::cast(vf));
- ScopeDesc* trap_scope = chunk->at(0)->scope();
- Handle exceptionObject;
- if (trap_scope->rethrow_exception()) {
- if (PrintDeoptimizationDetails) {
- tty->print_cr("Exception to be rethrown in the interpreter for method %s::%s at bci %d", trap_scope->method()->method_holder()->name()->as_C_string(), trap_scope->method()->name()->as_C_string(), trap_scope->bci());
- }
- GrowableArray<ScopeValue*>* expressions = trap_scope->expressions();
- guarantee(expressions != NULL && expressions->length() > 0, "must have exception to throw");
- ScopeValue* topOfStack = expressions->top();
- exceptionObject = StackValue::create_stack_value(&deoptee, &map, topOfStack)->get_obj();
- assert(exceptionObject() != NULL, "exception oop can not be null");
- }
-
bool realloc_failures = false;
#if defined(COMPILER2) || INCLUDE_JVMCI
@@ -296,6 +283,19 @@
#endif // INCLUDE_JVMCI
#endif // COMPILER2 || INCLUDE_JVMCI
+ ScopeDesc* trap_scope = chunk->at(0)->scope();
+ Handle exceptionObject;
+ if (trap_scope->rethrow_exception()) {
+ if (PrintDeoptimizationDetails) {
+ tty->print_cr("Exception to be rethrown in the interpreter for method %s::%s at bci %d", trap_scope->method()->method_holder()->name()->as_C_string(), trap_scope->method()->name()->as_C_string(), trap_scope->bci());
+ }
+ GrowableArray<ScopeValue*>* expressions = trap_scope->expressions();
+ guarantee(expressions != NULL && expressions->length() > 0, "must have exception to throw");
+ ScopeValue* topOfStack = expressions->top();
+ exceptionObject = StackValue::create_stack_value(&deoptee, &map, topOfStack)->get_obj();
+ guarantee(exceptionObject() != NULL, "exception oop can not be null");
+ }
+
// Ensure that no safepoint is taken after pointers have been stored
// in fields of rematerialized objects. If a safepoint occurs from here on
// out the java state residing in the vframeArray will be missed.