独習mrubyバイトコード[OP_LOADT]
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がセットされている。
Recent Comments