Class: RubyVM
| Relationships & Source Files | |
| Namespace Children | |
| Modules: | |
| Classes: | |
| Inherits: | Object | 
| Defined in: | ast.rb, mini_builtin.c, vm.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 =
    # File 'vm.c', line 3233This 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 =
    # File 'vm.c', line 3225A list of bytecode instruction names in MRI. This constant is MRI specific. : 
- 
    OPTS =
    # File 'vm.c', line 3195An Array of VM build options. This constant is MRI specific. : 
Class Method Summary
- .each_builtin
- .reset_debug_counters
- .show_debug_counters
- 
    
      .stat  ⇒ Hash 
    
    Returns a ::Hashcontaining implementation-dependent counters inside the VM.
- 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 Method Details
.each_builtin
[ GitHub ]# File 'mini_builtin.c', line 63
static VALUE
each_builtin(VALUE self)
{
    st_foreach(loaded_builtin_table, each_builtin_i, 0);
    return Qnil;
}
  NSDR
# File 'vm.c', line 2895
static VALUE
nsdr(VALUE self)
{
    VALUE ary = rb_ary_new();
#if 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 2887
static VALUE
sdr(VALUE self)
{
    rb_vm_bugreport(NULL);
    return Qnil;
}
  .show_debug_counters
[ GitHub ]Returns a ::Hash containing implementation-dependent counters inside the VM.
This hash includes information about method/constant cache serials:
{
  :global_method_state=>251,
  :global_constant_state=>481,
  :class_serial=>9029
}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 449
static VALUE
vm_stat(int argc, VALUE *argv, VALUE self)
{
    static VALUE sym_global_method_state, sym_global_constant_state, sym_class_serial;
    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();
    }
    if (sym_global_method_state == 0) {
#define S(s) sym_##s = ID2SYM(rb_intern_const(#s))
	S(global_method_state);
	S(global_constant_state);
	S(class_serial);
#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(global_method_state, ruby_vm_global_method_state);
    SET(global_constant_state, ruby_vm_global_constant_state);
    SET(class_serial, ruby_vm_class_serial);
#undef SET
    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 3611
static VALUE
usage_analysis_insn_clear(VALUE self)
{
  ID usage_hash;
  ID bigram_hash;
  VALUE uh;
  VALUE bh;
  CONST_ID(usage_hash, "USAGE_ANALYSIS_INSN");
  CONST_ID(bigram_hash, "USAGE_ANALYSIS_INSN_BIGRAM");
  uh = rb_const_get(rb_cRubyVM, usage_hash);
  bh = rb_const_get(rb_cRubyVM, bigram_hash);
  rb_hash_clear(uh);
  rb_hash_clear(bh);
  return Qtrue;
}
  USAGE_ANALYSIS_INSN_RUNNING
# File 'vm.c', line 3587
static VALUE
usage_analysis_insn_running(VALUE self)
{
  if (ruby_vm_collect_usage_func_insn == 0) return Qfalse;
  return Qtrue;
}
  USAGE_ANALYSIS_INSN_START
# File 'vm.c', line 3539
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 3563
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 3630
static VALUE
usage_analysis_operand_clear(VALUE self)
{
  ID usage_hash;
  VALUE uh;
  CONST_ID(usage_hash, "USAGE_ANALYSIS_INSN");
  uh = rb_const_get(rb_cRubyVM, usage_hash);
  rb_hash_clear(uh);
  return Qtrue;
}
  USAGE_ANALYSIS_OPERAND_RUNNING
# File 'vm.c', line 3595
static VALUE
usage_analysis_operand_running(VALUE self)
{
  if (ruby_vm_collect_usage_func_operand == 0) return Qfalse;
  return Qtrue;
}
  USAGE_ANALYSIS_OPERAND_START
# File 'vm.c', line 3547
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 3571
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 3644
static VALUE
usage_analysis_register_clear(VALUE self)
{
  ID usage_hash;
  VALUE uh;
  CONST_ID(usage_hash, "USAGE_ANALYSIS_REGS");
  uh = rb_const_get(rb_cRubyVM, usage_hash);
  rb_hash_clear(uh);
  return Qtrue;
}
  USAGE_ANALYSIS_REGISTER_RUNNING
# File 'vm.c', line 3603
static VALUE
usage_analysis_register_running(VALUE self)
{
  if (ruby_vm_collect_usage_func_register == 0) return Qfalse;
  return Qtrue;
}
  USAGE_ANALYSIS_REGISTER_START
# File 'vm.c', line 3555
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 3579
static VALUE
usage_analysis_register_stop(VALUE self)
{
    ruby_vm_collect_usage_func_register = 0;
    return Qnil;
}