hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
address SignatureHandlerLibrary::set_handler(CodeBuffer* buffer) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
address handler = _handler;
int insts_size = buffer->pure_insts_size();
{- -------------------------------------------
(1) もし現状の BufferBlob では大きさが足りないようなら,
SignatureHandlerLibrary::set_handler_blob() を呼んで作り直しておく.
---------------------------------------- -}
if (handler + insts_size > _handler_blob->code_end()) {
// get a new handler blob
handler = set_handler_blob();
}
{- -------------------------------------------
(1) もし BufferBlob が存在していれば (NULL でなければ),
引数で渡されたコードを memcpy() で BufferBlob 内にコピーする.
(ついでに, SignatureHandlerLibrary::pd_set_handler() で
プラットフォーム依存な処理を(もしそんなものがあるなら)行い,
ICache::invalidate_range() でコピー範囲の命令キャッシュを invalidate しておく)
その後, コピー先の先頭アドレスをリターン.
(BufferBlob が存在していなければ NULL をリターン).
---------------------------------------- -}
if (handler != NULL) {
memcpy(handler, buffer->insts_begin(), insts_size);
pd_set_handler(handler);
ICache::invalidate_range(handler, insts_size);
_handler = handler + insts_size;
}
{- -------------------------------------------
(1) 結果をリターン
---------------------------------------- -}
return handler;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.