独習mrubyバイトコード[OP_LOADL]
OP_LOADL
Arguments
- A:レジスタ番号
- Bx:リテラル番号
How it works?
R(A) := Pool(Bx)
レジスタ[A]に実行中のIREPに格納されているBx番目のリテラルのポインタを代入する
When used?
定数や、文字列を利用するときに、用いられる。
例えば下記のようなコードは、
a = "test"
b = 77777
次のようなバイトコードに変換される。
1 000 OP_STRING R1 L(0) ; "test" ; R1:a
2 001 OP_LOADL R3 L(1) ; 77777
2 002 OP_MOVE R2 R3 ; R2:b
2 003 OP_STOP
L(0)というのが、irep->pools[0]を示している。
Note
poolsのデータ構造
poolsは、mrb_object** 型である。
mrb_irep構造体に含まれている。mrb_irep構造体は下記のように構築されている。(mruby/cの場合)
*/
typedef struct IREP {
uint16_t nlocals; //!< # of local variables
uint16_t nregs; //!< # of register variables
uint16_t rlen; //!< # of child IREP blocks
uint16_t ilen; //!< # of irep
uint16_t plen; //!< # of pool
uint8_t *code; //!< ISEQ (code) BLOCK
mrb_object **pools; //!< array of POOL objects pointer.
uint8_t *ptr_to_sym;
struct IREP **reps; //!< array of child IREP's pointer.
} mrb_irep;
バイトコードにはirep毎にその処理の中で参照されるリテラルが含まれている。バイトコードを読み込む際に、mrb_objectにとしてpoolsにリンクされる。
リテラルオブジェクトの総数は、mrb_irep.plenに書かれている。
バイトコード上は下記の様な構造の配列になっている。(mruby/cもバイトコードはmrubyのmrbcを使用するので、フォーマットはmrubyと一緒)
オブジェクト種別が数値である場合、その数値は、オブジェクトデータは文字列で入っている。mrb_objectを生成する際に、atoi()などで変換される。
特に整数のバイトコード命令上の扱いについては、OP_LOADIの説明を参照。
Recent Comments