ひとり勉強会

ひとり楽しく勉強会

NODE_HASH

ハッシュリテラルです。

{"aaa",3,"bbb",4}
{"ccc"=>5,"ddd"=>6}

newarrayのハッシュ版命令「newhash」があるので、実はこれも、左から順に要素をスタックに積んで、newhashするだけなのです。重要なとこだけコンパイラのコードを抜粋すると、こうです。

case NODE_HASH:{
  ... 略 ...
  compile_array(iseq, list, node->nd_head, Qfalse);
  size = OPERAND_AT(POP_ELEMENT(list), 0);
  ADD_SEQ(ret, list);
  ADD_INSN1(ret, nd_line(node), newhash, size);

compile_array して(最後のQfalseはリテラル最適化をしないという意味です)、最後の命令、つまり newarray を取り除いて、かわりに newhash を付け加えています。
奇数個しか要素のないハッシュリテラル {1,2,3} などは、構文解析の段階ではじかれていて、ここでは気にしていません。