hotspot/src/share/vm/oops/klass.hpp
この関数は DEFINE_ALLOCATE_PERMANENT() マクロによって生成される. マクロの thisKlass 引数が, 実際の Klass サブクラスに置換される.
// Every subclass on which vtbl_value is called must include this macro.
// Delay the installation of the klassKlass pointer until after the
// the vtable for a new klass has been installed (after the call to new()).
#define DEFINE_ALLOCATE_PERMANENT(thisKlass) \
void* allocate_permanent(KlassHandle& klass_klass, int size, TRAPS) const { \
{- -------------------------------------------
(1) 新しい Klass クラス (の各サブクラス) のオブジェクトを確保する
---------------------------------------- -}
void* result = new(klass_klass, size, THREAD) thisKlass(); \
if (HAS_PENDING_EXCEPTION) return NULL; \
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
klassOop new_klass = ((Klass*) result)->as_klassOop(); \
{- -------------------------------------------
(1) Klass_vtbl::post_new_init_klass() を呼んで,
確保した Klass オブジェクトに対応する klassOop の klass フィールドを初期化する.
(なお, klass フィールドの初期化が最後になるようメモリバリアも張っている)
---------------------------------------- -}
OrderAccess::storestore(); \
post_new_init_klass(klass_klass, new_klass, size); \
{- -------------------------------------------
(1) 結果をリターン
---------------------------------------- -}
return result; \
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.