Top


定義場所(file name)

hotspot/src/share/vm/interpreter/interpreterRuntime.cpp

名前(function name)

IRT_ENTRY(void, InterpreterRuntime::prepare_native_call(JavaThread* thread, methodOopDesc* method))

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      methodHandle m(thread, method);

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(m->is_native(), "sanity check");

  {- -------------------------------------------
  (1) もしまだ呼び出し先の関数とのダイナミックリンクが終わっていなければ
      (= methodOopDesc::has_native_function() が false を返す場合は), 
      NativeLookup::lookup() でリンクしておく.

      (See: [here](no3059err.html) for details)
      ---------------------------------------- -}

      // lookup native function entry point if it doesn't exist
      bool in_base_library;
      if (!m->has_native_function()) {
        NativeLookup::lookup(m, in_base_library, CHECK);
      }

  {- -------------------------------------------
  (1) SignatureHandlerLibrary::add() を呼び出し, 
      (まだ生成されていなければ)このメソッド用の signature handler を生成しておく.
      ---------------------------------------- -}

      // make sure signature handler is installed
      SignatureHandlerLibrary::add(m);

  {- -------------------------------------------
  (1) (なおコメントによると, インタープリタのコードは signature handler を先にチェックし, 
       その後 native entry point 等をチェックするので, 
       マルチプロセッサ環境のことを考えると, 値をセットする時には逆に 
       signature handler を最後にセットするようにしないといけない, とのこと.)
      ---------------------------------------- -}

      // The interpreter entry point checks the signature handler first,
      // before trying to fetch the native entry point and klass mirror.
      // We must set the signature handler last, so that multiple processors
      // preparing the same method will be sure to see non-null entry & mirror.
    IRT_END

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