Rubyvm의 putspecialobject opcode는 어떻게 작동합니까?
-
23-08-2019 - |
문제
저는 Rubyvm의 구현 작업을 수행하고 있으며 Opcodes에 대한 문서를 검색했지만 아무 소용이 없습니다.
누군가가 구체적으로 어떻게 알고 있다면 putspecialobject
Opcode가 작동하거나 심지어 완전한 문서에 대한 링크 일뿐입니다.
해결책
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]
이것은 리버스 엔지니어 만큼이나이 코드에서 쉽지 않습니다.
제휴하지 않습니다 StackOverflow