pub(crate) fn concat_push(
it: &mut Interp,
v: &Value,
items: &mut Vec<Value>,
) -> Result<(), Value>Expand description
Array.prototype.concat は仕様上 Symbol.isConcatSpreadable を尊重すべきだが、
以前は単に ObjKind::Array かどうかだけで展開の有無を決めており、
arr[Symbol.isConcatSpreadable] = false な配列も無条件に展開され、逆に
Symbol.isConcatSpreadable = true を明示した非配列 array-like オブジェクトは
展開されず単一要素として push されてしまっていた。
concat の各オペランド(this 含む)を isConcatSpreadable 判定に従って
items に展開/push する共通ロジック。以前は this(第一引数の呼び出し対象)
にはこのロジックが適用されておらず this_items を直接使っていたため、
[].concat.call(arrayLikeObj, x) のような非配列 this が結果から丸ごと
消えてしまう(本来は spreadable でなければ this 自体が単一要素として
含まれるべき)静かな破壊バグだった。