Class: RubyVM
Relationships & Source Files | |
Namespace Children | |
Modules:
| |
Classes:
| |
Inherits: | Object |
Defined in: | vm.c, mini_builtin.c |
Overview
The RubyVM module only exists on MRI. RubyVM
is not defined in other Ruby implementations such as JRuby and TruffleRuby.
The RubyVM module provides some access to MRI internals. This module is for very limited purposes, such as debugging, prototyping, and research. Normal users must not use it. This module is not portable between Ruby implementations.
Constant Summary
-
DEFAULT_PARAMS =
This constant exposes the VM’s default parameters. Note that changing these values does not affect VM execution. Specification is not stable and you should not depend on this value. Of course, this constant is MRI specific.
:
-
INSTRUCTION_NAMES =
A list of bytecode instruction names in MRI. This constant is MRI specific.
:
-
OPTS =
An Array of VM build options. This constant is MRI specific.
:
Class Attribute Summary
-
.keep_script_lines ⇒ Boolean
rw
Return current .keep_script_lines status.
-
.keep_script_lines=(true / false)
rw
It set .keep_script_lines flag.
Class Method Summary
- .reset_debug_counters
- .show_debug_counters
-
.stat ⇒ Hash
Returns a
::Hash
containing implementation-dependent counters inside the VM. - .each_builtin Internal use only
- .mtbl(obj, sym) Internal use only
- .mtbl2(obj, sym) Internal use only
- NSDR Internal use only
- SDR Internal use only
- USAGE_ANALYSIS_INSN_CLEAR Internal use only
- USAGE_ANALYSIS_INSN_RUNNING Internal use only
- USAGE_ANALYSIS_INSN_START Internal use only
- USAGE_ANALYSIS_INSN_STOP Internal use only
- USAGE_ANALYSIS_OPERAND_CLEAR Internal use only
- USAGE_ANALYSIS_OPERAND_RUNNING Internal use only
- USAGE_ANALYSIS_OPERAND_START Internal use only
- USAGE_ANALYSIS_OPERAND_STOP Internal use only
- USAGE_ANALYSIS_REGISTER_CLEAR Internal use only
- USAGE_ANALYSIS_REGISTER_RUNNING Internal use only
- USAGE_ANALYSIS_REGISTER_START Internal use only
- USAGE_ANALYSIS_REGISTER_STOP Internal use only
Class Attribute Details
.keep_script_lines ⇒ Boolean
(rw)
Return current keep_script_lines
status. Now it only returns true
of false
, but it can return other objects in future.
Note that this is an API for ruby internal use, debugging, and research. Do not use this for any other purpose. The compatibility is not guaranteed.
# File 'vm.c', line 3798
static VALUE vm_keep_script_lines(VALUE self) { return RBOOL(ruby_vm_keep_script_lines); }
.keep_script_lines=(true / false) (rw)
It set .keep_script_lines flag. If the flag is set, all loaded scripts are recorded in a interpreter process.
Note that this is an API for ruby internal use, debugging, and research. Do not use this for any other purpose. The compatibility is not guaranteed.
# File 'vm.c', line 3815
static VALUE vm_keep_script_lines_set(VALUE self, VALUE flags) { ruby_vm_keep_script_lines = RTEST(flags); return flags; }
Class Method Details
.each_builtin
# File 'mini_builtin.c', line 82
static VALUE each_builtin(VALUE self) { st_foreach(loaded_builtin_table, each_builtin_i, 0); return Qnil; }
.mtbl(obj, sym)
# File 'vm.c', line 3772
static VALUE vm_mtbl(VALUE self, VALUE obj, VALUE sym) { vm_mtbl_dump(CLASS_OF(obj), RTEST(sym) ? SYM2ID(sym) : 0); return Qnil; }
.mtbl2(obj, sym)
# File 'vm.c', line 3780
static VALUE vm_mtbl2(VALUE self, VALUE obj, VALUE sym) { vm_mtbl_dump(obj, RTEST(sym) ? SYM2ID(sym) : 0); return Qnil; }
NSDR
# File 'vm.c', line 3708
static VALUE nsdr(VALUE self) { VALUE ary = rb_ary_new(); #ifdef HAVE_BACKTRACE #include <execinfo.h> #define MAX_NATIVE_TRACE 1024 static void *trace[MAX_NATIVE_TRACE]; int n = (int)backtrace(trace, MAX_NATIVE_TRACE); char **syms = backtrace_symbols(trace, n); int i; if (syms == 0) { rb_memerror(); } for (i=0; i<n; i++) { rb_ary_push(ary, rb_str_new2(syms[i])); } free(syms); /* OK */ #endif return ary; }
.reset_debug_counters
[ GitHub ]SDR
# File 'vm.c', line 3700
static VALUE sdr(VALUE self) { rb_vm_bugreport(NULL, stderr); return Qnil; }
.show_debug_counters
[ GitHub ]Returns a ::Hash
containing implementation-dependent counters inside the VM.
This hash includes information about method/constant caches:
{
:constant_cache_invalidations=>2,
:constant_cache_misses=>14,
:global_cvar_state=>27
}
If USE_DEBUG_COUNTER
is enabled, debug counters will be included.
The contents of the hash are implementation specific and may be changed in the future.
This method is only expected to work on C Ruby.
# File 'vm.c', line 663
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; }
USAGE_ANALYSIS_INSN_CLEAR
# File 'vm.c', line 4517
static VALUE usage_analysis_insn_clear(VALUE self) { ID usage_hash; ID bigram_hash; CONST_ID(usage_hash, "USAGE_ANALYSIS_INSN"); CONST_ID(bigram_hash, "USAGE_ANALYSIS_INSN_BIGRAM"); usage_analysis_clear(rb_cRubyVM, usage_hash); return usage_analysis_clear(rb_cRubyVM, bigram_hash); }
USAGE_ANALYSIS_INSN_RUNNING
# File 'vm.c', line 4485
static VALUE usage_analysis_insn_running(VALUE self) { return RBOOL(ruby_vm_collect_usage_func_insn != 0); }
USAGE_ANALYSIS_INSN_START
# File 'vm.c', line 4437
static VALUE usage_analysis_insn_start(VALUE self) { ruby_vm_collect_usage_func_insn = vm_analysis_insn; return Qnil; }
USAGE_ANALYSIS_INSN_STOP
# File 'vm.c', line 4461
static VALUE usage_analysis_insn_stop(VALUE self) { ruby_vm_collect_usage_func_insn = 0; return Qnil; }
USAGE_ANALYSIS_OPERAND_CLEAR
# File 'vm.c', line 4530
static VALUE usage_analysis_operand_clear(VALUE self) { ID usage_hash; CONST_ID(usage_hash, "USAGE_ANALYSIS_INSN"); return usage_analysis_clear(self, usage_hash); }
USAGE_ANALYSIS_OPERAND_RUNNING
# File 'vm.c', line 4492
static VALUE usage_analysis_operand_running(VALUE self) { return RBOOL(ruby_vm_collect_usage_func_operand != 0); }
USAGE_ANALYSIS_OPERAND_START
# File 'vm.c', line 4445
static VALUE usage_analysis_operand_start(VALUE self) { ruby_vm_collect_usage_func_operand = vm_analysis_operand; return Qnil; }
USAGE_ANALYSIS_OPERAND_STOP
# File 'vm.c', line 4469
static VALUE usage_analysis_operand_stop(VALUE self) { ruby_vm_collect_usage_func_operand = 0; return Qnil; }
USAGE_ANALYSIS_REGISTER_CLEAR
# File 'vm.c', line 4540
static VALUE usage_analysis_register_clear(VALUE self) { ID usage_hash; CONST_ID(usage_hash, "USAGE_ANALYSIS_REGS"); return usage_analysis_clear(self, usage_hash); }
USAGE_ANALYSIS_REGISTER_RUNNING
# File 'vm.c', line 4499
static VALUE usage_analysis_register_running(VALUE self) { return RBOOL(ruby_vm_collect_usage_func_register != 0); }
USAGE_ANALYSIS_REGISTER_START
# File 'vm.c', line 4453
static VALUE usage_analysis_register_start(VALUE self) { ruby_vm_collect_usage_func_register = vm_analysis_register; return Qnil; }
USAGE_ANALYSIS_REGISTER_STOP
# File 'vm.c', line 4477
static VALUE usage_analysis_register_stop(VALUE self) { ruby_vm_collect_usage_func_register = 0; return Qnil; }