ひとり勉強会

ひとり楽しく勉強会

NODE_ARRAY

配列式のコンパイルです。たとえば [a,b,c] という式は

eval a
eval b
eval c
newarray 3

こういう命令列になります。newarray がスタックから値を拾ってきて配列オブジェクトを作る命令です。コンパイル処理は compile_array という補助関数に丸投げです。

case NODE_ARRAY:{
  compile_array(iseq, ret, node, Qtrue);
  if (poped) {
    ADD_INSN(ret, nd_line(node), pop);
  }
  break;
}
case NODE_ZARRAY:{
  if (!poped) {
    ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(0));
  }
  break;
}

ついでに ZARRAY は [] の時で、newarray 0 にコンパイルされています。
あと、るびま で解説されているように、中身が全部リテラルの配列では、わざわざスタックの積みおろしをしなくても作るべき配列オブジェクトがわかります。この最適化処理も compile_array の中に入っています。