hotspot/src/share/vm/asm/assembler.cpp
bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
// Exception handler checks the nmethod's implicit null checks table
// only when this method returns false.
{- -------------------------------------------
(1) (64 bit 環境で, UseCompressedOops が使用されており, さらに heap base が設定されている場合には,
オフセットは heap base からの相対値で考えないといけない.
offset の値を, それに合わせて修正しておく.)
(See: UseCompressedOops)
---------------------------------------- -}
#ifdef _LP64
if (UseCompressedOops && Universe::narrow_oop_base() != NULL) {
assert (Universe::heap() != NULL, "java heap should be initialized");
// The first page after heap_base is unmapped and
// the 'offset' is equal to [heap_base + offset] for
// narrow oop implicit null checks.
uintptr_t base = (uintptr_t)Universe::narrow_oop_base();
if ((uintptr_t)offset >= base) {
// Normalize offset for the next check.
offset = (intptr_t)(pointer_delta((void*)offset, (void*)base, 1));
}
}
#endif
{- -------------------------------------------
(1) 「アクセス先のオフセットが 0 以上かつ pagesize 未満」であれば false をリターン.
そうでなければ true をリターン.
---------------------------------------- -}
return offset < 0 || os::vm_page_size() <= offset;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.