私はRubyVMの実装に取り組んでおり、オペコードに関するいくつかのドキュメントを探しましたが、役に立ちませんでした。
オペコードがどのように機能するかを具体的に知っている人putspecialobject、または完全なドキュメントへのリンクを知っている人がいれば、とても感謝しています!
私はRubyVMの実装に取り組んでおり、オペコードに関するいくつかのドキュメントを探しましたが、役に立ちませんでした。
オペコードがどのように機能するかを具体的に知っている人putspecialobject、または完全なドキュメントへのリンクを知っている人がいれば、とても感謝しています!
insns.def から:
DEFINE_INSN putspecialobject (rb_num_t value_type) () (VALUE val)
{
スイッチ (value_type) {
ケース VM_SPECIAL_OBJECT_VMCORE:
val = rb_mRubyVMFrozenCore;
壊す;
ケース VM_SPECIAL_OBJECT_CBASE:
val = vm_get_cbase(GET_ISEQ(), GET_LFP(), GET_DFP());
壊す;
デフォルト:
rb_bug("putspecialobject insn: 不明な value_type");
}
}
どこ:
VM_SPECIAL_OBJECT_VMCORE = 1 VM_SPECIAL_OBJECT_CBASE = 2
つまり、引数が 1 の場合、rb_mRubyVMFrozenCoreスタックにプッシュされます。これは、いくつかの言語機能をメソッドとして実装する、VM の起動の早い段階で作成されるオブジェクトです。
set_method_alias(klass,:new,:old) エイリアス new old
set_variable_alias(:$new,:$old) エイリアス $new $old
undef_method(クラス,:foo) undef foo
define_method(class,:foo,&block) def foo ... 終了
define_singleton_method(obj,:foo,&block) def obj.foo ... 終わり
set_postexe(&block) END { ... }
引数が 2 の場合、現在のクラス コンテキストのクラス/モジュールがスタックにプッシュされます。defこれは、定数が解決され、有効になるレキシカル スコープaliasです。上記のメソッドに「klass」として渡されるクラスでもあります。
そう
デフ・フー ... 終わり
これにコンパイルされます:
[:putspecialobject, 1], [:putspecialobject, 2], [:putobject, :foo], [:putiseq, [...]], [:send, :"core#define_method", 3, nil, 0, nil]
これは私がリバース エンジニアリングできる限りのことですが、このコードでは簡単ではありません。