문제

저는 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]

이것은 리버스 엔지니어 만큼이나이 코드에서 쉽지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top