Просмотр исходного кода

Fix 5678 update array spread implementation

rhuanjl 6 лет назад
Родитель
Сommit
2f43d08255
2 измененных файлов с 14 добавлено и 3 удалено
  1. 6 3
      lib/Runtime/Library/JavascriptArray.cpp
  2. 8 0
      test/es6/spread.js

+ 6 - 3
lib/Runtime/Library/JavascriptArray.cpp

@@ -11645,10 +11645,13 @@ Case0:
                     JS_REENTRANT(jsReentLock, BOOL gotItem = JavascriptOperators::GetItem(srcArray, propertyObject, j, &element, scriptContext));
                     if (!gotItem)
                     {
-                        // Copy across missing values as undefined as per 12.2.5.2 SpreadElement : ... AssignmentExpression 5f.
-                        element = scriptContext->GetLibrary()->GetUndefined();
+                        // skip elided elements
+                        dstIndex++;
                     }
-                    dstArray->DirectSetItemAt(dstIndex++, element);
+                    else
+                    {
+                        dstArray->DirectSetItemAt(dstIndex++, element);
+                    }   
                 }
             };
 

+ 8 - 0
test/es6/spread.js

@@ -31,6 +31,14 @@ var tests = [
           }
       }
   },
+  {
+    name: "Bug Issue 5678, Spread should not set property descriptors on missing elements of target array",
+    body: function () {
+      var a = [1,,...[3]];
+      assert.isFalse(Reflect.has(a, 1));
+      assert.isUndefined(Object.getOwnPropertyDescriptor(a, 1));
+    }
+  },
   {
     name: "Testing call with spread args (all should be the same)",
     body: function() {