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;
}