0

私はRubyVMの実装に取り​​組んでおり、オペコードに関するいくつかのドキュメントを探しましたが、役に立ちませんでした。

オペコードがどのように機能するかを具体的に知っている人putspecialobject、または完全なドキュメントへのリンクを知っている人がいれば、とても感謝しています!

4

1 に答える 1

4

insns.def から:

DEFINE_INSN putspecialobject (rb_num_t value_type) () (VALUE val)
{
  スイッチ (value_type) {
    ケース VM_SPECIAL_OBJECT_VMCORE:
      val = rb_mRubyVMFrozenCore;
      壊す;
    ケース VM_SPECIAL_OBJECT_CBASE:
      val = vm_get_cbase(GET_ISEQ(), GET_LFP(), GET_DFP());
      壊す;
    デフォルト:
      rb_bug("putspecialobject insn: 不明な value_type");
  }
}

どこ:

VM_SPECIAL_OBJECT_VMCORE = 1
VM_SPECIAL_OBJECT_CBASE = 2

つまり、引数が 1 の場合、rb_mRubyVMFrozenCoreスタックにプッシュされます。これは、いくつかの言語機能をメソッドとして実装する、VM の起動の早い段階で作成されるオブジェクトです。

set_method_alias(klass,:new,:old) エイリアス new old
set_variable_alias(:$new,:$old) エイリアス $new $old
undef_method(クラス,:foo) undef foo
define_method(class,:foo,&block) def foo ... 終了
define_singleton_method(obj,:foo,&block) def obj.foo ... 終わり
set_postexe(&block) END { ... }

引数が 2 の場合、現在のクラス コンテキストのクラス/モジュールがスタックにプッシュされます。defこれは、定数が解決され、有効になるレキシカル スコープaliasです。上記のメソッドに「klass」として渡されるクラスでもあります。

そう

デフ・フー
  ...
終わり

これにコンパイルされます:

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

これは私がリバース エンジニアリングできる限りのことですが、このコードでは簡単ではありません。

于 2009-08-30T07:23:21.160 に答える