hotspot/src/cpu/x86/vm/assembler_x86.cpp
void MacroAssembler::null_check(Register reg, int offset) {
{- -------------------------------------------
(1) MacroAssembler::needs_explicit_null_check() の返り値に応じて,
以下のどちらかの挙動を行う.
* needs_explicit_null_check() が true の場合:
明示的にポインタの参照先をロードする.
(NULL の場合には, この場で SIGSEGV を起こす)
* needs_explicit_null_check() が false の場合:
特に何もしない
(NULL の場合には, その後に実際に使用した箇所で SIGSEGV になるまで放置).
---------------------------------------- -}
if (needs_explicit_null_check(offset)) {
// provoke OS NULL exception if reg = NULL by
// accessing M[reg] w/o changing any (non-CC) registers
// NOTE: cmpl is plenty here to provoke a segv
cmpptr(rax, Address(reg, 0));
// Note: should probably use testl(rax, Address(reg, 0));
// may be shorter code (however, this version of
// testl needs to be implemented first)
} else {
// nothing to do, (later) access of M[reg + offset]
// will provoke OS NULL exception if reg = NULL
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.