前田です。

At Mon, 10 Jan 2000 04:16:37 +0900,
Akinori MUSHA aka knu <knu / idaemons.org> wrote:
> > 	knu@archon[2]% ruby -e 'a = "a b c d".split; p a; a[*[1,2]] = []; p a'
> > 	["a", "b", "c", "d"]
> > 	["a", 2, "c", "d"]
> > 
> > というのはどういうことでしょうか。(あとで自分でも見てみます)
> 
> も自分で原因を突き止めて修正できるんですが。。
> 
> # とりあえず、引数を渡すスタックが一つずれて a[1] = 2 が実行されて
> # しまうことは分かります。array.c#rb_ary_aset()をトレースすると
> # 引数は二個しか来ていないみたいだし。。

原因はもう少し複雑で、

a[x] = y

という式があった時に最終的にrb_ary_concat(x, y)がよばれてしまうせ
いです。
# x == [1, 2], y == [] だと、[1, 2] + [] => [1, 2]になってしまう。

以下のパッチでよいのではないかと思うのですが、どうでしょう。

--- parse.y.orig        Tue Jan 11 18:20:41 2000
+++ parse.y     Tue Jan 11 18:21:37 2000
@@ -3775,12 +3775,14 @@
     NODE *node1;
     NODE *node2;
 {
-    if (!node1) return NEW_LIST(node2);
+    NODE *list = NEW_LIST(node2);
+
+    if (!node1) return list;
     if (nd_type(node1) == NODE_ARRAY) {
-       return list_append(node1, node2);
+       return list_append(node1, list);
     }
     else {
-       return NEW_ARGSCAT(node1, node2);
+       return NEW_ARGSCAT(node1, list);
     }
 }
 
-- 
前田 修吾