0
私はRubyVMの実装に取り組んでいます。オペコードに関するいくつかのドキュメントはすべて検索しましたが、役に立たないものです。RubyVMのputspecialobjectオペコードはどのように機能しますか?
誰かがputspecialobject
オペコードの仕組みを知っていれば、まさにいくつかの充実したドキュメントへのリンクでもありがたく思うでしょう。 insns.defから
私はRubyVMの実装に取り組んでいます。オペコードに関するいくつかのドキュメントはすべて検索しましたが、役に立たないものです。RubyVMのputspecialobjectオペコードはどのように機能しますか?
誰かがputspecialobject
オペコードの仕組みを知っていれば、まさにいくつかの充実したドキュメントへのリンクでもありがたく思うでしょう。 insns.defから
:引数が1の場合、rb_mRubyVMFrozenCore
はVMの初期作成されたオブジェクトでスタックにプッシュされ言い換える
VM_SPECIAL_OBJECT_VMCORE = 1 VM_SPECIAL_OBJECT_CBASE = 2
:
DEFINE_INSN putspecialobject (rb_num_t value_type)() (VALUE val) { switch (value_type) { case VM_SPECIAL_OBJECT_VMCORE: val = rb_mRubyVMFrozenCore; break; case VM_SPECIAL_OBJECT_CBASE: val = vm_get_cbase(GET_ISEQ(), GET_LFP(), GET_DFP()); break; default: rb_bug("putspecialobject insn: unknown value_type"); } }
いくつかの言語機能をメソッドとして実装している起動:
set_method_alias(klass,:new,:old) alias new old set_variable_alias(:$new,:$old) alias $new $old undef_method(klass,:foo) undef foo define_method(klass,:foo,&block) def foo ... end define_singleton_method(obj,:foo,&block) def obj.foo ... end set_postexe(&block) END { ... }
引数2の場合、現在のクラス・コンテキストのクラス/モジュールがスタックにプッシュされます。それは定数が解決され、def
とalias
が有効なレキシカルスコープです。また、上記のメソッドに 'クラス'として渡されるクラスです。
ので
def foo ... end
はこれにコンパイルされます。
[:putspecialobject, 1], [:putspecialobject, 2], [:putobject, :foo], [:putiseq, [...]], [:send, :"core#define_method", 3, nil, 0, nil]
これは私がこのコードで簡単ではないエンジニアが、逆転できると同じくらいです。