類別 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
狀態。現在它只會傳回 true
或 false
,但它可以在未來傳回其他物件。
請注意,這是 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; }