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 */
こういうコメントがありました。実際のコードはコメント通りにコード生成しているだけなので、省略と言うことで。