# class RubyVM

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.

### Constants

DEFAULT_PARAMS

  ::RubyVM::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

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

OPTS

  ::RubyVM::OPTS An `Array` of VM build options. This constant is MRI specific.

### Public Class Methods

keep_script_lines → true or false click to toggle source

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.

    static VALUE
    vm_keep_script_lines(VALUE self)
    {
        return RBOOL(ruby_vm_keep_script_lines);
    }

keep_script_lines = true / false click to toggle source

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.

    static VALUE
    vm_keep_script_lines_set(VALUE self, VALUE flags)
    {
        ruby_vm_keep_script_lines = RTEST(flags);
        return flags;
    }

stat → Hash click to toggle source
stat(hsh) → hsh
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.

    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;
    }