instance method RubyVM::InstructionSequence#to_a

to_a -> Array[permalink][rdoc]

self の情報を 14 要素の配列にして返します。

命令シーケンスを以下の情報で表します。

magic

データフォーマットを示す文字列。常に "YARVInstructionSequence/SimpleDataFormat"。

major_version

命令シーケンスのメジャーバージョン。

minor_version

命令シーケンスのマイナーバージョン。

format_type

データフォーマットを示す数値。常に 1。

misc

以下の要素から構成される Hash オブジェクト。

:arg_size: メソッド、ブロックが取る引数の総数(1 つもない場合は 0)。

:local_size: ローカル変数の総数 + 1。

:stack_max: スタックの深さ。(SystemStackError を検出するために使用)

#label

メソッド名、クラス名、モジュール名などで構成される命令シーケンスのラベル。トップレベルでは "<main>"。文字列から作成していた場合は "<compiled>"。

#path

命令シーケンスの相対パス。文字列から作成していた場合は "<compiled>"。

#absolute_path

命令シーケンスの絶対パス。文字列から作成していた場合は nil。

#first_lineno

命令シーケンスの 1 行目の行番号。

type

命令シーケンスの種別。 :top、:method、:block、:class、:rescue、:ensure、:eval、:main、 :defined_guard のいずれか。

locals

全ての引数名、ローカル変数名からなる Symbol の配列。

args

引数の指定が必須のメソッド、ブロックの引数の個数。あるいは以下のような配列。

[required_argc, [optional_arg_labels, ...], splat_index, post_splat_argc, post_splat_index, block_index, simple]

より詳細な情報については、vm_core.h を参照。

catch_table

例外や制御構造のオペレータ(rescue、next、redo、break など)の一覧。

bytecode

命令シーケンスを構成する命令とオペランドの配列の配列。



require 'pp'

iseq = RubyVM::InstructionSequence.compile('num = 1 + 2')
pp iseq.to_a
# ※ Ruby 2.5.0 での実行結果
# => ["YARVInstructionSequence/SimpleDataFormat",
# 2,
# 0,
# 1,
# {:arg_size=>0, :local_size=>2, :stack_max=>2},
# "<compiled>",
# "<compiled>",
# nil,
# 1,
# :top,
# [:num],
# 0,
# [],
# [1,
#  [:trace, 1],
#  [:putobject_OP_INT2FIX_O_1_C_],
#  [:putobject, 2],
#  [:opt_plus, {:mid=>:+, :flag=>256, :orig_argc=>1, :blockptr=>nil}],
#  [:dup],
#  [:setlocal_OP__WC__0, 2],
#  [:leave]]]