void trace(methodOop method, address bcp, uintptr_t tos, uintptr_t tos2) { #ifndef PRODUCT MutexLocker ml(BytecodeTrace_lock); if (_current_method != method) { // Note 1: This code will not work as expected with true MT/MP. // Need an explicit lock or a different solution. ResourceMark rm; tty->cr(); tty->print("[%d] ", (int) Thread::current()->osthread()->thread_id()); method->print_name(tty); tty->cr(); _current_method = method; } if (Verbose) { const char* format; switch (Bytecodes::length_at(bcp)) { case 1: format = "%x %02x " ; break; case 2: format = "%x %02x %02x " ; break; case 3: format = "%x %02x %02x %02x "; break; default: format = "%x %02x %02x %02x .."; break; } tty->print(format, bcp, *bcp, *(bcp+1), *(bcp+2)); } Bytecodes::Code code; if (_previous_bytecode == Bytecodes::_wide) { code = Bytecodes::cast(*(bcp+1)); } else { code = Bytecodes::cast(*bcp); } int bci = bcp - method->code_base(); const char* format = _previous_bytecode == Bytecodes::_wide ? Bytecodes::wide_format(code) : Bytecodes::format(code); tty->print("[%d] ", (int) Thread::current()->osthread()->thread_id()); if (Verbose) { tty->print("%8d %4d 0x%016lx 0x%016lx %s", BytecodeCounter::counter_value(), bci, tos, tos2, Bytecodes::name(code)); } else { tty->print("%8d %4d %s", BytecodeCounter::counter_value(), bci, Bytecodes::name(code)); } print_attributes(bcp, bci, format); tty->cr(); _previous_bytecode = code; #endif }