Top


定義場所(file name)

hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp

名前(function name)

address TemplateInterpreterGenerator::generate_exception_handler_common(
        const char* name, const char* message, bool pass_oop) {

本体部(body)

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(!pass_oop || message == NULL, "either oop or message but not both");

  {- -------------------------------------------
  (1) (ここからが生成するコードの始まり)
      ---------------------------------------- -}

      address entry = __ pc();

  {- -------------------------------------------
  (1) コード生成: (ただし, 引数により, 例外オブジェクトに埋め込むメッセージとして「TOS に存在している
                 オブジェクトのクラス名」を使うよう指定されている場合にのみ生成する)
      「TOS にあるオブジェクトを c_rarg2 レジスタに移しておく.」
      ---------------------------------------- -}

      if (pass_oop) {
        // object is at TOS
        __ pop(c_rarg2);
      }

  {- -------------------------------------------
  (1) コード生成:
      「オペランドスタック("expression stack")を空にする.」
      ---------------------------------------- -}

      // expression stack must be empty before entering the VM if an
      // exception happened
      __ empty_expression_stack();

  {- -------------------------------------------
  (1) コード生成:
      例外オブジェクトを作るためのコードを生成する.
      生成するコードには, 引数に応じて以下の2通りがある.
      * 引数により, 例外オブジェクトに埋め込むメッセージとして「TOS に存在しているオブジェクトのクラス名」を使うように指定されている場合
        「InterpreterRuntime::create_klass_exception() を呼んで例外オブジェクトを生成する.」
        (なお, これは TemplateInterpreterGenerator::generate_klass_exception_handler() から呼ばれた場合のパス.
         See: TemplateInterpreterGenerator::generate_klass_exception_handler())

      * 引数により, 例外オブジェクトに埋め込むメッセージが明示的に指定されている場合
        「InterpreterRuntime::create_exception() を呼んで例外オブジェクトを生成する.」
        (なお, これは TemplateInterpreterGenerator::generate_exception_handler() から呼ばれた場合のパス.
         See: TemplateInterpreterGenerator::generate_exception_handler())
      ---------------------------------------- -}

      // setup parameters
      __ lea(c_rarg1, ExternalAddress((address)name));
      if (pass_oop) {
        __ call_VM(rax, CAST_FROM_FN_PTR(address,
                                         InterpreterRuntime::
                                         create_klass_exception),
                   c_rarg1, c_rarg2);
      } else {
        // kind of lame ExternalAddress can't take NULL because
        // external_word_Relocation will assert.
        if (message != NULL) {
          __ lea(c_rarg2, ExternalAddress((address)message));
        } else {
          __ movptr(c_rarg2, NULL_WORD);
        }
        __ call_VM(rax,
                   CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception),
                   c_rarg1, c_rarg2);
      }

  {- -------------------------------------------
  (1) コード生成:
      「Interpreter::throw_exception_entry() が指しているアドレスにジャンプする.」
      ---------------------------------------- -}

      // throw exception
      __ jump(ExternalAddress(Interpreter::throw_exception_entry()));

  {- -------------------------------------------
  (1) 以上で生成したコードの先頭アドレスをリターン.
      ---------------------------------------- -}

      return entry;
    }

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