Up Top

Exception の処理 : 処理の詳細 (2)&(3) : 例外オブジェクトの生成処理 & 例外の送出処理 : Template Interpreter での処理


概要(Summary)

例外オブジェクトの生成と送出処理を行うために, Interpreter クラスに以下のようなフィールドが用意されている.

これらのフィールドには, 各種の例外発生コードのアドレスが登録されており, ここにジャンプすれば例外生成&送出が行える.

    ((cite: hotspot/src/share/vm/interpreter/templateInterpreter.cpp))
        Interpreter::_throw_ArrayIndexOutOfBoundsException_entry = generate_ArrayIndexOutOfBounds_handler("java/lang/ArrayIndexOutOfBoundsException");
        Interpreter::_throw_ArrayStoreException_entry            = generate_klass_exception_handler("java/lang/ArrayStoreException"                 );
        Interpreter::_throw_ArithmeticException_entry            = generate_exception_handler("java/lang/ArithmeticException"           , "/ by zero");
        Interpreter::_throw_ClassCastException_entry             = generate_ClassCastException_handler();
        Interpreter::_throw_NullPointerException_entry           = generate_exception_handler("java/lang/NullPointerException"          , NULL       );
        Interpreter::_throw_StackOverflowError_entry             = generate_StackOverflowError_handler();

備考(Notes)

Interpreter クラスの各フィールドに入っているのは, ほとんどは InterpreterRuntime が用意しているメソッドへのラッパー. (オペランドスタックを空にし, 引数を C++ の calling convention に合わせてレジスタなどに移した後, call_VM で InterpreterRuntime のメソッドを呼び出すだけ).

ただし generate_exception_handler() と generate_klass_exception_handler() については少し異なり, InterpreterRuntime::create_klass_exception() または InterpreterRuntime::create_exception() で例外を作成し, Interpreter::throw_exception_entry() にジャンプして送出処理を行う.

処理の流れ (概要)(Execution Flows : Summary)

Interpreter::throw_ArrayIndexOutOfBoundsExceptionentry の処理

Interpreter::_throw_ArrayIndexOutOfBoundsException_entry が指しているコード (= TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler() が生成したコード)
-> InterpreterRuntime::throw_ArrayIndexOutOfBoundsException()
   -> THROW_MSG()
      -> (See: here for details)

Interpreter::throw_ArrayStoreExceptionentry の処理

Interpreter::_throw_ArrayStoreException_entry が指しているコード (= TemplateInterpreterGenerator::generate_klass_exception_handler() が生成したコード)
-> TemplateInterpreterGenerator::generate_exception_handler_common() が生成したコード
   -> InterpreterRuntime::create_klass_exception()
      -> Exceptions::new_exception()
      -> JavaThread::set_vm_result()
   -> Interpreter::throw_exception_entry() が指しているアドレスにジャンプ
      -> (See: here for details)

Interpreter::throw_ArithmeticExceptionentry の処理

Interpreter::_throw_ArithmeticException_entry が指しているコード (= TemplateInterpreterGenerator::generate_exception_handler() が生成したコード)
-> TemplateInterpreterGenerator::generate_exception_handler_common() が生成したコード
   -> InterpreterRuntime::create_exception()
      -> Exceptions::new_exception()
      -> JavaThread::set_vm_result()
   -> Interpreter::throw_exception_entry() が指しているアドレスにジャンプ
      -> (See: here for details)

Interpreter::throw_ClassCastExceptionentry の処理

Interpreter::_throw_ClassCastException_entry が指しているコード (= TemplateInterpreterGenerator::generate_ClassCastException_handler() が生成したコード)
-> InterpreterRuntime::throw_ClassCastException()
   -> THROW_MSG()
      -> (See: here for details)

Interpreter::throw_NullPointerExceptionentry の処理

Interpreter::_throw_NullPointerException_entry が指しているコード (= TemplateInterpreterGenerator::generate_exception_handler() が生成したコード)
-> (同上)

Interpreter::throw_StackOverflowErrorentry の処理

Interpreter::_throw_StackOverflowError_entry が指しているコード (= TemplateInterpreterGenerator::generate_StackOverflowError_handler() が生成したコード)
-> InterpreterRuntime::throw_StackOverflowError()
   -> get_preinitialized_exception()
   -> THROW_HANDLE()
      -> (See: here for details)

処理の流れ (詳細)(Execution Flows : Details)

TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler() (sparc の場合)

See: here for details

InterpreterRuntime::throw_ArrayIndexOutOfBoundsException()

See: here for details

TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler() (x86_64 の場合)

See: here for details

TemplateInterpreterGenerator::generate_exception_handler()

See: here for details

TemplateInterpreterGenerator::generate_klass_exception_handler()

See: here for details

TemplateInterpreterGenerator::generate_exception_handler_common() (sparc の場合)

See: here for details

InterpreterRuntime::create_klass_exception()

See: here for details

InterpreterRuntime::create_exception()

See: here for details

TemplateInterpreterGenerator::generate_exception_handler_common() (x86_64 の場合)

See: here for details

TemplateInterpreterGenerator::generate_ClassCastException_handler() (sparc の場合)

See: here for details

InterpreterRuntime::throw_ClassCastException()

See: here for details

TemplateInterpreterGenerator::generate_ClassCastException_handler() (x86_64 の場合)

See: here for details

TemplateInterpreterGenerator::generate_StackOverflowError_handler() (sparc の場合)

See: here for details

InterpreterRuntime::throw_StackOverflowError()

See: here for details

get_preinitialized_exception()

See: here for details

TemplateInterpreterGenerator::generate_StackOverflowError_handler() (x86_64 の場合)

(#Under Construction) See: here for details


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