Skip to content

Instantly share code, notes, and snippets.

@youchan
Last active January 7, 2018 03:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save youchan/dc9353d3c3dd7f2424275b05faf6fb9d to your computer and use it in GitHub Desktop.
Save youchan/dc9353d3c3dd7f2424275b05faf6fb9d to your computer and use it in GitHub Desktop.
名前 カテゴリ 説明
nop nop nop
getlocal variable level, idx で指定されたローカル変数の値をスタックに置く。
setlocal variable level, idx で指定されたローカル変数の値を val にする。
getblockparam variable ブロックパラメータを取得する。
setblockparam variable ブロックパラメータを設定する。
getspecial variable 特殊なローカル変数($~, $_, ...)の値を得る。
setspecial variable 特別なローカル変数($~, $_, ...)の値を設定する。
getinstancevariable variable self のインスタンス変数 id の値を得る。
setinstancevariable variable self のインスタンス変数 id を val にする。
getclassvariable variable 現在のスコープのクラス変数 id の値を得る。
setclassvariable variable klass のクラス変数 id を val にする。
getconstant variable 定数 id の値を得る。
setconstant variable 定数 id の値を val にする。
getglobal variable グローバル変数 id の値を得る。
setglobal variable グローバル変数 id の値を設定する。
putnil put スタックに nil をプッシュする。
putself put スタックに self をプッシュする。
putobject put オブジェクト val をスタックにプッシュする。
putspecialobject put 特別なオブジェクト val をスタックにプッシュする。
putiseq put iseq をスタックにプッシュする。
putstring put 文字列をコピーしてスタックにプッシュする。
concatstrings put スタックトップの文字列を n 個連結し,結果をスタックにプッシュする。
tostring put to_s の結果をスタックにプッシュする。
freezestring put (埋め込み)文字列を freeze する。もし、debug_info が与えられていれば、それを設定する。
toregexp put 文字列 str を正規表現にコンパイルしてスタックにプッシュする。
intern put 文字列 str をシンボルに変換してスタックにプッシュする。
newarray put 新しい配列をスタック上の num 個の値で初期化して生成しプッシュする。
duparray put 配列 ary を dup してスタックにプッシュする。
expandarray put スタックトップのオブジェクトが配列であれば、それを展開する。
concatarray put 二つの配列 ary1, ary2 を連結しスタックへプッシュする。
splatarray put splat のために配列 ary に対して to_a を呼び出す。
newhash put 新しいハッシュをスタックトップの n 個を初期値として生成する。
newrange put Range.new(low, high, flag) のようなオブジェクトを生成しスタックにプッシュする。
pop stack スタックから一つポップする。
dup stack スタックトップをコピーしてスタックにプッシュする。
dupn stack スタックトップの n 個をコピーしてスタックにプッシュする。
swap stack スタックトップの 2 つの値を交換する。
reverse stack スタックトップの n 個の値を逆転する。
reput stack スタックキャッシングの状態を調整するために必要な命令。
topn stack スタックトップから n 個目をスタックにプッシュする。
setn stack スタックトップの値を n 個目のスタックにコピー
adjuststack stack current stack を空にする。
defined setting defined? を行う。
checkmatch setting see above comments.
checkkeyword setting キーワードが指定されているかどうかチェックする
trace2 setting trace 用の命令。
defineclass class/module クラス定義スコープへ移行する。
send method/iterator メソッド呼び出しを行う。ci に必要な情報が格納されている。
opt_str_freeze others
opt_str_uminus others
opt_newarray_max others
opt_newarray_min others
opt_send_without_block optimize ブロックなしでメソッド呼び出しを行う。
invokesuper method/iterator super を実行する。ci に必要な情報が格納されている。
invokeblock method/iterator yield を実行する。
leave method/iterator このスコープから抜ける。
throw exception 大域ジャンプを行う。
jump jump PC を (PC + dst) にする。
branchif jump もし val が false か nil でなければ、PC を (PC + dst) にする。
branchunless jump もし val が false か nil ならば、PC を (PC + dst) にする。
branchnil jump もし val が nil ならば、PC を (PC + dst) にする。
branchiftype jump もし val が type ならば、PC を (PC + dst) にする。
getinlinecache optimize インラインキャッシュが有効なら、値をスタックにプッシュして dst へジャンプする。
setinlinecache optimize インラインキャッシュの値を設定する。
once optimize once を実現する。
opt_case_dispatch optimize case 文で、可能なら表引きでジャンプする。
opt_plus optimize 最適化された X+Y。
opt_minus optimize 最適化された X-Y。
opt_mult optimize 最適化された X*Y。
opt_div optimize 最適化された X/Y。
opt_mod optimize 最適化された X%Y。
opt_eq optimize 最適化された X==Y。
opt_neq optimize 最適化された X!=Y。
opt_lt optimize 最適化された X<Y。
opt_le optimize 最適化された X<=Y。
opt_gt optimize 最適化された X>Y。
opt_ge optimize 最適化された X>=Y。
opt_ltlt optimize 最適化された X<<Y。
opt_aref optimize 最適化された recv[obj]。
opt_aset optimize 最適化された recv[obj] = set。
opt_aset_with optimize 最適化された recv[str] = set。
opt_aref_with optimize 最適化された recv[str]。
opt_length optimize 最適化された recv.length()。
opt_size optimize 最適化された recv.size()。
opt_empty_p optimize 最適化された recv.empty?()。
opt_succ optimize 最適化された recv.succ()。
opt_not optimize 最適化された recv.!()。
opt_regexpmatch1 optimize 最適化された正規表現マッチ。
opt_regexpmatch2 optimize 最適化された正規表現マッチ 2
opt_call_c_function optimize ネイティブコンパイルしたメソッドを起動。
bitblt joke BLT
answer joke 人生、宇宙、すべての答え。
getlocal_OP__WC__0 optimize level, idx で指定されたローカル変数の値をスタックに置く。
getlocal_OP__WC__1 optimize level, idx で指定されたローカル変数の値をスタックに置く。
setlocal_OP__WC__0 optimize level, idx で指定されたローカル変数の値を val にする。
setlocal_OP__WC__1 optimize level, idx で指定されたローカル変数の値を val にする。
putobject_OP_INT2FIX_O_0_C_ optimize オブジェクト val をスタックにプッシュする。
putobject_OP_INT2FIX_O_1_C_ optimize オブジェクト val をスタックにプッシュする。
trace_nop nop nop
trace_getlocal variable level, idx で指定されたローカル変数の値をスタックに置く。
trace_setlocal variable level, idx で指定されたローカル変数の値を val にする。
trace_getblockparam variable ブロックパラメータを取得する。
trace_setblockparam variable ブロックパラメータを設定する。
trace_getspecial variable 特殊なローカル変数($~, $_, ...)の値を得る。
trace_setspecial variable 特別なローカル変数($~, $_, ...)の値を設定する。
trace_getinstancevariable variable self のインスタンス変数 id の値を得る。
trace_setinstancevariable variable self のインスタンス変数 id を val にする。
trace_getclassvariable variable 現在のスコープのクラス変数 id の値を得る。
trace_setclassvariable variable klass のクラス変数 id を val にする。
trace_getconstant variable 定数 id の値を得る。
trace_setconstant variable 定数 id の値を val にする。
trace_getglobal variable グローバル変数 id の値を得る。
trace_setglobal variable グローバル変数 id の値を設定する。
trace_putnil put スタックに nil をプッシュする。
trace_putself put スタックに self をプッシュする。
trace_putobject put オブジェクト val をスタックにプッシュする。
trace_putspecialobject put 特別なオブジェクト val をスタックにプッシュする。
trace_putiseq put iseq をスタックにプッシュする。
trace_putstring put 文字列をコピーしてスタックにプッシュする。
trace_concatstrings put スタックトップの文字列を n 個連結し,結果をスタックにプッシュする。
trace_tostring put to_s の結果をスタックにプッシュする。
trace_freezestring put (埋め込み)文字列を freeze する。もし、debug_info が与えられていれば、それを設定する。
trace_toregexp put 文字列 str を正規表現にコンパイルしてスタックにプッシュする。
trace_intern put 文字列 str をシンボルに変換してスタックにプッシュする。
trace_newarray put 新しい配列をスタック上の num 個の値で初期化して生成しプッシュする。
trace_duparray put 配列 ary を dup してスタックにプッシュする。
trace_expandarray put スタックトップのオブジェクトが配列であれば、それを展開する。
trace_concatarray put 二つの配列 ary1, ary2 を連結しスタックへプッシュする。
trace_splatarray put splat のために配列 ary に対して to_a を呼び出す。
trace_newhash put 新しいハッシュをスタックトップの n 個を初期値として生成する。
trace_newrange put Range.new(low, high, flag) のようなオブジェクトを生成しスタックにプッシュする。
trace_pop stack スタックから一つポップする。
trace_dup stack スタックトップをコピーしてスタックにプッシュする。
trace_dupn stack スタックトップの n 個をコピーしてスタックにプッシュする。
trace_swap stack スタックトップの 2 つの値を交換する。
trace_reverse stack スタックトップの n 個の値を逆転する。
trace_reput stack スタックキャッシングの状態を調整するために必要な命令。
trace_topn stack スタックトップから n 個目をスタックにプッシュする。
trace_setn stack スタックトップの値を n 個目のスタックにコピー
trace_adjuststack stack current stack を空にする。
trace_defined setting defined? を行う。
trace_checkmatch setting see above comments.
trace_checkkeyword setting キーワードが指定されているかどうかチェックする
trace_trace2 setting trace 用の命令。
trace_defineclass class/module クラス定義スコープへ移行する。
trace_send method/iterator メソッド呼び出しを行う。ci に必要な情報が格納されている。
trace_opt_str_freeze others
trace_opt_str_uminus others
trace_opt_newarray_max others
trace_opt_newarray_min others
trace_opt_send_without_block optimize ブロックなしでメソッド呼び出しを行う。
trace_invokesuper method/iterator super を実行する。ci に必要な情報が格納されている。
trace_invokeblock method/iterator yield を実行する。
trace_leave method/iterator このスコープから抜ける。
trace_throw exception 大域ジャンプを行う。
trace_jump jump PC を (PC + dst) にする。
trace_branchif jump もし val が false か nil でなければ、PC を (PC + dst) にする。
trace_branchunless jump もし val が false か nil ならば、PC を (PC + dst) にする。
trace_branchnil jump もし val が nil ならば、PC を (PC + dst) にする。
trace_branchiftype jump もし val が type ならば、PC を (PC + dst) にする。
trace_getinlinecache optimize インラインキャッシュが有効なら、値をスタックにプッシュして dst へジャンプする。
trace_setinlinecache optimize インラインキャッシュの値を設定する。
trace_once optimize once を実現する。
trace_opt_case_dispatch optimize case 文で、可能なら表引きでジャンプする。
trace_opt_plus optimize 最適化された X+Y。
trace_opt_minus optimize 最適化された X-Y。
trace_opt_mult optimize 最適化された X*Y。
trace_opt_div optimize 最適化された X/Y。
trace_opt_mod optimize 最適化された X%Y。
trace_opt_eq optimize 最適化された X==Y。
trace_opt_neq optimize 最適化された X!=Y。
trace_opt_lt optimize 最適化された X<Y。
trace_opt_le optimize 最適化された X<=Y。
trace_opt_gt optimize 最適化された X>Y。
trace_opt_ge optimize 最適化された X>=Y。
trace_opt_ltlt optimize 最適化された X<<Y。
trace_opt_aref optimize 最適化された recv[obj]。
trace_opt_aset optimize 最適化された recv[obj] = set。
trace_opt_aset_with optimize 最適化された recv[str] = set。
trace_opt_aref_with optimize 最適化された recv[str]。
trace_opt_length optimize 最適化された recv.length()。
trace_opt_size optimize 最適化された recv.size()。
trace_opt_empty_p optimize 最適化された recv.empty?()。
trace_opt_succ optimize 最適化された recv.succ()。
trace_opt_not optimize 最適化された recv.!()。
trace_opt_regexpmatch1 optimize 最適化された正規表現マッチ。
trace_opt_regexpmatch2 optimize 最適化された正規表現マッチ 2
trace_opt_call_c_function optimize ネイティブコンパイルしたメソッドを起動。
trace_bitblt joke BLT
trace_answer joke 人生、宇宙、すべての答え。
trace_getlocal_OP__WC__0 optimize level, idx で指定されたローカル変数の値をスタックに置く。
trace_getlocal_OP__WC__1 optimize level, idx で指定されたローカル変数の値をスタックに置く。
trace_setlocal_OP__WC__0 optimize level, idx で指定されたローカル変数の値を val にする。
trace_setlocal_OP__WC__1 optimize level, idx で指定されたローカル変数の値を val にする。
trace_putobject_OP_INT2FIX_O_0_C_ optimize オブジェクト val をスタックにプッシュする。
trace_putobject_OP_INT2FIX_O_1_C_ optimize オブジェクト val をスタックにプッシュする。

nop

Opes

Returns

nop

    /* none */

getlocal

Opes
lindex_t,idx,rb_num_t,level

Returns
VALUE val

level, idx で指定されたローカル変数の値をスタックに置く。

    val = *(vm_get_ep(GET_EP(), level) - idx);
    RB_DEBUG_COUNTER_INC(lvar_get);
    (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);

setlocal

Opes
lindex_t,idx,rb_num_t,level

Returns

level, idx で指定されたローカル変数の値を val にする。

    vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);
    RB_DEBUG_COUNTER_INC(lvar_set);
    (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);

getblockparam

Opes
lindex_t,idx,rb_num_t,level

Returns
VALUE val

ブロックパラメータを取得する。

    const VALUE *ep = vm_get_ep(GET_EP(), level);
    VM_ASSERT(VM_ENV_LOCAL_P(ep));

    if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) {
	val = rb_vm_bh_to_procval(ec, VM_ENV_BLOCK_HANDLER(ep));
	vm_env_write(ep, -(int)idx, val);
	VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);
    }
    else {
	val = *(ep - idx);
	RB_DEBUG_COUNTER_INC(lvar_get);
	(void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
    }

setblockparam

Opes
lindex_t,idx,rb_num_t,level

Returns

ブロックパラメータを設定する。

    const VALUE *ep = vm_get_ep(GET_EP(), level);
    VM_ASSERT(VM_ENV_LOCAL_P(ep));

    vm_env_write(ep, -(int)idx, val);
    RB_DEBUG_COUNTER_INC(lvar_set);
    (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);

    VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);

getspecial

Opes
rb_num_t,key,rb_num_t,type

Returns
VALUE val

特殊なローカル変数($~, $_, ...)の値を得る。

    val = vm_getspecial(ec, GET_LEP(), key, type);

setspecial

Opes
rb_num_t,key

Returns

特別なローカル変数($~, $_, ...)の値を設定する。

    lep_svar_set(ec, GET_LEP(), key, obj);

getinstancevariable

Opes
ID,id,IC,ic

Returns
VALUE val

self のインスタンス変数 id の値を得る。

    val = vm_getinstancevariable(GET_SELF(), id, ic);

setinstancevariable

Opes
ID,id,IC,ic

Returns

self のインスタンス変数 id を val にする。

    vm_setinstancevariable(GET_SELF(), id, val, ic);

getclassvariable

Opes
ID,id

Returns
VALUE val

現在のスコープのクラス変数 id の値を得る。

    val = rb_cvar_get(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id);

setclassvariable

Opes
ID,id

Returns

klass のクラス変数 id を val にする。

    vm_ensure_not_refinement_module(GET_SELF());
    rb_cvar_set(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id, val);

getconstant

Opes
ID,id

Returns
VALUE val

定数 id の値を得る。

    val = vm_get_ev_const(ec, klass, id, 0);

setconstant

Opes
ID,id

Returns

定数 id の値を val にする。

    vm_check_if_namespace(cbase);
    vm_ensure_not_refinement_module(GET_SELF());
    rb_const_set(cbase, id, val);

getglobal

Opes
GENTRY,entry

Returns
VALUE val

グローバル変数 id の値を得る。

    val = GET_GLOBAL((VALUE)entry);

setglobal

Opes
GENTRY,entry

Returns

グローバル変数 id の値を設定する。

    SET_GLOBAL((VALUE)entry, val);

putnil

Opes

Returns
VALUE val

スタックに nil をプッシュする。

    val = Qnil;

putself

Opes

Returns
VALUE val

スタックに self をプッシュする。

    val = GET_SELF();

putobject

Opes
VALUE,val

Returns
VALUE val

オブジェクト val をスタックにプッシュする。

    /* */

putspecialobject

Opes
rb_num_t,value_type

Returns
VALUE val

特別なオブジェクト val をスタックにプッシュする。

    enum vm_special_object_type type;

    type = (enum vm_special_object_type)value_type;
    val = vm_get_special_object(GET_EP(), type);

putiseq

Opes
ISEQ,iseq

Returns
VALUE ret

iseq をスタックにプッシュする。

    ret = (VALUE)iseq;

putstring

Opes
VALUE,str

Returns
VALUE val

文字列をコピーしてスタックにプッシュする。

    val = rb_str_resurrect(str);

concatstrings

Opes
rb_num_t,num

Returns
VALUE val

スタックトップの文字列を n 個連結し,結果をスタックにプッシュする。

    val = rb_str_concat_literals(num, STACK_ADDR_FROM_TOP(num));
    POPN(num);

tostring

Opes

Returns
VALUE val

to_s の結果をスタックにプッシュする。

    VALUE rb_obj_as_string_result(VALUE str, VALUE obj);
    val = rb_obj_as_string_result(str, val);

freezestring

Opes
VALUE,debug_info

Returns
VALUE str

(埋め込み)文字列を freeze する。もし、debug_info が与えられていれば、それを設定する。

    vm_freezestring(str, debug_info);

toregexp

Opes
rb_num_t,opt,rb_num_t,cnt

Returns
VALUE val

文字列 str を正規表現にコンパイルしてスタックにプッシュする。

    VALUE rb_reg_new_ary(VALUE ary, int options);
    VALUE rb_ary_tmp_new_from_values(VALUE, long, const VALUE *);
    const VALUE ary = rb_ary_tmp_new_from_values(0, cnt, STACK_ADDR_FROM_TOP(cnt));
    POPN(cnt);
    val = rb_reg_new_ary(ary, (int)opt);
    rb_ary_clear(ary);

intern

Opes

Returns
VALUE sym

文字列 str をシンボルに変換してスタックにプッシュする。

    sym = rb_str_intern(str);

newarray

Opes
rb_num_t,num

Returns
VALUE val

新しい配列をスタック上の num 個の値で初期化して生成しプッシュする。

    val = rb_ary_new4(num, STACK_ADDR_FROM_TOP(num));
    POPN(num);

duparray

Opes
VALUE,ary

Returns
VALUE val

配列 ary を dup してスタックにプッシュする。

    val = rb_ary_resurrect(ary);

expandarray

Opes
rb_num_t,num,rb_num_t,flag

Returns
... ...

スタックトップのオブジェクトが配列であれば、それを展開する。

    vm_expandarray(GET_CFP(), ary, num, (int)flag);

concatarray

Opes

Returns
VALUE ary

二つの配列 ary1, ary2 を連結しスタックへプッシュする。

    ary = vm_concat_array(ary1, ary2);

splatarray

Opes
VALUE,flag

Returns
VALUE obj

splat のために配列 ary に対して to_a を呼び出す。

    obj = vm_splat_array(flag, ary);

newhash

Opes
rb_num_t,num

Returns
VALUE val

新しいハッシュをスタックトップの n 個を初期値として生成する。

    RUBY_DTRACE_CREATE_HOOK(HASH, num);

    val = rb_hash_new_with_size(num / 2);

    if (num) {
        rb_hash_bulk_insert(num, STACK_ADDR_FROM_TOP(num), val);
    }
    POPN(num);

newrange

Opes
rb_num_t,flag

Returns
VALUE val

Range.new(low, high, flag) のようなオブジェクトを生成しスタックにプッシュする。

    val = rb_range_new(low, high, (int)flag);

pop

Opes

Returns

スタックから一つポップする。

    (void)val;
    /* none */

dup

Opes

Returns
VALUE val2 VALUE val1

スタックトップをコピーしてスタックにプッシュする。

    val1 = val2 = val;

dupn

Opes
rb_num_t,n

Returns
... ...

スタックトップの n 個をコピーしてスタックにプッシュする。

    void *dst = GET_SP();
    void *src = STACK_ADDR_FROM_TOP(n);

    INC_SP(n); /* alloca */
    MEMCPY(dst, src, VALUE, n);

swap

Opes

Returns
VALUE val VALUE obj

スタックトップの 2 つの値を交換する。

    /* none */

reverse

Opes
rb_num_t,n

Returns
... ...

スタックトップの n 個の値を逆転する。

    rb_num_t i;
    VALUE *sp = STACK_ADDR_FROM_TOP(n);

    for (i=0; i<n/2; i++) {
	VALUE v0 = sp[i];
	VALUE v1 = TOPN(i);
	sp[i] = v1;
	TOPN(i) = v0;
    }

reput

Opes

Returns
VALUE val

スタックキャッシングの状態を調整するために必要な命令。

    /* none */

topn

Opes
rb_num_t,n

Returns
VALUE val

スタックトップから n 個目をスタックにプッシュする。

    val = TOPN(n);

setn

Opes
rb_num_t,n

Returns
VALUE val

スタックトップの値を n 個目のスタックにコピー

    TOPN(n-1) = val;

adjuststack

Opes
rb_num_t,n

Returns
... ...

current stack を空にする。

    DEC_SP(n);

defined

Opes
rb_num_t,op_type,VALUE,obj,VALUE,needstr

Returns
VALUE val

defined? を行う。

    val = vm_defined(ec, GET_CFP(), op_type, obj, needstr, v);

checkmatch

Opes
rb_num_t,flag

Returns
VALUE result

see above comments.

    result = vm_check_match(ec, target, pattern, flag);

checkkeyword

Opes
lindex_t,kw_bits_index,rb_num_t,keyword_index

Returns
VALUE ret

キーワードが指定されているかどうかチェックする

    ret = vm_check_keyword(kw_bits_index, keyword_index, GET_EP());

trace2

Opes
rb_num_t,nf,VALUE,data

Returns

trace 用の命令。

    rb_event_flag_t flag = (rb_event_flag_t)nf;

    vm_dtrace(flag, ec);
    EXEC_EVENT_HOOK(ec, flag, GET_SELF(), 0, 0, 0 /* id and klass are resolved at callee */, data);

defineclass

Opes
ID,id,ISEQ,class_iseq,rb_num_t,flags

Returns
VALUE val

クラス定義スコープへ移行する。

    VALUE klass = vm_find_or_create_class_by_id(id, flags, cbase, super);

    rb_iseq_check(class_iseq);

    /* enter scope */
    vm_push_frame(ec, class_iseq, VM_FRAME_MAGIC_CLASS | VM_ENV_FLAG_LOCAL, klass,
		  GET_BLOCK_HANDLER(),
		  (VALUE)vm_cref_push(ec, klass, NULL, FALSE),
		  class_iseq->body->iseq_encoded, GET_SP(),
		  class_iseq->body->local_table_size,
		  class_iseq->body->stack_max);
    RESTORE_REGS();
    NEXT_INSN();

send

Opes
CALL_INFO,ci,CALL_CACHE,cc,ISEQ,blockiseq

Returns
VALUE val

メソッド呼び出しを行う。ci に必要な情報が格納されている。

    struct rb_calling_info calling;

    vm_caller_setup_arg_block(ec, reg_cfp, &calling, ci, blockiseq, FALSE);
    vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc));
    CALL_METHOD(&calling, ci, cc);

opt_str_freeze

Opes
VALUE,str

Returns
VALUE val

    if (BASIC_OP_UNREDEFINED_P(BOP_FREEZE, STRING_REDEFINED_OP_FLAG)) {
	val = str;
    }
    else {
	val = rb_funcall(rb_str_resurrect(str), idFreeze, 0);
    }

opt_str_uminus

Opes
VALUE,str

Returns
VALUE val

    if (BASIC_OP_UNREDEFINED_P(BOP_UMINUS, STRING_REDEFINED_OP_FLAG)) {
	val = str;
    }
    else {
	val = rb_funcall(rb_str_resurrect(str), idUMinus, 0);
    }

opt_newarray_max

Opes
rb_num_t,num

Returns
VALUE val

    val = vm_opt_newarray_max(num, STACK_ADDR_FROM_TOP(num));
    POPN(num);

opt_newarray_min

Opes
rb_num_t,num

Returns
VALUE val

    val = vm_opt_newarray_min(num, STACK_ADDR_FROM_TOP(num));
    POPN(num);

opt_send_without_block

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

ブロックなしでメソッド呼び出しを行う。

    struct rb_calling_info calling;
    calling.block_handler = VM_BLOCK_HANDLER_NONE;
    vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc));
    CALL_METHOD(&calling, ci, cc);

invokesuper

Opes
CALL_INFO,ci,CALL_CACHE,cc,ISEQ,blockiseq

Returns
VALUE val

super を実行する。ci に必要な情報が格納されている。

    struct rb_calling_info calling;
    calling.argc = ci->orig_argc;

    vm_caller_setup_arg_block(ec, reg_cfp, &calling, ci, blockiseq, TRUE);
    calling.recv = GET_SELF();
    vm_search_super_method(ec, GET_CFP(), &calling, ci, cc);
    CALL_METHOD(&calling, ci, cc);

invokeblock

Opes
CALL_INFO,ci

Returns
VALUE val

yield を実行する。

    struct rb_calling_info calling;
    calling.argc = ci->orig_argc;
    calling.block_handler = VM_BLOCK_HANDLER_NONE;
    calling.recv = GET_SELF();

    val = vm_invoke_block(ec, GET_CFP(), &calling, ci);
    if (val == Qundef) {
	RESTORE_REGS();
	NEXT_INSN();
    }

leave

Opes

Returns
VALUE val

このスコープから抜ける。

    if (OPT_CHECKED_RUN) {
	const VALUE *const bp = vm_base_ptr(reg_cfp);
	if (reg_cfp->sp != bp) {
	    vm_stack_consistency_error(ec, reg_cfp, bp);
	}
    }

    RUBY_VM_CHECK_INTS(ec);

    if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {
#if OPT_CALL_THREADED_CODE
	rb_ec_thread_ptr(ec)->retval = val;
	return 0;
#else
	return val;
#endif
    }
    else {
	RESTORE_REGS();
    }

throw

Opes
rb_num_t,throw_state

Returns
VALUE val

大域ジャンプを行う。

    RUBY_VM_CHECK_INTS(ec);
    val = vm_throw(ec, GET_CFP(), throw_state, throwobj);
    THROW_EXCEPTION(val);
    /* unreachable */

jump

Opes
OFFSET,dst

Returns

PC を (PC + dst) にする。

    RUBY_VM_CHECK_INTS(ec);
    JUMP(dst);

branchif

Opes
OFFSET,dst

Returns

もし val が false か nil でなければ、PC を (PC + dst) にする。

    if (RTEST(val)) {
	RUBY_VM_CHECK_INTS(ec);
	JUMP(dst);
    }

branchunless

Opes
OFFSET,dst

Returns

もし val が false か nil ならば、PC を (PC + dst) にする。

    if (!RTEST(val)) {
	RUBY_VM_CHECK_INTS(ec);
	JUMP(dst);
    }

branchnil

Opes
OFFSET,dst

Returns

もし val が nil ならば、PC を (PC + dst) にする。

    if (NIL_P(val)) {
	RUBY_VM_CHECK_INTS(ec);
	JUMP(dst);
    }

branchiftype

Opes
rb_num_t,type,OFFSET,dst

Returns

もし val が type ならば、PC を (PC + dst) にする。

    if (TYPE(val) == (int)type) {
	RUBY_VM_CHECK_INTS(ec);
	JUMP(dst);
    }

getinlinecache

Opes
OFFSET,dst,IC,ic

Returns
VALUE val

インラインキャッシュが有効なら、値をスタックにプッシュして dst へジャンプする。

    val = vm_ic_hit_p(ic, GET_EP());
    if (val != Qnil) {
	JUMP(dst);
    }

setinlinecache

Opes
IC,ic

Returns
VALUE val

インラインキャッシュの値を設定する。

    vm_ic_update(ic, val, GET_EP());

once

Opes
ISEQ,iseq,IC,ic

Returns
VALUE val

once を実現する。

    val = vm_once_dispatch(ec, iseq, ic);

opt_case_dispatch

Opes
CDHASH,hash,OFFSET,else_offset

Returns

case 文で、可能なら表引きでジャンプする。

    OFFSET dst = vm_case_dispatch(hash, else_offset, key);

    if (dst) {
	JUMP(dst);
    }

opt_plus

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X+Y。

    val = vm_opt_plus(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_minus

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X-Y。

    val = vm_opt_minus(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_mult

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X*Y。

    val = vm_opt_mult(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_div

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X/Y。

    val = vm_opt_div(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_mod

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X%Y。

    val = vm_opt_mod(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_eq

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X==Y。

    val = opt_eq_func(recv, obj, ci, cc);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_neq

Opes
CALL_INFO,ci,CALL_CACHE,cc,CALL_INFO,ci_eq,CALL_CACHE,cc_eq

Returns
VALUE val

最適化された X!=Y。

    val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_lt

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X<Y。

    val = vm_opt_lt(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_le

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X<=Y。

    val = vm_opt_le(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_gt

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X>Y。

    val = vm_opt_gt(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_ge

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X>=Y。

    val = vm_opt_ge(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_ltlt

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X<<Y。

    val = vm_opt_ltlt(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_aref

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv[obj]。

    val = vm_opt_aref(recv, obj);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	CALL_SIMPLE_METHOD(recv);
    }

opt_aset

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv[obj] = set。

    val = vm_opt_aset(recv, obj, set);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(obj);
	PUSH(set);
	CALL_SIMPLE_METHOD(recv);
    }

opt_aset_with

Opes
CALL_INFO,ci,CALL_CACHE,cc,VALUE,key

Returns
VALUE val

最適化された recv[str] = set。

    VALUE tmp = vm_opt_aset_with(recv, key, val);

    if (tmp != Qundef) {
	val = tmp;
    }
    else {
	/* other */
	PUSH(recv);
	PUSH(rb_str_resurrect(key));
	PUSH(val);
	CALL_SIMPLE_METHOD(recv);
    }

opt_aref_with

Opes
CALL_INFO,ci,CALL_CACHE,cc,VALUE,key

Returns
VALUE val

最適化された recv[str]。

    val = vm_opt_aref_with(recv, key);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	PUSH(rb_str_resurrect(key));
	CALL_SIMPLE_METHOD(recv);
    }

opt_length

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.length()。

    val = vm_opt_length(recv, BOP_LENGTH);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	CALL_SIMPLE_METHOD(recv);
    }

opt_size

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.size()。

    val = vm_opt_length(recv, BOP_SIZE);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	CALL_SIMPLE_METHOD(recv);
    }

opt_empty_p

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.empty?()。

    val = vm_opt_empty_p(recv);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	CALL_SIMPLE_METHOD(recv);
    }

opt_succ

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.succ()。

    val = vm_opt_succ(recv);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	CALL_SIMPLE_METHOD(recv);
    }

opt_not

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.!()。

    val = vm_opt_not(ci, cc, recv);

    if (val == Qundef) {
	/* other */
	PUSH(recv);
	CALL_SIMPLE_METHOD(recv);
    }

opt_regexpmatch1

Opes
VALUE,recv

Returns
VALUE val

最適化された正規表現マッチ。

    val = vm_opt_regexpmatch1(recv, obj);

opt_regexpmatch2

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された正規表現マッチ 2

    val = vm_opt_regexpmatch2(obj2, obj1);

    if (val == Qundef) {
	/* other */
	PUSH(obj2);
	PUSH(obj1);
	CALL_SIMPLE_METHOD(obj2);
    }

opt_call_c_function

Opes
rb_insn_func_t,funcptr

Returns

ネイティブコンパイルしたメソッドを起動。

    reg_cfp = (funcptr)(ec, reg_cfp);

    if (reg_cfp == 0) {
	VALUE err = ec->errinfo;
	ec->errinfo = Qnil;
	THROW_EXCEPTION(err);
    }

    RESTORE_REGS();
    NEXT_INSN();

bitblt

Opes

Returns
VALUE ret

BLT

    ret = rb_str_new2("a bit of bacon, lettuce and tomato");

answer

Opes

Returns
VALUE ret

人生、宇宙、すべての答え。

    ret = INT2FIX(42);

getlocal_OP__WC__0

Opes
lindex_t,idx

Returns
VALUE val

level, idx で指定されたローカル変数の値をスタックに置く。

    val = *(vm_get_ep(GET_EP(), level) - idx);
    RB_DEBUG_COUNTER_INC(lvar_get);
    (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);

getlocal_OP__WC__1

Opes
lindex_t,idx

Returns
VALUE val

level, idx で指定されたローカル変数の値をスタックに置く。

    val = *(vm_get_ep(GET_EP(), level) - idx);
    RB_DEBUG_COUNTER_INC(lvar_get);
    (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);

setlocal_OP__WC__0

Opes
lindex_t,idx

Returns

level, idx で指定されたローカル変数の値を val にする。

    vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);
    RB_DEBUG_COUNTER_INC(lvar_set);
    (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);

setlocal_OP__WC__1

Opes
lindex_t,idx

Returns

level, idx で指定されたローカル変数の値を val にする。

    vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val);
    RB_DEBUG_COUNTER_INC(lvar_set);
    (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);

putobject_OP_INT2FIX_O_0_C_

Opes

Returns
VALUE val

オブジェクト val をスタックにプッシュする。

    /* */

putobject_OP_INT2FIX_O_1_C_

Opes

Returns
VALUE val

オブジェクト val をスタックにプッシュする。

    /* */

trace_nop

Opes

Returns

nop

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_nop;

trace_getlocal

Opes
lindex_t,idx,rb_num_t,level

Returns
VALUE val

level, idx で指定されたローカル変数の値をスタックに置く。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getlocal;

trace_setlocal

Opes
lindex_t,idx,rb_num_t,level

Returns

level, idx で指定されたローカル変数の値を val にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setlocal;

trace_getblockparam

Opes
lindex_t,idx,rb_num_t,level

Returns
VALUE val

ブロックパラメータを取得する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getblockparam;

trace_setblockparam

Opes
lindex_t,idx,rb_num_t,level

Returns

ブロックパラメータを設定する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setblockparam;

trace_getspecial

Opes
rb_num_t,key,rb_num_t,type

Returns
VALUE val

特殊なローカル変数($~, $_, ...)の値を得る。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getspecial;

trace_setspecial

Opes
rb_num_t,key

Returns

特別なローカル変数($~, $_, ...)の値を設定する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setspecial;

trace_getinstancevariable

Opes
ID,id,IC,ic

Returns
VALUE val

self のインスタンス変数 id の値を得る。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getinstancevariable;

trace_setinstancevariable

Opes
ID,id,IC,ic

Returns

self のインスタンス変数 id を val にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setinstancevariable;

trace_getclassvariable

Opes
ID,id

Returns
VALUE val

現在のスコープのクラス変数 id の値を得る。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getclassvariable;

trace_setclassvariable

Opes
ID,id

Returns

klass のクラス変数 id を val にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setclassvariable;

trace_getconstant

Opes
ID,id

Returns
VALUE val

定数 id の値を得る。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getconstant;

trace_setconstant

Opes
ID,id

Returns

定数 id の値を val にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setconstant;

trace_getglobal

Opes
GENTRY,entry

Returns
VALUE val

グローバル変数 id の値を得る。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getglobal;

trace_setglobal

Opes
GENTRY,entry

Returns

グローバル変数 id の値を設定する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setglobal;

trace_putnil

Opes

Returns
VALUE val

スタックに nil をプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_putnil;

trace_putself

Opes

Returns
VALUE val

スタックに self をプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_putself;

trace_putobject

Opes
VALUE,val

Returns
VALUE val

オブジェクト val をスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_putobject;

trace_putspecialobject

Opes
rb_num_t,value_type

Returns
VALUE val

特別なオブジェクト val をスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_putspecialobject;

trace_putiseq

Opes
ISEQ,iseq

Returns
VALUE ret

iseq をスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_putiseq;

trace_putstring

Opes
VALUE,str

Returns
VALUE val

文字列をコピーしてスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_putstring;

trace_concatstrings

Opes
rb_num_t,num

Returns
VALUE val

スタックトップの文字列を n 個連結し,結果をスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_concatstrings;

trace_tostring

Opes

Returns
VALUE val

to_s の結果をスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_tostring;

trace_freezestring

Opes
VALUE,debug_info

Returns
VALUE str

(埋め込み)文字列を freeze する。もし、debug_info が与えられていれば、それを設定する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_freezestring;

trace_toregexp

Opes
rb_num_t,opt,rb_num_t,cnt

Returns
VALUE val

文字列 str を正規表現にコンパイルしてスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_toregexp;

trace_intern

Opes

Returns
VALUE sym

文字列 str をシンボルに変換してスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_intern;

trace_newarray

Opes
rb_num_t,num

Returns
VALUE val

新しい配列をスタック上の num 個の値で初期化して生成しプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_newarray;

trace_duparray

Opes
VALUE,ary

Returns
VALUE val

配列 ary を dup してスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_duparray;

trace_expandarray

Opes
rb_num_t,num,rb_num_t,flag

Returns
... ...

スタックトップのオブジェクトが配列であれば、それを展開する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_expandarray;

trace_concatarray

Opes

Returns
VALUE ary

二つの配列 ary1, ary2 を連結しスタックへプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_concatarray;

trace_splatarray

Opes
VALUE,flag

Returns
VALUE obj

splat のために配列 ary に対して to_a を呼び出す。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_splatarray;

trace_newhash

Opes
rb_num_t,num

Returns
VALUE val

新しいハッシュをスタックトップの n 個を初期値として生成する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_newhash;

trace_newrange

Opes
rb_num_t,flag

Returns
VALUE val

Range.new(low, high, flag) のようなオブジェクトを生成しスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_newrange;

trace_pop

Opes

Returns

スタックから一つポップする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_pop;

trace_dup

Opes

Returns
VALUE val2 VALUE val1

スタックトップをコピーしてスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_dup;

trace_dupn

Opes
rb_num_t,n

Returns
... ...

スタックトップの n 個をコピーしてスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_dupn;

trace_swap

Opes

Returns
VALUE val VALUE obj

スタックトップの 2 つの値を交換する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_swap;

trace_reverse

Opes
rb_num_t,n

Returns
... ...

スタックトップの n 個の値を逆転する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_reverse;

trace_reput

Opes

Returns
VALUE val

スタックキャッシングの状態を調整するために必要な命令。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_reput;

trace_topn

Opes
rb_num_t,n

Returns
VALUE val

スタックトップから n 個目をスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_topn;

trace_setn

Opes
rb_num_t,n

Returns
VALUE val

スタックトップの値を n 個目のスタックにコピー

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setn;

trace_adjuststack

Opes
rb_num_t,n

Returns
... ...

current stack を空にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_adjuststack;

trace_defined

Opes
rb_num_t,op_type,VALUE,obj,VALUE,needstr

Returns
VALUE val

defined? を行う。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_defined;

trace_checkmatch

Opes
rb_num_t,flag

Returns
VALUE result

see above comments.

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_checkmatch;

trace_checkkeyword

Opes
lindex_t,kw_bits_index,rb_num_t,keyword_index

Returns
VALUE ret

キーワードが指定されているかどうかチェックする

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_checkkeyword;

trace_trace2

Opes
rb_num_t,nf,VALUE,data

Returns

trace 用の命令。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_trace2;

trace_defineclass

Opes
ID,id,ISEQ,class_iseq,rb_num_t,flags

Returns
VALUE val

クラス定義スコープへ移行する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_defineclass;

trace_send

Opes
CALL_INFO,ci,CALL_CACHE,cc,ISEQ,blockiseq

Returns
VALUE val

メソッド呼び出しを行う。ci に必要な情報が格納されている。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_send;

trace_opt_str_freeze

Opes
VALUE,str

Returns
VALUE val

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_str_freeze;

trace_opt_str_uminus

Opes
VALUE,str

Returns
VALUE val

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_str_uminus;

trace_opt_newarray_max

Opes
rb_num_t,num

Returns
VALUE val

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_newarray_max;

trace_opt_newarray_min

Opes
rb_num_t,num

Returns
VALUE val

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_newarray_min;

trace_opt_send_without_block

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

ブロックなしでメソッド呼び出しを行う。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_send_without_block;

trace_invokesuper

Opes
CALL_INFO,ci,CALL_CACHE,cc,ISEQ,blockiseq

Returns
VALUE val

super を実行する。ci に必要な情報が格納されている。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_invokesuper;

trace_invokeblock

Opes
CALL_INFO,ci

Returns
VALUE val

yield を実行する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_invokeblock;

trace_leave

Opes

Returns
VALUE val

このスコープから抜ける。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_leave;

trace_throw

Opes
rb_num_t,throw_state

Returns
VALUE val

大域ジャンプを行う。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_throw;

trace_jump

Opes
OFFSET,dst

Returns

PC を (PC + dst) にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_jump;

trace_branchif

Opes
OFFSET,dst

Returns

もし val が false か nil でなければ、PC を (PC + dst) にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_branchif;

trace_branchunless

Opes
OFFSET,dst

Returns

もし val が false か nil ならば、PC を (PC + dst) にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_branchunless;

trace_branchnil

Opes
OFFSET,dst

Returns

もし val が nil ならば、PC を (PC + dst) にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_branchnil;

trace_branchiftype

Opes
rb_num_t,type,OFFSET,dst

Returns

もし val が type ならば、PC を (PC + dst) にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_branchiftype;

trace_getinlinecache

Opes
OFFSET,dst,IC,ic

Returns
VALUE val

インラインキャッシュが有効なら、値をスタックにプッシュして dst へジャンプする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getinlinecache;

trace_setinlinecache

Opes
IC,ic

Returns
VALUE val

インラインキャッシュの値を設定する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setinlinecache;

trace_once

Opes
ISEQ,iseq,IC,ic

Returns
VALUE val

once を実現する。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_once;

trace_opt_case_dispatch

Opes
CDHASH,hash,OFFSET,else_offset

Returns

case 文で、可能なら表引きでジャンプする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_case_dispatch;

trace_opt_plus

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X+Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_plus;

trace_opt_minus

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X-Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_minus;

trace_opt_mult

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X*Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_mult;

trace_opt_div

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X/Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_div;

trace_opt_mod

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X%Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_mod;

trace_opt_eq

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X==Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_eq;

trace_opt_neq

Opes
CALL_INFO,ci,CALL_CACHE,cc,CALL_INFO,ci_eq,CALL_CACHE,cc_eq

Returns
VALUE val

最適化された X!=Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_neq;

trace_opt_lt

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X<Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_lt;

trace_opt_le

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X<=Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_le;

trace_opt_gt

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X>Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_gt;

trace_opt_ge

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X>=Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_ge;

trace_opt_ltlt

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された X<<Y。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_ltlt;

trace_opt_aref

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv[obj]。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_aref;

trace_opt_aset

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv[obj] = set。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_aset;

trace_opt_aset_with

Opes
CALL_INFO,ci,CALL_CACHE,cc,VALUE,key

Returns
VALUE val

最適化された recv[str] = set。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_aset_with;

trace_opt_aref_with

Opes
CALL_INFO,ci,CALL_CACHE,cc,VALUE,key

Returns
VALUE val

最適化された recv[str]。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_aref_with;

trace_opt_length

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.length()。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_length;

trace_opt_size

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.size()。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_size;

trace_opt_empty_p

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.empty?()。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_empty_p;

trace_opt_succ

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.succ()。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_succ;

trace_opt_not

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された recv.!()。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_not;

trace_opt_regexpmatch1

Opes
VALUE,recv

Returns
VALUE val

最適化された正規表現マッチ。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_regexpmatch1;

trace_opt_regexpmatch2

Opes
CALL_INFO,ci,CALL_CACHE,cc

Returns
VALUE val

最適化された正規表現マッチ 2

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_regexpmatch2;

trace_opt_call_c_function

Opes
rb_insn_func_t,funcptr

Returns

ネイティブコンパイルしたメソッドを起動。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_opt_call_c_function;

trace_bitblt

Opes

Returns
VALUE ret

BLT

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_bitblt;

trace_answer

Opes

Returns
VALUE ret

人生、宇宙、すべての答え。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_answer;

trace_getlocal_OP__WC__0

Opes
lindex_t,idx

Returns
VALUE val

level, idx で指定されたローカル変数の値をスタックに置く。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getlocal_OP__WC__0;

trace_getlocal_OP__WC__1

Opes
lindex_t,idx

Returns
VALUE val

level, idx で指定されたローカル変数の値をスタックに置く。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_getlocal_OP__WC__1;

trace_setlocal_OP__WC__0

Opes
lindex_t,idx

Returns

level, idx で指定されたローカル変数の値を val にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setlocal_OP__WC__0;

trace_setlocal_OP__WC__1

Opes
lindex_t,idx

Returns

level, idx で指定されたローカル変数の値を val にする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_setlocal_OP__WC__1;

trace_putobject_OP_INT2FIX_O_0_C_

Opes

Returns
VALUE val

オブジェクト val をスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_putobject_OP_INT2FIX_O_0_C_;

trace_putobject_OP_INT2FIX_O_1_C_

Opes

Returns
VALUE val

オブジェクト val をスタックにプッシュする。

        vm_trace(ec, GET_CFP(), GET_PC());
        goto start_of_putobject_OP_INT2FIX_O_1_C_;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment