Top


定義場所(file name)

hotspot/src/share/vm/oops/methodOop.cpp

名前(function name)

void BreakpointInfo::set(methodOop method) {

本体部(body)

  {- -------------------------------------------
  (1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
      ---------------------------------------- -}

    #ifdef ASSERT
      {
        Bytecodes::Code code = (Bytecodes::Code) *method->bcp_from(_bci);
        if (code == Bytecodes::_breakpoint)
          code = method->orig_bytecode_at(_bci);
        assert(orig_bytecode() == code, "original bytecode must be the same");
      }
    #endif

  {- -------------------------------------------
  (1) 指定個所を Bytecodes::_breakpoint で置き換える
      ---------------------------------------- -}

      *method->bcp_from(_bci) = Bytecodes::_breakpoint;

  {- -------------------------------------------
  (1) number_of_breakpoints を増加させる.
      (この値が 0 より大きいメソッドは JIT compile の対象にならない.
       (See: methodOopDesc::is_not_compilable()))

      (#TODO 他にも影響することはあるか?)
      ---------------------------------------- -}

      method->incr_number_of_breakpoints();

  {- -------------------------------------------
  (1) SystemDictionary::notice_modification() で変更回数をあげておく.
      (コンパイル途中にメソッドが変更された場合に, 不正になってしまったコンパイル結果を破棄するために必要な処理.
       (See: ciEnv::system_dictionary_modification_counter_changed()))
      ---------------------------------------- -}

      SystemDictionary::notice_modification();

  {- -------------------------------------------
  (1) Universe::flush_dependents_on_method() を呼んで, 全ての dependents を deopt する.
      ---------------------------------------- -}

      {
        // Deoptimize all dependents on this method
        Thread *thread = Thread::current();
        HandleMark hm(thread);
        methodHandle mh(thread, method);
        Universe::flush_dependents_on_method(mh);
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.