// This method is called while executing the raw bytecodes, so none of
  // the adjustments that BytecodeStream performs applies.
  void trace(methodHandle method, address bcp, uintptr_t tos, uintptr_t tos2) {
    MutexLocker ml(BytecodeTrace_lock);
    ResourceMark rm;
    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.
      tty->cr();
      tty->print("[%d] ", (int) Thread::current()->osthread()->thread_id());
      method->print_name(tty);
      tty->cr();
      _current_method = method();
    }
    Bytecodes::Code code;
    if (is_wide()) {
      // bcp wasn't advanced if previous bytecode was _wide.
      code = Bytecodes::cast(*(bcp+1));
    } else {
      code = Bytecodes::cast(*bcp);
    }
    int bci = bcp - method->code_base();
    tty->print("[%d] ", (int) Thread::current()->osthread()->thread_id());
    if (Verbose) {
      tty->print("%8d  %4d  " INTPTR_FORMAT " " INTPTR_FORMAT " %s", 
	   BytecodeCounter::counter_value(), bci, tos, tos2, Bytecodes::name(code));
    } else {
      tty->print("%8d  %4d  %s", 
	   BytecodeCounter::counter_value(), bci, Bytecodes::name(code));
    }
    _next_pc = is_wide() ? bcp+2 : bcp+1;
    print_attributes(code, bci);
    // Set is_wide for the next one, since the caller of this doesn't skip
    // the next bytecode.
    _is_wide = (code == Bytecodes::_wide);
  }
 // This method is called while executing the raw bytecodes, so none of
 // the adjustments that BytecodeStream performs applies.
 void trace(methodHandle method, address bcp, uintptr_t tos, uintptr_t tos2, outputStream* st) {
   ResourceMark rm;
   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.
     // It is possible for this block to be skipped, if a garbage
     // _current_method pointer happens to have the same bits as
     // the incoming method.  We could lose a line of trace output.
     // This is acceptable in a debug-only feature.
     st->cr();
     st->print("[%ld] ", (long) Thread::current()->osthread()->thread_id());
     method->print_name(st);
     st->cr();
     _current_method = method();
   }
   Bytecodes::Code code;
   if (is_wide()) {
     // bcp wasn't advanced if previous bytecode was _wide.
     code = Bytecodes::code_at(method(), bcp+1);
   } else {
     code = Bytecodes::code_at(method(), bcp);
   }
   _code = code;
    int bci = bcp - method->code_base();
   st->print("[%ld] ", (long) Thread::current()->osthread()->thread_id());
   if (Verbose) {
     st->print("%8d  %4d  " INTPTR_FORMAT " " INTPTR_FORMAT " %s",
          BytecodeCounter::counter_value(), bci, tos, tos2, Bytecodes::name(code));
   } else {
     st->print("%8d  %4d  %s",
          BytecodeCounter::counter_value(), bci, Bytecodes::name(code));
   }
   _next_pc = is_wide() ? bcp+2 : bcp+1;
   print_attributes(bci);
   // Set is_wide for the next one, since the caller of this doesn't skip
   // the next bytecode.
   _is_wide = (code == Bytecodes::_wide);
   _code = Bytecodes::_illegal;
 }