Top


定義場所(file name)

hotspot/src/share/vm/runtime/java.cpp

名前(function name)

void JDK_Version::initialize() {

本体部(body)

      jdk_version_info info;
      assert(!_current.is_valid(), "Don't initialize twice");

  {- -------------------------------------------
  (1) libjava 内から JDK_GetVersionInfo0() 関数を探す.
      もし見つからなければ, ここでは _partially_initialized を true にするだけで終了.
      ---------------------------------------- -}

      void *lib_handle = os::native_java_library();
      jdk_version_info_fn_t func = CAST_TO_FN_PTR(jdk_version_info_fn_t,
         os::dll_lookup(lib_handle, "JDK_GetVersionInfo0"));

      if (func == NULL) {
        // JDK older than 1.6
        _current._partially_initialized = true;

  {- -------------------------------------------
  (1) JDK_GetVersionInfo0() 関数が見つかれば, 
      関数を呼び出し, その結果を _current に設定する.
      (なお, "1.5.0" と返ってきた場合については "5.0" に変更している模様. (が 1.4.2 についてはそのままにするとのこと))
      ---------------------------------------- -}

      } else {
        (*func)(&info, sizeof(info));

        int major = JDK_VERSION_MAJOR(info.jdk_version);
        int minor = JDK_VERSION_MINOR(info.jdk_version);
        int micro = JDK_VERSION_MICRO(info.jdk_version);
        int build = JDK_VERSION_BUILD(info.jdk_version);
        if (major == 1 && minor > 4) {
          // We represent "1.5.0" as "5.0", but 1.4.2 as itself.
          major = minor;
          minor = micro;
          micro = 0;
        }
        _current = JDK_Version(major, minor, micro, info.update_version,
                               info.special_update_version, build,
                               info.thread_park_blocker == 1,
                               info.post_vm_init_hook_enabled == 1);
      }
    }

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