Title: [233740] trunk
Revision
233740
Author
[email protected]
Date
2018-07-11 13:29:47 -0700 (Wed, 11 Jul 2018)

Log Message

Iterator of Array.keys() returns object in wrong order
https://bugs.webkit.org/show_bug.cgi?id=185197

Reviewed by Keith Miller.

JSTests:

We align the shape of our iterator result to the spec: {value,done} instead of {done,value}.

* stress/iterator-field-order.js: Added.
(shouldBe):
(shouldBe.JSON.stringify.array.values.next):
(shouldBe.JSON.stringify.array.keys.next):
(shouldBe.JSON.stringify.array.entries.next):
(async.asyncIterator):
(iterator.next.then):
(generator):
(shouldBe.JSON.stringify.generator.next):
(shouldBe.JSON.stringify.map.keys.next):
(shouldBe.JSON.stringify.map.values.next):
(shouldBe.JSON.stringify.map.entries.next):
(set new):

Source/_javascript_Core:

* builtins/ArrayIteratorPrototype.js:
(globalPrivate.arrayIteratorValueNext):
(globalPrivate.arrayIteratorKeyNext):
(globalPrivate.arrayIteratorKeyValueNext):
* builtins/AsyncFromSyncIteratorPrototype.js:
* builtins/AsyncGeneratorPrototype.js:
(globalPrivate.asyncGeneratorResolve):
* builtins/GeneratorPrototype.js:
(globalPrivate.generatorResume):
* builtins/MapIteratorPrototype.js:
(globalPrivate.mapIteratorNext):
* builtins/SetIteratorPrototype.js:
(globalPrivate.setIteratorNext):
* builtins/StringIteratorPrototype.js:
(next):
* runtime/IteratorOperations.cpp:
(JSC::createIteratorResultObjectStructure):
(JSC::createIteratorResultObject):

Modified Paths

Added Paths

Diff

Modified: trunk/JSTests/ChangeLog (233739 => 233740)


--- trunk/JSTests/ChangeLog	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/JSTests/ChangeLog	2018-07-11 20:29:47 UTC (rev 233740)
@@ -1,5 +1,28 @@
 2018-07-11  Yusuke Suzuki  <[email protected]>
 
+        Iterator of Array.keys() returns object in wrong order
+        https://bugs.webkit.org/show_bug.cgi?id=185197
+
+        Reviewed by Keith Miller.
+
+        We align the shape of our iterator result to the spec: {value,done} instead of {done,value}.
+
+        * stress/iterator-field-order.js: Added.
+        (shouldBe):
+        (shouldBe.JSON.stringify.array.values.next):
+        (shouldBe.JSON.stringify.array.keys.next):
+        (shouldBe.JSON.stringify.array.entries.next):
+        (async.asyncIterator):
+        (iterator.next.then):
+        (generator):
+        (shouldBe.JSON.stringify.generator.next):
+        (shouldBe.JSON.stringify.map.keys.next):
+        (shouldBe.JSON.stringify.map.values.next):
+        (shouldBe.JSON.stringify.map.entries.next):
+        (set new):
+
+2018-07-11  Yusuke Suzuki  <[email protected]>
+
         Unreviewed, clean up test262 expectations
 
         * test262/expectations.yaml:

Added: trunk/JSTests/stress/iterator-field-order.js (0 => 233740)


--- trunk/JSTests/stress/iterator-field-order.js	                        (rev 0)
+++ trunk/JSTests/stress/iterator-field-order.js	2018-07-11 20:29:47 UTC (rev 233740)
@@ -0,0 +1,38 @@
+function shouldBe(actual, expected) {
+    if (actual !== expected)
+        throw new Error('bad value: ' + actual);
+}
+
+var array = [ 42 ];
+
+shouldBe(JSON.stringify(array.values().next()), `{"value":42,"done":false}`);
+shouldBe(JSON.stringify(array.keys().next()), `{"value":0,"done":false}`);
+shouldBe(JSON.stringify(array.entries().next()), `{"value":[0,42],"done":false}`);
+
+async function* asyncIterator() {
+    yield 42;
+}
+
+var iterator = asyncIterator();
+iterator.next().then(function (value) {
+    shouldBe(JSON.stringify(value), `{"value":42,"done":false}`);
+}).catch($vm.abort);
+
+function* generator() {
+    yield 42;
+}
+
+shouldBe(JSON.stringify(generator().next()), `{"value":42,"done":false}`);
+
+var map = new Map([[0,42]]);
+shouldBe(JSON.stringify(map.keys().next()), `{"value":0,"done":false}`);
+shouldBe(JSON.stringify(map.values().next()), `{"value":42,"done":false}`);
+shouldBe(JSON.stringify(map.entries().next()), `{"value":[0,42],"done":false}`);
+
+var set = new Set([42]);
+shouldBe(JSON.stringify(set.keys().next()), `{"value":42,"done":false}`);
+shouldBe(JSON.stringify(set.values().next()), `{"value":42,"done":false}`);
+shouldBe(JSON.stringify(set.entries().next()), `{"value":[42,42],"done":false}`);
+
+var string = "Cocoa";
+shouldBe(JSON.stringify(string[Symbol.iterator]().next()), `{"value":"C","done":false}`);

Modified: trunk/Source/_javascript_Core/ChangeLog (233739 => 233740)


--- trunk/Source/_javascript_Core/ChangeLog	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/ChangeLog	2018-07-11 20:29:47 UTC (rev 233740)
@@ -1,3 +1,29 @@
+2018-07-11  Yusuke Suzuki  <[email protected]>
+
+        Iterator of Array.keys() returns object in wrong order
+        https://bugs.webkit.org/show_bug.cgi?id=185197
+
+        Reviewed by Keith Miller.
+
+        * builtins/ArrayIteratorPrototype.js:
+        (globalPrivate.arrayIteratorValueNext):
+        (globalPrivate.arrayIteratorKeyNext):
+        (globalPrivate.arrayIteratorKeyValueNext):
+        * builtins/AsyncFromSyncIteratorPrototype.js:
+        * builtins/AsyncGeneratorPrototype.js:
+        (globalPrivate.asyncGeneratorResolve):
+        * builtins/GeneratorPrototype.js:
+        (globalPrivate.generatorResume):
+        * builtins/MapIteratorPrototype.js:
+        (globalPrivate.mapIteratorNext):
+        * builtins/SetIteratorPrototype.js:
+        (globalPrivate.setIteratorNext):
+        * builtins/StringIteratorPrototype.js:
+        (next):
+        * runtime/IteratorOperations.cpp:
+        (JSC::createIteratorResultObjectStructure):
+        (JSC::createIteratorResultObject):
+
 2018-07-10  Mark Lam  <[email protected]>
 
         constructArray() should always allocate the requested length.

Modified: trunk/Source/_javascript_Core/builtins/ArrayIteratorPrototype.js (233739 => 233740)


--- trunk/Source/_javascript_Core/builtins/ArrayIteratorPrototype.js	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/builtins/ArrayIteratorPrototype.js	2018-07-11 20:29:47 UTC (rev 233740)
@@ -58,7 +58,7 @@
         }
     }
 
-    return { done, value };
+    return { value, done };
 }
 
 @globalPrivate
@@ -81,7 +81,7 @@
         }
     }
 
-    return { done, value };
+    return { value, done };
 }
 
 @globalPrivate
@@ -104,5 +104,5 @@
         }
     }
 
-    return { done, value };
+    return { value, done };
 }

Modified: trunk/Source/_javascript_Core/builtins/AsyncFromSyncIteratorPrototype.js (233739 => 233740)


--- trunk/Source/_javascript_Core/builtins/AsyncFromSyncIteratorPrototype.js	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/builtins/AsyncFromSyncIteratorPrototype.js	2018-07-11 20:29:47 UTC (rev 233740)
@@ -37,11 +37,11 @@
     const syncIterator = @getByIdDirectPrivate(this, "syncIterator");
 
     try {
-        const { done: nextDone, value: nextValue } = @getByIdDirectPrivate(this, "nextMethod").@call(syncIterator, value);
+        const { value: nextValue, done: nextDone } = @getByIdDirectPrivate(this, "nextMethod").@call(syncIterator, value);
         const valueWrapperCapability = @newPromiseCapability(@Promise);
         valueWrapperCapability.@resolve.@call(@undefined, nextValue);
         valueWrapperCapability.@promise.@then(
-            function (result) { promiseCapability.@resolve.@call(@undefined, { done: !!nextDone, value: result }); },
+            function (result) { promiseCapability.@resolve.@call(@undefined, { value: result, done: !!nextDone }); },
             function (error) { promiseCapability.@reject.@call(@undefined, error); });
      } catch(e) {
          promiseCapability.@reject.@call(@undefined, e);
@@ -85,12 +85,12 @@
             return promiseCapability.@promise;
         }
 
-        const { done: resultDone, value: resultValue } = returnResult;
+        const { value: resultValue, done: resultDone } = returnResult;
         const valueWrapperCapability = @newPromiseCapability(@Promise);
 
         valueWrapperCapability.@resolve.@call(@undefined, resultValue);
         valueWrapperCapability.@promise.@then(
-            function (result) { promiseCapability.@resolve.@call(@undefined, { done: resultDone, value: result }); },
+            function (result) { promiseCapability.@resolve.@call(@undefined, { value: result, done: resultDone }); },
             function (error) { promiseCapability.@reject.@call(@undefined, error); });
     } catch (e) {
         promiseCapability.@reject.@call(@undefined, e);
@@ -134,12 +134,12 @@
             return promiseCapability.@promise;
         }
         
-        const { done: throwDone, value: throwValue } = throwResult;
+        const { value: throwValue, done: throwDone } = throwResult;
         const valueWrapperCapability = @newPromiseCapability(@Promise);
         
         valueWrapperCapability.@resolve.@call(@undefined, throwValue);
         valueWrapperCapability.@promise.@then(
-            function (result) { promiseCapability.@resolve.@call(@undefined, { done: throwDone, value: result }); },
+            function (result) { promiseCapability.@resolve.@call(@undefined, { value: result, done: throwDone }); },
             function (error) { promiseCapability.@reject.@call(@undefined, error); });
     } catch (e) {
         promiseCapability.@reject.@call(@undefined, e);

Modified: trunk/Source/_javascript_Core/builtins/AsyncGeneratorPrototype.js (233739 => 233740)


--- trunk/Source/_javascript_Core/builtins/AsyncGeneratorPrototype.js	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/builtins/AsyncGeneratorPrototype.js	2018-07-11 20:29:47 UTC (rev 233740)
@@ -124,7 +124,7 @@
     @assert(typeof @getByIdDirectPrivate(generator, "asyncGeneratorSuspendReason") === "number", "Generator is not an AsyncGenerator instance.");
 
     const { promiseCapability } = @asyncGeneratorDequeue(generator);
-    promiseCapability.@resolve.@call(@undefined, { done, value: value });
+    promiseCapability.@resolve.@call(@undefined, { value, done });
 
     return @asyncGeneratorResumeNext(generator);
 }

Modified: trunk/Source/_javascript_Core/builtins/GeneratorPrototype.js (233739 => 233740)


--- trunk/Source/_javascript_Core/builtins/GeneratorPrototype.js	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/builtins/GeneratorPrototype.js	2018-07-11 20:29:47 UTC (rev 233740)
@@ -45,7 +45,7 @@
             throw error;
         }
     }
-    return { done, value };
+    return { value, done };
 }
 
 function next(value)

Modified: trunk/Source/_javascript_Core/builtins/MapIteratorPrototype.js (233739 => 233740)


--- trunk/Source/_javascript_Core/builtins/MapIteratorPrototype.js	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/builtins/MapIteratorPrototype.js	2018-07-11 20:29:47 UTC (rev 233740)
@@ -41,7 +41,7 @@
         else if (kind === @iterationKindKey)
             value = key;
     }
-    return { done, value };
+    return { value, done };
 }
 
 function next()

Modified: trunk/Source/_javascript_Core/builtins/SetIteratorPrototype.js (233739 => 233740)


--- trunk/Source/_javascript_Core/builtins/SetIteratorPrototype.js	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/builtins/SetIteratorPrototype.js	2018-07-11 20:29:47 UTC (rev 233740)
@@ -38,7 +38,7 @@
         if (kind === @iterationKindKeyValue)
             value = [ value, value ]
     }
-    return { done, value };
+    return { value, done };
 }
 
 function next()

Modified: trunk/Source/_javascript_Core/builtins/StringIteratorPrototype.js (233739 => 233740)


--- trunk/Source/_javascript_Core/builtins/StringIteratorPrototype.js	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/builtins/StringIteratorPrototype.js	2018-07-11 20:29:47 UTC (rev 233740)
@@ -60,5 +60,5 @@
         }
     }
 
-    return {done, value};
+    return { value, done };
 }

Modified: trunk/Source/_javascript_Core/runtime/IteratorOperations.cpp (233739 => 233740)


--- trunk/Source/_javascript_Core/runtime/IteratorOperations.cpp	2018-07-11 19:36:16 UTC (rev 233739)
+++ trunk/Source/_javascript_Core/runtime/IteratorOperations.cpp	2018-07-11 20:29:47 UTC (rev 233740)
@@ -134,17 +134,17 @@
     }
 }
 
-static const PropertyOffset donePropertyOffset = 0;
-static const PropertyOffset valuePropertyOffset = 1;
+static const PropertyOffset valuePropertyOffset = 0;
+static const PropertyOffset donePropertyOffset = 1;
 
 Structure* createIteratorResultObjectStructure(VM& vm, JSGlobalObject& globalObject)
 {
     Structure* iteratorResultStructure = vm.structureCache.emptyObjectStructureForPrototype(&globalObject, globalObject.objectPrototype(), JSFinalObject::defaultInlineCapacity());
     PropertyOffset offset;
+    iteratorResultStructure = Structure::addPropertyTransition(vm, iteratorResultStructure, vm.propertyNames->value, 0, offset);
+    RELEASE_ASSERT(offset == valuePropertyOffset);
     iteratorResultStructure = Structure::addPropertyTransition(vm, iteratorResultStructure, vm.propertyNames->done, 0, offset);
     RELEASE_ASSERT(offset == donePropertyOffset);
-    iteratorResultStructure = Structure::addPropertyTransition(vm, iteratorResultStructure, vm.propertyNames->value, 0, offset);
-    RELEASE_ASSERT(offset == valuePropertyOffset);
     return iteratorResultStructure;
 }
 
@@ -152,8 +152,8 @@
 {
     VM& vm = exec->vm();
     JSObject* resultObject = constructEmptyObject(exec, exec->lexicalGlobalObject()->iteratorResultObjectStructure());
+    resultObject->putDirect(vm, valuePropertyOffset, value);
     resultObject->putDirect(vm, donePropertyOffset, jsBoolean(done));
-    resultObject->putDirect(vm, valuePropertyOffset, value);
     return resultObject;
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to