類別 RubyVM

僅在 MRI 中存在的 RubyVM 模組。在其他 Ruby 實作(例如 JRuby 和 TruffleRuby)中未定義 RubyVM

RubyVM 模組提供一些存取 MRI 內部結構的方法。此模組僅限於非常有限的目的,例如除錯、原型製作和研究。一般使用者不得使用它。此模組無法在 Ruby 實作之間移植。

常數

DEFAULT_PARAMS

::RubyVM::DEFAULT_PARAMS 此常數公開 VM 的預設參數。請注意,變更這些值不會影響 VM 執行。規格不穩定,您不應依賴此值。當然,此常數是 MRI 特有的。

INSTRUCTION_NAMES

::RubyVM::INSTRUCTION_NAMES MRI 中的位元組碼指令名稱清單。此常數是 MRI 特有的。

OPTS

::RubyVM::OPTS VM 建置選項的 Array。此常數是 MRI 特有的。

公開類別方法

keep_script_lines → true 或 false 按一下以切換來源

傳回目前的 keep_script_lines 狀態。現在它只會傳回 truefalse,但它可以在未來傳回其他物件。

請注意,這是 Ruby 內部使用、除錯和研究的 API。請勿將其用於任何其他目的。相容性無法保證。

static VALUE
vm_keep_script_lines(VALUE self)
{
    return RBOOL(ruby_vm_keep_script_lines);
}
keep_script_lines = true / false 按一下以切換來源

它設定 keep_script_lines 旗標。如果設定旗標,所有載入的腳本都會記錄在直譯器程序中。

請注意,這是 Ruby 內部使用、除錯和研究的 API。請勿將其用於任何其他目的。相容性無法保證。

static VALUE
vm_keep_script_lines_set(VALUE self, VALUE flags)
{
    ruby_vm_keep_script_lines = RTEST(flags);
    return flags;
}
stat → Hash 按一下以切換來源
stat(hsh) → hsh
stat(Symbol) → Numeric

傳回包含 VM 內部實作相關計數器的 Hash

此雜湊包含有關方法/常數快取的資訊

{
  :constant_cache_invalidations=>2,
  :constant_cache_misses=>14,
  :global_cvar_state=>27
}

如果啟用 USE_DEBUG_COUNTER,將包含除錯計數器。

雜湊的內容是實作特定的,且可能會在未來變更。

此方法預期僅在 C Ruby 上執行。

static VALUE
vm_stat(int argc, VALUE *argv, VALUE self)
{
    static VALUE sym_constant_cache_invalidations, sym_constant_cache_misses, sym_global_cvar_state, sym_next_shape_id;
    static VALUE sym_shape_cache_size;
    VALUE arg = Qnil;
    VALUE hash = Qnil, key = Qnil;

    if (rb_check_arity(argc, 0, 1) == 1) {
        arg = argv[0];
        if (SYMBOL_P(arg))
            key = arg;
        else if (RB_TYPE_P(arg, T_HASH))
            hash = arg;
        else
            rb_raise(rb_eTypeError, "non-hash or symbol given");
    }
    else {
        hash = rb_hash_new();
    }

#define S(s) sym_##s = ID2SYM(rb_intern_const(#s))
    S(constant_cache_invalidations);
    S(constant_cache_misses);
        S(global_cvar_state);
    S(next_shape_id);
    S(shape_cache_size);
#undef S

#define SET(name, attr) \
    if (key == sym_##name) \
        return SERIALT2NUM(attr); \
    else if (hash != Qnil) \
        rb_hash_aset(hash, sym_##name, SERIALT2NUM(attr));

    SET(constant_cache_invalidations, ruby_vm_constant_cache_invalidations);
    SET(constant_cache_misses, ruby_vm_constant_cache_misses);
    SET(global_cvar_state, ruby_vm_global_cvar_state);
    SET(next_shape_id, (rb_serial_t)GET_SHAPE_TREE()->next_shape_id);
    SET(shape_cache_size, (rb_serial_t)GET_SHAPE_TREE()->cache_size);
#undef SET

#if USE_DEBUG_COUNTER
    ruby_debug_counter_show_at_exit(FALSE);
    for (size_t i = 0; i < RB_DEBUG_COUNTER_MAX; i++) {
        const VALUE name = rb_sym_intern_ascii_cstr(rb_debug_counter_names[i]);
        const VALUE boxed_value = SIZET2NUM(rb_debug_counter[i]);

        if (key == name) {
            return boxed_value;
        }
        else if (hash != Qnil) {
            rb_hash_aset(hash, name, boxed_value);
        }
    }
#endif

    if (!NIL_P(key)) { /* matched key should return above */
        rb_raise(rb_eArgError, "unknown key: %"PRIsVALUE, rb_sym2str(key));
    }

    return hash;
}