Skip to main content

concat_push

Function concat_push 

Source
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 自体が単一要素として 含まれるべき)静かな破壊バグだった。