私は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]
これは私がリバース エンジニアリングできる限りのことですが、このコードでは簡単ではありません。