ひとり勉強会

ひとり楽しく勉強会

NODE_OP_ASGN1

a[x] op= y

のパターンは、NODE_OP_ASGN1 という名前になっています。どういうバイトコードコンパイルされるのか、コメントがついていました。

/*
 * eval a    # a
 * eval x    # a x
 * dupn 2    # a x a x
 * send :[]  # a x a[x]
 * eval y    # a x a[x] y
 * send op   # a x a[x]+y
 * send []=  # ret
 */

わかりやすいですね。a や x の評価は1回だけで、あとは dupn 2 命令で複製して使っているのがわかります。先ほど説明したように、op が || や && の場合は生成するコードも変わってきます。こちらは

if (id == 0 || id == 1) {
  /* 0: or, 1: and
    a[x] ||= y

    unless/if a[x]
      a[x]= y
    else
      nil
    end
   */

こういうコメントがありました。実際のコードはコメント通りにコード生成しているだけなので、省略と言うことで。