src/share/vm/runtime/vframeArray.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/runtime/vframeArray.cpp
src/share/vm/runtime/vframeArray.cpp
Print this page
*** 292,302 ****
// we placed in the skeletal frame now that we finally know the
// exact interpreter address we should use.
_frame.patch_pc(thread, pc);
! assert (!method()->is_synchronized() || locks > 0 || _removed_monitors, "synchronized methods must have monitors");
BasicObjectLock* top = iframe()->interpreter_frame_monitor_begin();
for (int index = 0; index < locks; index++) {
top = iframe()->previous_monitor_in_interpreter_frame(top);
BasicObjectLock* src = _monitors->at(index);
--- 292,302 ----
// we placed in the skeletal frame now that we finally know the
// exact interpreter address we should use.
_frame.patch_pc(thread, pc);
! assert (!method()->is_synchronized() || locks > 0 || _removed_monitors || raw_bci() == SynchronizationEntryBCI, "synchronized methods must have monitors");
BasicObjectLock* top = iframe()->interpreter_frame_monitor_begin();
for (int index = 0; index < locks; index++) {
top = iframe()->previous_monitor_in_interpreter_frame(top);
BasicObjectLock* src = _monitors->at(index);
*** 315,324 ****
--- 315,328 ----
address mdp = mdo->bci_to_dp(bci);
iframe()->interpreter_frame_set_mdp(mdp);
}
}
+ if (PrintDeoptimizationDetails) {
+ tty->print_cr("Expressions size: %d", expressions()->size());
+ }
+
// Unpack expression stack
// If this is an intermediate frame (i.e. not top frame) then this
// only unpacks the part of the expression stack not used by callee
// as parameters. The callee parameters are unpacked as part of the
// callee locals.
*** 327,339 ****
--- 331,360 ----
StackValue *value = expressions()->at(i);
intptr_t* addr = iframe()->interpreter_frame_expression_stack_at(i);
switch(value->type()) {
case T_INT:
*addr = value->get_int();
+ #ifndef PRODUCT
+ if (PrintDeoptimizationDetails) {
+ tty->print_cr("Reconstructed expression %d (INT): %d", i, (int)(*addr));
+ }
+ #endif
break;
case T_OBJECT:
*addr = value->get_int(T_OBJECT);
+ #ifndef PRODUCT
+ if (PrintDeoptimizationDetails) {
+ tty->print("Reconstructed expression %d (OBJECT): ", i);
+ oop o = (oop)(address)(*addr);
+ if (o == NULL) {
+ tty->print_cr("NULL");
+ } else {
+ ResourceMark rm;
+ tty->print_raw_cr(o->klass()->name()->as_C_string());
+ }
+ }
+ #endif
break;
case T_CONFLICT:
// A dead stack slot. Initialize to null in case it is an oop.
*addr = NULL_WORD;
break;
*** 348,360 ****
--- 369,398 ----
StackValue *value = locals()->at(i);
intptr_t* addr = iframe()->interpreter_frame_local_at(i);
switch(value->type()) {
case T_INT:
*addr = value->get_int();
+ #ifndef PRODUCT
+ if (PrintDeoptimizationDetails) {
+ tty->print_cr("Reconstructed local %d (INT): %d", i, (int)(*addr));
+ }
+ #endif
break;
case T_OBJECT:
*addr = value->get_int(T_OBJECT);
+ #ifndef PRODUCT
+ if (PrintDeoptimizationDetails) {
+ tty->print("Reconstructed local %d (OBJECT): ", i);
+ oop o = (oop)(address)(*addr);
+ if (o == NULL) {
+ tty->print_cr("NULL");
+ } else {
+ ResourceMark rm;
+ tty->print_raw_cr(o->klass()->name()->as_C_string());
+ }
+ }
+ #endif
break;
case T_CONFLICT:
// A dead location. If it is an oop then we need a NULL to prevent GC from following it
*addr = NULL_WORD;
break;
*** 392,402 ****
thread->popframe_free_preserved_args();
}
}
#ifndef PRODUCT
! if (TraceDeoptimization && Verbose) {
ttyLocker ttyl;
tty->print_cr("[%d Interpreted Frame]", ++unpack_counter);
iframe()->print_on(tty);
RegisterMap map(thread);
vframe* f = vframe::new_vframe(iframe(), &map, thread);
--- 430,440 ----
thread->popframe_free_preserved_args();
}
}
#ifndef PRODUCT
! if (PrintDeoptimizationDetails) {
ttyLocker ttyl;
tty->print_cr("[%d Interpreted Frame]", ++unpack_counter);
iframe()->print_on(tty);
RegisterMap map(thread);
vframe* f = vframe::new_vframe(iframe(), &map, thread);
src/share/vm/runtime/vframeArray.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File