0
我正在研究RubyVM的實現,並且我已經搜索了一些關於操作碼的文檔,但無濟於事。putpecialobject如何在RubyVM中操作代碼?
如果有人知道putspecialobject
操作碼是如何工作的,甚至只是一些鏈接到一些完整的文檔,我會非常感激!
我正在研究RubyVM的實現,並且我已經搜索了一些關於操作碼的文檔,但無濟於事。putpecialobject如何在RubyVM中操作代碼?
如果有人知道putspecialobject
操作碼是如何工作的,甚至只是一些鏈接到一些完整的文檔,我會非常感激!
從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,當前類上下文的類/模塊被壓入堆棧。這是常量被解析並且def
和alias
生效的詞法範圍。這也是上述方法通過'klass'的類。
所以
def foo ... end
編譯成這樣:
[:putspecialobject, 1], [:putspecialobject, 2], [:putobject, :foo], [:putiseq, [...]], [:send, :"core#define_method", 3, nil, 0, nil]
這是像我一樣可以進行反向工程,這是不容易的與此代碼。