2009-05-22 47 views

回答

4

從insns.def:

 
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"); 
    } 
} 

其中:

 
VM_SPECIAL_OBJECT_VMCORE = 1 
VM_SPECIAL_OBJECT_CBASE = 2 

換句話說,如果參數是1,rb_mRubyVMFrozenCore被堆疊,這是在VM早期創建的對象上推啓動,實現一些語言功能作爲方法:

 
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生效的詞法範圍。這也是上述方法通過'klass'的類。

所以

 
def foo 
    ... 
end 

編譯成這樣:

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

這是像我一樣可以進行反向工程,這是不容易的與此代碼。