mruby2.0.0 Opcode一覧

TechJapanese, mruby

mruby2.0.0以降のOpcodeについての説明はあまりネット上では見かけ方ことがなかったので、同人誌でまとめた内容の一部を抜粋して公開します。
もっと詳しい説明は同人誌の方をご参照ください。

https://silentworlds.booth.pm/items/1326363

以下、Opcodeを似たものをグループにしつつ説明しています。

記載方法の説明

「定義」の読み方

  • R(n)
    n番目のレジスタを意味します。レジスタ(n)といった形で呼称します。
    dumpしたirepの命令上では、”Rn”として表現されています。ソースコード上はregs[n]という配列アクセスとして実装されています。
  • Syms(n)
    mrb_irep構造体に格納されている、n番目のシンボル(irep->syms[n])を意味します。シンボル(n)といった形で呼称します。
    dumpしたirepの命令上では、”:文字列”として表現されています。
  • Pool(n)
    mrb_irep構造体に格納されている、n番目のリテラル(irep->pool[n])を意味します。リテラル(n)といった形で呼称します。
    dumpしたirepの命令上では、”L(n)”として表現されています。
  • SEQ[n]
    実行中のmrb_irep構造体のn番目の子mrb_irep構造体(irep->reps[n])を指します。irep(n)といった形で呼称します。
    dumpしたirepの命令上では、”I(構造体のアドレス)”として表現されています。
    : targetclass
    ターゲットクラスと呼称します。実体は実行中のコンテキストのcallinfoのtarget_classポインタが指すクラスオブジェクトです。
    mrbから次のようにポインタをたどって参照できます。 “target = mrb->c->ci->target_class”
  • pc
    プログラムカウンタ、命令列上で実行中の位置を示すポインタです。

「Opr(Operand)」の読み方

「Opr(Operand)」の項目は、以下のような形式で記載しています。

  • Opr: Operandフォーマット:動作に対応する変数名(データ長)


  • Opr: BB: a(B), b(B)

  • 意味
    aとbという名前を持つ2つのOperandをとり、それぞれのサイズは1バイトであることを示しています。
    ただしOperand拡張した場合はそれぞれ+1バイト拡張される場合があります。

Operandフォーマット

  • B:8bit
  • S:16bit
  • W:24bit
  • Z:Operandなし

OP_NOP

概要

  • 定義: no operation
  • Opr: なし
  • 動作: 何もしないで、次の命令に移る。

OP_MOVE

概要

  • 定義: R(a) = R(b)
  • Opr: BB: a(B), b(B)
  • 動作: レジスタ(a)にレジスタ(b)をセットする。

OP_LOADL

概要

  • 定義: R(a) = Pool(b)
  • Opr: BB: a(B), b(B)
  • 動作: レジスタ(a)にレジスタ(b)をセットする。

OP_LOADI, OP_LOADINEG

リテラルプールを参照し、レジスタに整数をセットする。

概要

  • OP_LOADI
    • 定義: R(a) = mrb_int(b)
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(a)にFixnumとしてbの値を代入する。(bは正の整数)
  • OP_LOADINEG
    • 定義: R(a) = mrb_int(-b)
    • Opr;BB: a(B),b(B)
    • 動作: レジスタ(a)にFixnumとして-bの値を代入する。(bは正の整数)

OP_LOADI__1〜OP_LOADI__7

Operandを参照せずに整数値をレジスタにセットする命令である。

概要

  • 定義:
    • OP_LOAD__1: R(a) = mrb_int(-1)
    • OP_LOAD_0: R(a) = mrb_int(0)
    • OP_LOAD_1: R(a) = mrb_int(1)
    • OP_LOAD_2: R(a) = mrb_int(2)
    • OP_LOAD_3: R(a) = mrb_int(3)
    • OP_LOAD_4: R(a) = mrb_int(4)
    • OP_LOAD_5: R(a) = mrb_int(5)
    • OP_LOAD_6: R(a) = mrb_int(6)
    • OP_LOAD_7: R(a) = mrb_int(7)
  • Opr: B: a(B)
  • 動作: レジスタ(a)に命令ごとに固有のFixnumオブジェクトを代入する。

OP_LOADSYM

概要

  • 定義: R(a) = Syms(b)
  • Opr: BB: a(B), b(B)
  • 動作: レジスタ(a)にシンボル(b)を代入する。

OP_LOADNIL

概要

  • 定義: R(a) = nil
  • Opr: B: a(B)
  • 動作: レジスタ(a)にnilオブジェクトを代入する

OP_LOADSELF

概要

  • 定義: R(a) = self
  • Opr: B: a(B)
  • 動作: レジスタ(a)にselfを代入する

OP_LOADT, OP_LOADF

true、falseオブジェクトをレジスタにセットするための命令である。

概要

  • OP_LOADT
    • 定義: R(a) = true
    • Opr: B: a(B)
    • 動作: レジスタ(a)にtrueオブジェクトをセットする。
  • OP_LOADF
    • 定義: R(a) = false
    • Opr: B: a(B)
    • 動作: レジスタ(a)にfalseオブジェクトをセットする。

OP_GETGV, OP_SETGV

グローバルオブジェクトを扱うための命令である。

概要

  • OP_GETGV
    • 定義: OP_GETGV: R(a) = getglobal(Syms(b))
    • Opr: BB: a(B), b(B)
    • 動作: シンボル(b)に対応する名前を持つグローバルオブジェクトを、レジスタ(a)に格納する。
  • OP_SETGV
    • 定義: OP_SETGV: R(a) = setglobal(Syms(b),R(a))
    • Opr: BB: a(B), b(B)
    • 動作: シンボル(b)に対応する名前を持つグローバルオブジェクトに、レジスタ(a)を格納する。

OP_GETSV, OP_SETSV

特殊変数を操作するための命令である。

概要

  • OP_GETSV
    • 定義: R(a) = Special[Syms(b)]
    • Opr: BB: a(B),b(B)
    • 動作: シンボル(b)に対応する特殊変数を、レジスタ(a)にセットする。
  • OP_SETSV
    • 定義: Special[Syms(b)] = R(a)
    • Opr: BB: a(B),b(B)
    • 動作: シンボル(b)に対応する特殊変数に、レジスタ(a)をセットする。

OP_GETIV, OP_SETIV

インスタンス変数を扱うための命令である。

概要

  • OP_GETIV
    • 定義: OP_GETIV: R(a) = ivget(Syms(b))
    • Opr: BB: a(B),b(B)
    • 動作: シンボル(a)に対応するselfのインスタンス変数を、レジスタ(A)にセットする
  • OP_SETIV
    • 定義: OP_SETIV: ivset(Syms(b),R(a))
    • Opr: BB: a(B),b(B)
    • 動作: シンボル(a)に対応するselfのインスタンス変数に、レジスタ(A)をセットする

OP_GETCV, OP_SETCV

クラス変数を操作するための命令である。

概要

  • OP_GETCV
    • 定義: OP_GETCV: R(a) = cvget(Syms(b))
    • Opr: BB: a(B),b(B)
    • 動作: シンボル(a)に対応する、実行中のprocのターゲットクラスのクラス変数を、レジスタ(A)にセットする
  • OP_SETCV
    • 定義: cvset(Syms(b),R(a))
    • Opr: BB: a(B),b(B)
    • 動作: シンボル(a)に対応する、実行中のprocのターゲットクラスのクラス変数に、レジスタ(A)をセットする

OP_GETCONST, OP_SETCONST

定数を操作するための命令である。

概要

  • OP_GETCONST
    • 定義: R(a) = constget(Syms(b))
    • Opr: BB: a(B),b(B)
    • 動作: シンボル(a)に対応する定数を、レジスタ(A)にセットする。
  • OP_SETCONST
    • 定義: R(a) = R(a)::Syms(b)
    • Opr: BB: a(B),b(B)
    • 動作: シンボル(a)に対応する定数に、レジスタ(A)をセットする

操作対象クラスは実行中のprocのターゲットクラスである。

OP_GETMCNST, OP_SETMCNST

モジュール定数を操作するための命令である。

概要

  • OP_GETCONST
    • 定義: R(a) = R(a)::Syms(b)
    • Opr: BB: a(B), b(B)
    • 動作: モジュール(R(a))のシンボル(b)に対応するモジュール定数を、レジスタ(a)にセットする
  • OP_SETMCNST
    • 定義: R(a+1)::Syms(b) = R(a)
    • Opr: BB: a(B), b(B)
    • 動作: モジュール(R(a+1))のシンボル(b)に対応するモジュール定数に、レジスタ(a)をセットする

OP_GETUPVAR, OP_SETUPVAR

クロージャのようなブロック呼び出し元の変数を操作するための命令である。

概要

  • OP_GETUPVAR
    • 定義: R(a) = uvget(b,c)
    • Opr: BBB: a(B), b(B), c(B)
    • 動作: mrb->c->ci->proc->upperをc回さかのぼったproc->e.env->stack[b]の値を、レジスタ(a)にセットする。
  • OP_SETUPVAR
    • 定義: uvset(b,c,R(a))
    • Opr: BBB: a(B), b(B), c(B)
    • 動作: mrb->c->ci->proc->upperをc回さかのぼったproc->e.env->stack[b]に対して、レジスタ(a)をセットする。

OP_JMP, OP_JMPIF, OP_JMPNOT, OP_JMPNIL

命令列の所定の位置にジャンプするための命令群。

概要

  • OP_JMP
    • 定義: pc=a
    • Opr: S: a(S)
    • 動作: pcにaをセットする。aはiseq上の位置を示す。
  • OP_JMPIF
    • 定義: if R(a) pc=b
    • Opr: BS: a(B), b(S)
    • 動作: もしR(a)がtrueならば、pcにbをセットする。
  • OP_JMPNOT
    • 動作: if !R(a) pc=b
    • Opr: BS: a(B), b(S)
    • 動作: もしR(a)がfalseならば、pcにbをセットする。
  • OP_JMPNIL
    • 動作: if R(b)==nil pc=a
    • Opr: BS: a(B), b(S)
    • 動作: もしR(b)がnilならば、pcにaをセットする。

OP_ONERR, OP_EXCEPT, OP_RESCUE, OP_POPERR, OP_RAISE, OP_EPUSH, OP_EPOP

例外処理に関する命令群である。

概要

  • OP_ONERR
    • 定義: rescue_push(a)
    • Opr: S: a(S)
    • 動作: rescue節の先頭命令位置を例外処理スタックにpushする。
  • OP_EXCEPT
    • 定義: R(a) = exc
    • Opr: B: a(B)
    • 動作: レジスタ(a)に、mrb->excをセットする。
  • OP_RESCUE
    • 定義: R(b) = R(a).isa?(R(b))
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(b)のClassオブジェクトまたはModuleオブジェクトがレジスタ(a)オブジェクトのクラスに属するかどうか判定し、結果をR(b)に格納する。
  • OP_POPERR
    • 定義: a.times{rescue_pop()
    • Opr: B: a(B)
    • 動作: a回rescue節をスタックからpopする。
  • OP_RAISE
    • 定義: raise(R(a))
    • Opr: B: a(B)
    • 動作: mrb->excにレジスタ(a)をセットして例外を発生させる。
  • OP_EPUSH
    • 定義: ensure_push(SEQ[a])
    • Opr: B: a(B)
    • 動作: irep(a)に対応するensure節を例外処理スタックにpushする。
  • OP_EPOP
    • 定義: a.times{ensure_pop().call
    • Opr: B: a(B)
    • 動作: a回ensure節をスタックからpopしつつ実行する。

OP_SEND, OP_SENDB, OP_SENDV, OP_SENDVB

メソッド呼び出しに関する命令群である。

概要

  • OP_SEND
    • 定義: R(a) = call(R(a),Syms(b),R(a+1),…,R(a+c))
    • Opr: BB: a(B), b(B), c(B)
    • 動作: R(a)をレシーバとした、シンボル(b)の名前を持つメソッドを実行する。メソッドの引数はR(a+1)〜R(a+c)に格納される。メソッドの戻り値はR(a)に格納される。
  • OP_SENDB
    • 定義: R(a) = call(R(a),Syms(b),R(a+1),…,R(a+c),&R(a+c+1))
    • Opr: BB: a(B), b(B), c(B)
    • 動作: 基本的にはOP_SENDと同じ。operandとして、R(a+c+1)にブロックが格納される点が異なる。
  • OP_SENDV
    • 定義: R(a) = call(R(a),Syms(b),*R(a+1))
    • Opr: BB: a(B), b(B)
    • 動作: R(a)をレシーバとした、シンボル(b)の名前を持つメソッドを実行する。メソッドの引数はR(a+1)のオブジェクトを展開した結果が適用される。メソッドの戻り値はR(a)に格納される。
  • OP_SENDVB
    • 定義: R(a) = call(R(a),Syms(b),*R(a+1),&R(a+2))
    • Opr: BB: a(B), b(B)
    • 動作: 基本的にはOP_SENDVと同じ。operandとして、R(a+2)にブロックが格納される点が異なる。

OP_CALL, OP_BLKPUSH

ブロックの実行に関する命令である。

概要

  • OP_CALL
    • 定義: R(0) = self.call(frame.argc,frame.argv)
    • Opr: なし
    • 動作: self(Procオブジェクト)をレシーバとして、self.callを実行し、結果をレジスタ(0)にセットする。
  • OP_BLKPUSH
    • 定義: R(a) = block (16=m5:r1:m5:d1:lv4) fn_blkpush
    • Opr: BS: a(B), b(S)
    • 動作: ブロックが格納されたレジスタの位置を計算し、レジスタ(a)にセットする。

OP_SUPER, OP_ARGARY

superの処理に関する命令群である。

概要

  • OP_SUPER
    • 定義: R(a) = super(R(a+1),… ,R(a+b+1))
    • Opr: BB: a(B), b(B)
    • 動作: R(a+1)〜R(a+b+1)を引数として、superメソッドを実行する。
  • OP_ARGARY
    • 定義: R(a) = argument array (16=m5:r1:m5:d1:lv4) fn_argary
    • Opr: BS: a(B), b(S)
    • 動作: bの値に応じて、OP_SUPERで引き渡される引数の配列を作成し、R(a)に格納する。

OP_ENTER

概要

  • 定義: arg setup according to flags (23=m5:o5:r1:m5:k5:d1:b1)
  • Opr: W:図を参照
  • 動作: 命令引数の値に応じて、メソッド実行時にメソッド引数の前処理を行う

OP_KEY_P, OP_KEY_END, OP_KARG

キーワード引数の受け取りに関する命令である。

概要

  • OP_KEY_P
    • 定義: R(a) = kdict.key?(Syms(b))
    • Opr: BB: a(B), b(B)
    • 動作: キーワード引数ハッシュテーブルにシンボル(b)をキーとする要素があれば、trueを、なければfalseをレジスタ(a)にセットする。
  • OP_KEYEND
    • 定義: raise unless kdict.empty?
    • Opr: なし
    • 動作: キーワード引数ハッシュテーブルが空でなければ、E_ARGUMENT_ERROR例外を発生させる。
  • OP_KARG
    • 定義: R(a) = kdict[Syms(b)]; kdict.delete(Syms(b))
    • Opr: BB: a(B), b(B)
    • 動作: シンボル(b)をキーとする値をキーワード引数のハッシュテーブルから取得し、レジスタ(a)にセットする。そして、シンボル(b)をキー要素をハッシュテーブルから削除する。

キーワード引数はキーワード引数ハッシュテーブル(kdict)としてメソッドに渡される。

OP_RETURN, OP_RETURN_BLK, OP_BREAK, OP_BLKPUSH

メソッドやブロックから離脱する処理を行う命令である。

概要

  • OP_RETURN
    • 定義: return R(a) (normal)
    • Opr: B: a(B)
    • 動作: レジスタ(a)値を戻り値としてreturnする。
  • OP_RETURN_BLK
    • 定義: return R(a) (in-block return)
    • Opr: B: a(B)
    • 動作: ブロックの中から、レジスタ(a)値を戻り値としてreturnする。
  • OP_BREAK
    • 定義: break R(a)
    • Opr: B: a(B)
    • 動作: レジスタ(a)値を戻り値としてbreakする。

OP_ADD, OP_ADDI, OP_SUB, OP_SUBI, OP_MUL, OP_DIV

四則演算を行う命令である。

概要

  • OP_ADD
    • 定義: R(a) = R(a)+R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)+レジスタ(a+1)の演算結果を、レジスタ(a)に格納する。
  • OP_ADDI
    • 定義: R(a) = R(a)+mrb_int(b)
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(a)+b(整数)の演算結果を、レジスタ(a)に格納する。
  • OP_SUB
    • 定義: R(a) = R(a)-R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)-レジスタ(a+1)の演算結果を、レジスタ(a)に格納する。
  • OP_SUBI
    • 定義: R(a) = R(a)-mrb_int(b)
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(a)-b(整数)の演算結果を、レジスタ(a)に格納する。
  • OP_MUL
    • 定義: R(a) = R(a)*R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)*レジスタ(a+1)の演算結果を、レジスタ(a)に格納する。
  • OP_DIV
    • 定義: R(a) = R(a)/R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)/レジスタ(a+1)の演算結果を、レジスタ(a)に格納する。

OP_EQ,OP_LT,OP_LE,OP_GT,OP_GE

比較演算を行う命令である。

概要

  • OP_EQ
    • 定義: R(a) = R(a)==R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)==レジスタ(a+1)の演算結果の真偽値をレジスタ(a)にセットする。
  • OP_LT
    • 定義: R(a) = R(a)< R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)<レジスタ(a+1)の演算結果の真偽値をレジスタ(a)にセットする。
  • OP_LE
    • 定義: R(a) = R(a)<=R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)<=レジスタ(a+1)の演算結果の真偽値をレジスタ(a)にセットする。
  • OP_GT
    • 定義: R(a) = R(a)> R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)>レジスタ(a+1)の演算結果の真偽値をレジスタ(a)にセットする。
  • OP_GE
    • 定義: R(a) = R(a)>=R(a+1)
    • Opr: B: a(B)
    • 動作: レジスタ(a)>=レジスタ(a+1)の演算結果の真偽値をレジスタ(a)にセットする。

OP_ARRAY, OP_ARRAY2, OP_ARYCAT, OP_ARYDUP, OP_ARYPUSH

配列を操作するための命令である。

概要

  • OP_ARRAY
    • 定義: R(a) = ary_new(R(a),R(a+1)..R(a+b))
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(a)〜レジスタ(a+b)を要素とする配列を生成し、レジスタ(a)に格納する。
  • OP_ARRAY2 matz_advice
    • 定義: R(a) = ary_new(R(b),R(b+1)..R(b+c))
    • Opr: BBB: a(B), b(B), c(B)
    • 動作: レジスタ(b)〜レジスタ(b+c)を要素とする配列を生成し、レジスタ(a)に格納する。
  • OP_ARYCAT
    • 定義: ary_cat(R(a),R(a+1))
    • Opr: B: a(B)
    • 動作: レジスタ(a)に格納された配列に、レジスタ(a+1)に格納された配列を結合する。
  • OP_ARYDUP
    • 定義: R(a) = ary_dup(R(a))
    • Opr: B
    • 動作: レジスタ(a)に格納された配列を複製し、レジスタ(a)に格納する。
  • OP_ARYPUSH
    • 定義: ary_push(R(a),R(a+1))
    • Opr: B: a(B)
    • 動作: レジスタ(a)に格納された配列に、レジスタ(a+1)に格納されたオブジェクトを追加する。

OP_AREF, OP_APOST, OP_ASET

配列操作のための命令である。

概要

  • OP_AREF
    • 定義: R(a) = R(b)[c]
    • Opr: BBB: a(B), b(B), c(B)
    • 動作: レジスタ(b)に格納されている配列の c 番目の要素をレジスタ(a)にセットする。
  • OP_APOST
    • 定義: *R(a),R(a+1)..R(a+c) = R(a)[b..]
    • Opr: BBB: a(B), b(B), c(B)
    • 動作: レジスタ(a)に格納されている配列の b 番目以降の要素を、レジスタ(a)〜レジスタ(a+c)に格納する。レジスタ(a)は配列として可変長の要素を受け取る。
  • OP_ASETop_aset_usage
    • 定義: R(a)[c] = R(b)
    • Opr: BBB: a(B), b(B), c(B)
    • 動作: レジスタ(a)に格納されている配列のc番目の要素に、レジスタ(b)をセットする。

OP_STRING, OP_STRCAT, OP_INTERN

文字列の操作を行う命令である。

概要

  • OP_STRING
    • 定義: R(a) = str_dup(Lit(b))
    • Opr: BB: a(B), b(B)
    • 動作: リテラル(b)の文字列を複製して、レジスタ(a)にセットする。
  • OP_STRCAT
    • 定義: str_cat(R(a),R(a+1))
    • Opr: B: a(B)
    • 動作: レジスタ(a)に格納されている文字列とレジスタ(a+1)に格納されている文字列を連結する。
  • OP_INTERN
    • 定義: R(a) = intern(R(a))
    • Opr: B: a(B)
    • 動作: レジスタ(a)に格納された文字列をシンボルに変換して、レジスタ(a)に格納する。

OP_HASH, OP_HASHCAT, OP_HASHADD

ハッシュの生成、操作を行う命令である。

概要

  • OP_HASH
    • 定義: R(a) = hash_new(R(a),R(a+1)..R(a+b*2-1)) hashA
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(a)〜レジスタ(a+b*2-1)の値を元にハッシュを生成し、レジスタ(a)に格納する。
  • OP_HASHCATmatz_advice2
    • 定義: R(a) = hash_cat(R(a),R(a+1))
    • Opr: B: a(B)
    • 動作: レジスタ(a)に格納されているハッシュとレジスタ(a+1)に格納されているハッシュを結合して、レジスタ(a)に格納する。
  • OP_HASHADD
    • 定義: R(a) = hash_push(R(a),R(a+1)..R(a+b*2))
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(a+1)〜レジスタ(a+b*2)の値を元にハッシュを生成し、レジスタ(a)のハッシュと結合する。

OP_LAMBDA, OP_BLOCK

lambda、ブロックを生成する命令である。

概要

  • OP_LAMBDA
    • 定義: R(a) = lambda(SEQ[b],L_LAMBDA)
    • Opr: BB: a(B), b(B)
    • 動作: irep(b)からProcオブジェクトを生成し、レジスタ(a)にセットする。
  • OP_BLOCK
    • 定義: R(a) = lambda(SEQ[b],L_BLOCK)
    • Opr: BB: a(B), b(B)
    • 動作: irep(b)からProcオブジェクトを生成し、レジスタ(a)にセットする。

OP_METHOD, OP_DEF

メソッドを生成する命令である。

概要

  • OP_METHOD
    • 定義: R(a) = lambda(SEQ[b],L_METHOD)
    • Opr: BB: a(B), b(B)
    • 動作: irep(b)からProcオブジェクトを生成し、レジスタ(a)にセットする。
  • OP_DEF
    • 定義: R(a).newmethod(Syms(b),R(a+1))
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(a+1)に格納されたProcオブジェクトを元に、シンボル(b)の名前を持つメソッドを生成する。レジスタ(a)がメソッドを設定する対象クラスである。

OP_RANGE_INC, OP_RANGE_EXC

概要

  • OP_RANGE_INC range_inc_exc
    • 定義: R(a) = range_new(R(a),R(a+1),FALSE)
    • Opr: B: a(B)
    • 動作: レジスタ(a)〜レジスタ(a+1)の範囲のRangeオブジェクトを生成して、レジスタ(a)に格納する。
  • OP_RANGE_EXC
    • 定義: R(a) = range_new(R(a),R(a+1),TRUE)
    • Opr: B: a(B)
    • 動作: レジスタ(a)〜レジスタ(a+1)-1の範囲のRangeオブジェクトを生成して、レジスタ(a)に格納する。

OP_CLASS, OP_MODULE, OP_EXEC

クラス、モジュールの定義に関する命令である。

概要

  • OP_CLASS
    • 定義: R(a) =class(R(a),Syms(b),R(a+1))
    • Opr: BB: a(B), b(B)
    • 動作: シンボル(b)という名前を持つ、レジスタ(a)に格納されているクラスもしくはモジュールに属するクラスオブジェクトを生成し、レジスタ(a)に格納する。R(a+1)には親クラスが設定されているものとする。
  • OP_MODULE
    • 定義: R(a) =module(R(a),Syms(b))
    • Opr: BB: a(B), b(B)
    • 動作: シンボル(b)という名前を持つ、レジスタ(a)に格納されているクラスもしくはモジュールに属するモジュールオブジェクトを生成し、レジスタ(a)に格納する。
  • OP_EXEC
    • 定義: R(a) = blockexec(R(a),SEQ[b])
    • Opr: BB: a(B), b(B)
    • 動作: レジスタ(a)にセットされたクラス、モジュールに対して、irep(b)で指定したブロックを実行し、戻り値をレジスタ(a)に格納する。

OP_ALIAS

概要

  • 定義: alias_method(target_class,Syms(a),Syms(b))
  • Opr: BB: a(B),b(B)
  • 動作: ターゲットクラスに属する、シンボル(b)という名前を持つメソッドに、シンボル(a)という別名をつける。

OP_UNDEF

概要

  • 定義: undef_method(target_class,Syms(a))
  • Opr: B: a(B)
  • 動作: 現在のコンテキストの対象クラスのシンボル(a)の名称を持つメソッドを削除する。

OP_SCLASS

概要

  • 定義: R(a) = R(a).singleton_class
  • Opr: B: a(B)
  • 動作: レジスタ(a)のオブジェクトのシングルトンクラスをレジスタ(a)にセットする。

OP_TCLASS, OP_OCLASS

レジスタに所定のクラスをセットする命令である。

概要

  • OP_TCLASS
    • 定義: R(a) = target_class
    • Opr: B: a(B)
    • 動作: レジスタ(a)にmrb->c->ci->target_classをセットする。
  • OP_OCLASS
    • 定義: R(a) = ::Object
    • Opr: B: a(B)
    • 動作: レジスタ(a)にObjectクラスをセットする。

OP_DEBUG

概要

  • 定義/動作:
    • MRB_ENABLE_DEBUG_HOOKが有効:mrb->debug_op_hook()を実行
    • MRB_ENABLE_DEBUG_HOOKが無効:print a,b,c(ただしSTDIOが無効の場合はabortする)
  • Opr: BBB: a(B),b(B),c(B)

OP_ERR

概要

  • 定義: raise(LocalJumpError,Lit(a))
  • Opr: B: a(B)
  • 動作: リテラル(a)をメッセージとして、例外を発生させる。

OP_EXT1, OP_EXT2, OP_EXT3

後続の命令のOperandを拡張する命令である。

概要

  • 定義/動作
    • OP_EXT1:後続の命令のOperandの1番目の値を+8bit拡張する
    • OP_EXT2:後続の命令のOperandの2番目の値を+8bit拡張する
    • OP_EXT3:後続の命令のOperandの1番目と2番目の値をそれぞれ+8bit拡張する
  • Opr: なし

OP_STOP

概要

  • 定義: stop VM
  • Opr: なし
  • 動作: この命令が現れるとVMは、処理を終了させる。