2009-05-22 8 views
0

私はRubyVMの実装に取り​​組んでいます。オペコードに関するいくつかのドキュメントはすべて検索しましたが、役に立たないものです。RubyVMのputspecialobjectオペコードはどのように機能しますか?

誰かがputspecialobjectオペコードの仕組みを知っていれば、まさにいくつかの充実したドキュメントへのリンクでもありがたく思うでしょう。 insns.defから

答えて

4

:引数が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の場合、現在のクラス・コンテキストのクラス/モジュールがスタックにプッシュされます。それは定数が解決され、defaliasが有効なレキシカルスコープです。また、上記のメソッドに 'クラス'として渡されるクラスです。

ので

 
def foo 
    ... 
end 

はこれにコンパイルされます。

 
[:putspecialobject, 1], 
[:putspecialobject, 2], 
[:putobject, :foo], 
[:putiseq, [...]], 
[:send, :"core#define_method", 3, nil, 0, nil] 

これは私がこのコードで簡単ではないエンジニアが、逆転できると同じくらいです。

関連する問題