Up Top

Exception の処理 : 処理の詳細 (1) : 例外送出条件の検出処理 : signal handler で検出する例外 : NullPointerException の検出処理 : Template Interpreter の場合


概要(Summary)

NullPointerException については, 以下の 2通りの検出方法が実装されている (これにより可能な限り明示的なチェックを省略している). どちらの場合も最終的にはシグナルハンドラで SIGSEGV をキャッチすることになる.

どちらの検出方法を使用するかは, MacroAssembler::needs_explicit_null_check() の返り値で決まる. より正確に言うと, Template Interpreter 内で NULL チェックが必要な箇所では MacroAssembler::null_check() によるコード生成が行われる. そして, MacroAssembler::null_check() が生成するコードは MacroAssembler::needs_explicit_null_check() の返り値に応じて以下のように変わる (これは sparc 版でも x86 版でも共通).

備考(Notes)

MacroAssembler::needs_explicit_null_check() の判定条件は「offset が 0 以上かつ pagesize 未満かどうか」.

これは, ポインタがもし NULL であれば 0 以上 pagesize 未満のオフセットを足しても zero page 内なので, その後に実際に使用した箇所で zero page access になるため (= 放置してもいずれ SIGSEGV になるので問題ない).

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

オブジェクトを扱う様々なテンプレート
-> MacroAssembler::null_check() が生成したコード
   -> MacroAssembler::needs_explicit_null_check() が生成したコード

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

MacroAssembler::null_check() (sparc の場合)

See: here for details

MacroAssembler::null_check() (x86 の場合)

See: here for details

MacroAssembler::needs_explicit_null_check()

See: here for details


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