模块 RubyVM::RJIT

常量

CFP
C_ARGS

SystemV x64 调用约定

C_RET
CantCompile
Default
EC

被调用者保存的寄存器 TODO:在此处支持使用 r12/r13

EndBlock
GC_REFS

在垃圾回收期间标记此数组中的对象

KeepCompiling

编译状态

MAX_LOCAL_TYPES

我们跟踪的最大局部变量类型数

MAX_TEMP_TYPES

我们跟踪的最大临时值类型数

MAX_VERSIONS

每个代码块的最大版本数,1 表示始终创建通用版本

MapToLocal
MapToSelf
MapToStack

临时堆栈上的值到 self、局部变量或常量的潜在映射,以便我们可以跟踪其类型

Next0

分支形状

Next1
Qfalse
Qnil
Qtrue

Ruby 常量

Qundef
QwordPtr

64 位内存访问

SP
SelfOpnd

YARV 字节码指令的操作数

StackOpnd
Type

表示 RJIT 中值的类型(局部/堆栈/self)

公共类方法

runtime_stats() 点击切换源代码

返回 RJIT 统计信息的哈希值。 --rjit-stats 可以提供更多信息。

# File ruby_vm/rjit/stats.rb, line 4
def self.runtime_stats
  stats = {}

  # Insn exits
  INSNS.each_value do |insn|
    exits = C.rjit_insn_exits[insn.bin]
    if exits > 0
      stats[:"exit_#{insn.name}"] = exits
    end
  end

  # Runtime stats
  C.rb_rjit_runtime_counters.members.each do |member|
    stats[member] = C.rb_rjit_counters.public_send(member)
  end
  stats[:vm_insns_count] = C.rb_vm_insns_count

  # Other stats are calculated here
  stats[:side_exit_count] = stats.select { |name, _count| name.start_with?('exit_') }.sum(&:last)
  if stats[:vm_insns_count] > 0
    retired_in_rjit = stats[:rjit_insns_count] - stats[:side_exit_count]
    stats[:total_insns_count] = retired_in_rjit + stats[:vm_insns_count]
    stats[:ratio_in_rjit] = 100.0 * retired_in_rjit / stats[:total_insns_count]
  else
    stats.delete(:vm_insns_count)
  end

  stats
end