@@ -3066,7 +3066,7 @@ namespace Js
30663066 }
30673067
30683068 if (pDestArray && JavascriptArray::IsDirectAccessArray (aItem) && JavascriptArray::IsDirectAccessArray (pDestArray)
3069- && BigIndex (idxDest + JavascriptArray::FromVar (aItem)->length ).IsSmallIndex ()) // Fast path
3069+ && BigIndex (idxDest + JavascriptArray::FromVar (aItem)->length ).IsSmallIndex () && ! JavascriptArray::FromVar (aItem)-> IsFillFromPrototypes () ) // Fast path
30703070 {
30713071 if (JavascriptNativeIntArray::Is (aItem))
30723072 {
@@ -3200,10 +3200,11 @@ namespace Js
32003200 for (uint idxArg = 0 ; idxArg < args.Info .Count ; idxArg++)
32013201 {
32023202 Var aItem = args[idxArg];
3203+ BOOL isConcatSpreadable = false ;
32033204
32043205 if (scriptContext->GetConfig ()->IsES6IsConcatSpreadableEnabled ())
32053206 {
3206- JS_REENTRANT (jsReentLock, BOOL isConcatSpreadable = JavascriptOperators::IsConcatSpreadable (aItem));
3207+ JS_REENTRANT (jsReentLock, isConcatSpreadable = JavascriptOperators::IsConcatSpreadable (aItem));
32073208 if (!JavascriptNativeIntArray::Is (pDestArray))
32083209 {
32093210 ConcatArgs<uint>(pDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest);
@@ -3222,7 +3223,7 @@ namespace Js
32223223 }
32233224 }
32243225
3225- if (JavascriptNativeIntArray::Is (aItem)) // Fast path
3226+ if (JavascriptNativeIntArray::Is (aItem) && ! JavascriptNativeIntArray::FromVar (aItem)-> IsFillFromPrototypes () ) // Fast path
32263227 {
32273228 JavascriptNativeIntArray* pItemArray = JavascriptNativeIntArray::FromVar (aItem);
32283229
@@ -3258,7 +3259,9 @@ namespace Js
32583259 else
32593260 {
32603261 JavascriptArray *pVarDestArray = JavascriptNativeIntArray::ConvertToVarArray (pDestArray);
3261- JS_REENTRANT (jsReentLock, ConcatArgs<uint>(pVarDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest));
3262+ BigIndex length;
3263+ JS_REENTRANT (jsReentLock, length = OP_GetLength (aItem, scriptContext),
3264+ ConcatArgs<uint>(pVarDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest, isConcatSpreadable, length));
32623265 return pVarDestArray;
32633266 }
32643267 }
@@ -3276,10 +3279,11 @@ namespace Js
32763279 for (uint idxArg = 0 ; idxArg < args.Info .Count ; idxArg++)
32773280 {
32783281 Var aItem = args[idxArg];
3282+ BOOL isConcatSpreadable = false ;
32793283
32803284 if (scriptContext->GetConfig ()->IsES6IsConcatSpreadableEnabled ())
32813285 {
3282- JS_REENTRANT (jsReentLock, BOOL isConcatSpreadable = JavascriptOperators::IsConcatSpreadable (aItem));
3286+ JS_REENTRANT (jsReentLock, isConcatSpreadable = JavascriptOperators::IsConcatSpreadable (aItem));
32833287 if (!JavascriptNativeFloatArray::Is (pDestArray))
32843288 {
32853289 ConcatArgs<uint>(pDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest);
@@ -3299,18 +3303,18 @@ namespace Js
32993303 }
33003304 }
33013305
3302- bool converted;
3306+ bool converted = false ;
33033307 if (JavascriptArray::IsAnyArray (aItem) || remoteTypeIds[idxArg] == TypeIds_Array)
33043308 {
3305- if (JavascriptNativeIntArray::Is (aItem)) // Fast path
3309+ if (JavascriptNativeIntArray::Is (aItem) && ! JavascriptArray::FromVar (aItem)-> IsFillFromPrototypes () ) // Fast path
33063310 {
33073311 JavascriptNativeIntArray *pIntArray = JavascriptNativeIntArray::FromVar (aItem);
33083312
33093313 JS_REENTRANT (jsReentLock, converted = CopyNativeIntArrayElementsToFloat (pDestArray, idxDest, pIntArray));
33103314
33113315 idxDest = idxDest + pIntArray->length ;
33123316 }
3313- else if (JavascriptNativeFloatArray::Is (aItem))
3317+ else if (JavascriptNativeFloatArray::Is (aItem) && ! JavascriptArray::FromVar (aItem)-> IsFillFromPrototypes () )
33143318 {
33153319 JavascriptNativeFloatArray* pItemArray = JavascriptNativeFloatArray::FromVar (aItem);
33163320
@@ -3322,7 +3326,9 @@ namespace Js
33223326 {
33233327 JavascriptArray *pVarDestArray = JavascriptNativeFloatArray::ConvertToVarArray (pDestArray);
33243328
3325- JS_REENTRANT (jsReentLock, ConcatArgs<uint>(pVarDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest));
3329+ BigIndex length;
3330+ JS_REENTRANT (jsReentLock, length = OP_GetLength (aItem, scriptContext),
3331+ ConcatArgs<uint>(pVarDestArray, remoteTypeIds, args, scriptContext, idxArg, idxDest, isConcatSpreadable, length));
33263332
33273333 return pVarDestArray;
33283334 }
0 commit comments