NullPointerException については, 以下の 2通りの検出方法が実装されている (これにより可能な限り明示的なチェックを省略している). どちらの場合も最終的にはシグナルハンドラで SIGSEGV をキャッチすることになる.
どちらの検出方法を使用するかは, MacroAssembler::needs_explicit_null_check() の返り値で決まる. より正確に言うと, Template Interpreter 内で NULL チェックが必要な箇所では MacroAssembler::null_check() によるコード生成が行われる. そして, MacroAssembler::null_check() が生成するコードは MacroAssembler::needs_explicit_null_check() の返り値に応じて以下のように変わる (これは sparc 版でも x86 版でも共通).
needs_explicit_null_check() が true の場合:
null_check() 内で明示的にポインタの参照先にアクセスし, その場で SIGSEGV を起こす.
needs_explicit_null_check() が false の場合:
何もしない (実際の使用箇所で SIGSEGV になるまで放置する).
MacroAssembler::needs_explicit_null_check() の判定条件は「offset が 0 以上かつ pagesize 未満かどうか」.
これは, ポインタがもし NULL であれば 0 以上 pagesize 未満のオフセットを足しても zero page 内なので, その後に実際に使用した箇所で zero page access になるため (= 放置してもいずれ SIGSEGV になるので問題ない).
オブジェクトを扱う様々なテンプレート -> MacroAssembler::null_check() が生成したコード -> MacroAssembler::needs_explicit_null_check() が生成したコード
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.