Top


定義場所(file name)

hotspot/src/cpu/x86/vm/assembler_x86.cpp

名前(function name)

void MacroAssembler::null_check(Register reg, int offset) {

本体部(body)

  {- -------------------------------------------
  (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.