123456789_123456789_123456789_123456789_123456789_

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.

    # File 'vm.c', line 4157
    :
  • INSTRUCTION_NAMES =

    A list of bytecode instruction names in MRI. This constant is MRI specific.

    # File 'vm.c', line 4149
    :
  • OPTS =

    An Array of VM build options. This constant is MRI specific.

    # File 'vm.c', line 4125
    :

Class Attribute Summary

Class Method Summary

Class Attribute Details

.keep_script_linesBoolean (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.

[ GitHub ]

  
# File 'vm.c', line 3859

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.

[ GitHub ]

  
# File 'vm.c', line 3876

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

This method is for internal use only.
[ GitHub ]

  
# File 'mini_builtin.c', line 81

static VALUE
each_builtin(VALUE self)
{
    st_foreach(loaded_builtin_table, each_builtin_i, 0);
    return Qnil;
}

.mtbl(obj, sym)

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 3833

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)

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 3841

static VALUE
vm_mtbl2(VALUE self, VALUE obj, VALUE sym)
{
    vm_mtbl_dump(obj, RTEST(sym) ? SYM2ID(sym) : 0);
    return Qnil;
}

NSDR

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 3769

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

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 3761

static VALUE
sdr(VALUE self)
{
    rb_vm_bugreport(NULL, stderr);
    return Qnil;
}

.show_debug_counters

[ GitHub ]

.statHash .stat(hsh) ⇒ Hash .stat(Symbol) ⇒ Numeric

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.

[ GitHub ]

  
# File 'vm.c', line 670

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

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4708

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

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4676

static VALUE
usage_analysis_insn_running(VALUE self)
{
    return RBOOL(ruby_vm_collect_usage_func_insn != 0);
}

USAGE_ANALYSIS_INSN_START

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4628

static VALUE
usage_analysis_insn_start(VALUE self)
{
    ruby_vm_collect_usage_func_insn = vm_analysis_insn;
    return Qnil;
}

USAGE_ANALYSIS_INSN_STOP

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4652

static VALUE
usage_analysis_insn_stop(VALUE self)
{
    ruby_vm_collect_usage_func_insn = 0;
    return Qnil;
}

USAGE_ANALYSIS_OPERAND_CLEAR

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4721

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

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4683

static VALUE
usage_analysis_operand_running(VALUE self)
{
    return RBOOL(ruby_vm_collect_usage_func_operand != 0);
}

USAGE_ANALYSIS_OPERAND_START

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4636

static VALUE
usage_analysis_operand_start(VALUE self)
{
    ruby_vm_collect_usage_func_operand = vm_analysis_operand;
    return Qnil;
}

USAGE_ANALYSIS_OPERAND_STOP

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4660

static VALUE
usage_analysis_operand_stop(VALUE self)
{
    ruby_vm_collect_usage_func_operand = 0;
    return Qnil;
}

USAGE_ANALYSIS_REGISTER_CLEAR

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4731

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

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4690

static VALUE
usage_analysis_register_running(VALUE self)
{
    return RBOOL(ruby_vm_collect_usage_func_register != 0);
}

USAGE_ANALYSIS_REGISTER_START

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4644

static VALUE
usage_analysis_register_start(VALUE self)
{
    ruby_vm_collect_usage_func_register = vm_analysis_register;
    return Qnil;
}

USAGE_ANALYSIS_REGISTER_STOP

This method is for internal use only.
[ GitHub ]

  
# File 'vm.c', line 4668

static VALUE
usage_analysis_register_stop(VALUE self)
{
    ruby_vm_collect_usage_func_register = 0;
    return Qnil;
}