独習mrubyバイトコード[OP_LOADT]

LearnByteCode, Techc, Japanese, mruby, mruby/c

OP_LOADT

Arguments

  • A:レジスタ番号

How it works?

R(A) := true

レジスタ[A]にtrueオブジェクトを代入する

When used?

trueを扱うときに用いられる。

a = true

出力されるバイトコードは、こんな感じ。

00001 NODE_SCOPE:
00001   local variables:
00001     a
00001   NODE_BEGIN:
00001     NODE_ASGN:
00001       lhs:
00001         NODE_LVAR a
00001       rhs:
00001         NODE_TRUE
irep 0x60001a7f0 nregs=3 nlocals=2 pools=0 syms=0 reps=0
file: a.rb
    1 000 OP_LOADT      R2
    1 001 OP_MOVE       R1      R2              ; R1:a
    1 002 OP_STOP

trueオブジェクトをR2に読み出して、R1(変数a)に代入している。

Note

mruby/cの場合

  int ra = GETARG_A(code);

  mrbc_release(®s[ra]);
  regs[ra].tt = MRB_TT_TRUE;

mrubyの場合

      /* A      R(A) := true */
      int a = GETARG_A(i);
      SET_TRUE_VALUE(regs[a]);

SET_TRUE_VALUEの定義は、boxingなしの場合は以下の通り。

#define BOXNIX_SET_VALUE(o, ttt, attr, v) do {\
  (o).tt = ttt;\
  (o).attr = v;\
} while (0)

#define SET_TRUE_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)

value.iにも1がセットされている。

Reference