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

2018-06-28LearnByteCode, Techc, Japanese, mruby, mruby/c

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と一緒)

irep in bytecode file
irep in bytecode file(mruby/c)

オブジェクト種別が数値である場合、その数値は、オブジェクトデータは文字列で入っている。mrb_objectを生成する際に、atoi()などで変換される。

特に整数のバイトコード命令上の扱いについては、OP_LOADIの説明を参照。

Reference

https://github.com/mrubyhw/mrubyhw/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

mrubyのバイトコードフォーマット解説


https://qiita.com/miura1729/items/256d205bc2a464bfb3c6