diff --git a/src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case b/src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case index 93d4c0402a89947b1b6cff835e7e590bf2c88172..10d18a136f9a29ff72f91d544995db49eccbc126 100644 --- a/src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case +++ b/src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case @@ -4,12 +4,6 @@ desc: > IteratorClose throws a TypeError when `return` returns a non-Object value info: | - AssignmentElement : DestructuringAssignmentTarget Initializer - 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then - a. Let lref be the result of evaluating DestructuringAssignmentTarget. - b. ReturnIfAbrupt(lref). - [...] - ArrayAssignmentPattern : [ AssignmentElementList ] [...] @@ -32,8 +26,15 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation //- setup let unreachable = 0; +let nextCount = 0; +let returnCount = 0; let iterator = { + next() { + nextCount += 1; + return {done: false, value: undefined}; + }, return() { + returnCount += 1; return null; } }; @@ -43,17 +44,21 @@ let iterable = { } }; //- elems -[ {}[yield] ] +[ {} = yield ] //- vals iterable //- body unreachable += 1; //- teardown iter.next().then(result => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); assert.sameValue(result.value, undefined); assert.sameValue(result.done, false); iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0); assert.sameValue(constructor, TypeError); }).then($DONE, $DONE); diff --git a/src/dstr-assignment/array-elem-iter-rtrn-close-null.case b/src/dstr-assignment/array-elem-iter-rtrn-close-null.case index 817ca7b6bb0837fa05240cc2423eb1c460bd037d..c524b37069ed6950a0d1ee405cf528a42c8fe64c 100644 --- a/src/dstr-assignment/array-elem-iter-rtrn-close-null.case +++ b/src/dstr-assignment/array-elem-iter-rtrn-close-null.case @@ -26,19 +26,26 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation ---*/ //- setup -var iterable = {}; +var nextCount = 0; +var returnCount = 0; +var unreachable = 0; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { + returnCount += 1; return null; } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; function* g() { //- elems -[ {}[yield] ] +[ {} = yield ] //- vals iterable //- body @@ -46,9 +53,14 @@ iterable //- teardown } -iter = g(); +var iter = g(); iter.next(); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(TypeError, function() { iter.return(); }); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/src/dstr-assignment/array-elem-iter-rtrn-close.case b/src/dstr-assignment/array-elem-iter-rtrn-close.case index 7f1c482fe5448c7b39d2e3e556aa84b8bd2b990c..1726266e257d5ab048a153cfc89565bdbf2133c2 100644 --- a/src/dstr-assignment/array-elem-iter-rtrn-close.case +++ b/src/dstr-assignment/array-elem-iter-rtrn-close.case @@ -25,12 +25,16 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation ---*/ //- setup +var nextCount = 0; var returnCount = 0; var unreachable = 0; var thisValue = null; var args = null; -var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; thisValue = this; @@ -38,24 +42,29 @@ var iterator = { return {}; } }; -var iter, result; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; function* g() { //- elems -[ {}[yield] ] +[ {} = yield ] //- vals iterable //- body unreachable += 1; //- teardown } -iter = g(); +var iter = g(); iter.next(); -result = iter.return(777); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + +var result = iter.return(777); + +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); assert.sameValue(result.value, 777); diff --git a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case index 628e827e4b7c9f4d58c0042bd7bf627f21aaf179..1c47fafd51f1e32b24b84b58b51dc228ccbc4983 100644 --- a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case +++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case @@ -30,24 +30,28 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation ---*/ //- setup +var nextCount = 0; var returnCount = 0; var unreachable = 0; -var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; throw new Test262Error(); } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; function* g() { //- elems -[ {}[yield] , ] +[ {} = yield , ] //- vals iterable //- body @@ -55,11 +59,14 @@ unreachable += 1; //- teardown } -iter = g(); +var iter = g(); iter.next(); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(Test262Error, function() { iter.return(); }); - +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case index 8a807a3156762e89eda1446e0f8790b062bbd572..73ac1935208f9c396d994b50fe60f8606793c269 100644 --- a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case +++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case @@ -32,28 +32,38 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation ---*/ //- setup -var iterable = {}; +var nextCount = 0; +var returnCount = 0; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { + returnCount += 1; return null; } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; function* g() { //- elems - [ {}[yield] , ] + [ {} = yield , ] //- vals iterable //- teardown } -iter = g(); +var iter = g(); iter.next(); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(TypeError, function() { iter.return(); }); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case index c7c10a93cb1962e7a61790b95f33b0162acb12b4..5e1ab2f448b1443b90b2025e793d1f146658d940 100644 --- a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case +++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case @@ -31,12 +31,17 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation ---*/ //- setup +var nextCount = 0; var returnCount = 0; var unreachable = 0; var thisValue = null; var args = null; var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; thisValue = this; @@ -52,7 +57,7 @@ iterable[Symbol.iterator] = function() { function* g() { //- elems -[ {}[yield] , ] +[ {} = yield , ] //- vals iterable //- body @@ -62,8 +67,13 @@ iterable iter = g(); iter.next(); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + result = iter.return(888); +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); assert.sameValue(result.value, 888); diff --git a/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js b/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js new file mode 100644 index 0000000000000000000000000000000000000000..f5ada21f4230d646cf726dd2b51db237db56d981 --- /dev/null +++ b/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js @@ -0,0 +1,80 @@ +// Copyright (C) 2017 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-runtime-semantics-iteratordestructuringassignmentevaluation +description: > + Ensure correct evaluation order when destructuring target is property reference. +info: | + 12.15.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation + + AssignmentElement : DestructuringAssignmentTarget Initializer + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + 2. If iteratorRecord.[[Done]] is false, then + a. Let next be IteratorStep(iteratorRecord.[[Iterator]]). + ... + 3. If iteratorRecord.[[Done]] is true, let value be undefined. + ... + 5. Else, let v be value. + ... + 8. Return ? PutValue(lref, v). +features: [Symbol.iterator] +includes: [compareArray.js] +---*/ + + +var log = []; + +function source() { + log.push("source"); + var iterator = { + next: function() { + log.push("iterator-step"); + return { + get done() { + log.push("iterator-done"); + return true; + }, + get value() { + // Note: This getter shouldn't be called. + log.push("iterator-value"); + } + }; + } + }; + var source = {}; + source[Symbol.iterator] = function() { + log.push("iterator"); + return iterator; + }; + return source; +} +function target() { + log.push("target"); + return target = { + set q(v) { + log.push("set"); + } + }; +} +function targetKey() { + log.push("target-key"); + return { + toString: function() { + log.push("target-key-tostring"); + return "q"; + } + }; +} + +([target()[targetKey()]] = source()); + +assert.compareArray(log, [ + "source", "iterator", + "target", "target-key", "target-key-tostring", + "iterator-step", "iterator-done", + "set", +]); diff --git a/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js b/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js new file mode 100644 index 0000000000000000000000000000000000000000..81d8a6a728f109d634586d7e03af18051afb8a32 --- /dev/null +++ b/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js @@ -0,0 +1,75 @@ +// Copyright (C) 2017 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-runtime-semantics-keyeddestructuringassignmentevaluation +description: > + Ensure correct evaluation order when destructuring target is property reference. +info: | + 12.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation + + AssignmentProperty : PropertyName : AssignmentElement + + 1. Let name be the result of evaluating PropertyName. + 2. ReturnIfAbrupt(name). + 3. Return the result of performing KeyedDestructuringAssignmentEvaluation of + AssignmentElement with value and name as the arguments. + + 12.15.5.4 Runtime Semantics: KeyedDestructuringAssignmentEvaluation + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + 2. Let v be ? GetV(value, propertyName). + ... + 4. Else, let rhsValue be v. + ... + 7. Return ? PutValue(lref, rhsValue). +includes: [compareArray.js] +---*/ + + +var log = []; + +function source() { + log.push("source"); + return { + get p() { + log.push("get"); + } + }; +} +function target() { + log.push("target"); + return { + set q(v) { + log.push("set"); + } + }; +} +function sourceKey() { + log.push("source-key"); + return { + toString: function() { + log.push("source-key-tostring"); + return "p"; + } + }; +} +function targetKey() { + log.push("target-key"); + return { + toString: function() { + log.push("target-key-tostring"); + return "q"; + } + }; +} + +({[sourceKey()]: target()[targetKey()]} = source()); + +assert.compareArray(log, [ + "source", "source-key", "source-key-tostring", + "target", "target-key", "target-key-tostring", + "get", "set", +]); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js index 012dc89929c4c158142cbe0d5389a57145e0f5c6..e01b3990f827c68a289ca898ec50c7274e5ff3a5 100644 --- a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js +++ b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js @@ -33,13 +33,20 @@ info: | exception. ---*/ -var iterable = {}; +var nextCount = 0; +var returnCount = 0; +var unreachable = 0; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { + returnCount += 1; return null; } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; @@ -48,7 +55,7 @@ function* g() { var result; var vals = iterable; -result = [ {}[yield] ] = vals; +result = [ {} = yield ] = vals; unreachable += 1; @@ -56,9 +63,14 @@ assert.sameValue(result, vals); } -iter = g(); +var iter = g(); iter.next(); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(TypeError, function() { iter.return(); }); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js index 628357252a4d1f325cf6b90154e57cc5ed7e582c..79f5d13cec703f82abe934864c1cd80eee455e62 100644 --- a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js +++ b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js @@ -31,12 +31,16 @@ info: | 8. If innerResult.[[type]] is throw, return Completion(innerResult). ---*/ +var nextCount = 0; var returnCount = 0; var unreachable = 0; var thisValue = null; var args = null; -var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; thisValue = this; @@ -44,7 +48,7 @@ var iterator = { return {}; } }; -var iter, result; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; @@ -54,17 +58,22 @@ function* g() { var result; var vals = iterable; -result = [ {}[yield] ] = vals; +result = [ {} = yield ] = vals; unreachable += 1; assert.sameValue(result, vals); } -iter = g(); +var iter = g(); iter.next(); -result = iter.return(777); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + +var result = iter.return(777); + +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); assert.sameValue(result.value, 777); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js index af2468b11f899fbfb03d460dab43ad28ae556abc..eb1d05505ad44d80f90874a18e3949a382da778a 100644 --- a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js @@ -36,17 +36,21 @@ info: | 8. If innerResult.[[type]] is throw, return Completion(innerResult). ---*/ +var nextCount = 0; var returnCount = 0; var unreachable = 0; -var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; throw new Test262Error(); } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; @@ -56,7 +60,7 @@ function* g() { var result; var vals = iterable; -result = [ {}[yield] , ] = vals; +result = [ {} = yield , ] = vals; unreachable += 1; @@ -64,11 +68,14 @@ assert.sameValue(result, vals); } -iter = g(); +var iter = g(); iter.next(); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(Test262Error, function() { iter.return(); }); - +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js index f622e7d89898a330eada034a05fd86abda0de0cb..757f8a5aa5e97110894588a933b9885ec8340cfe 100644 --- a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js @@ -39,13 +39,19 @@ info: | exception. ---*/ -var iterable = {}; +var nextCount = 0; +var returnCount = 0; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { + returnCount += 1; return null; } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; @@ -55,7 +61,7 @@ function* g() { var result; var vals = iterable; -result = [ {}[yield] , ] = vals; +result = [ {} = yield , ] = vals; @@ -63,9 +69,13 @@ assert.sameValue(result, vals); } -iter = g(); +var iter = g(); iter.next(); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(TypeError, function() { iter.return(); }); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js index 23110527ea91f77e15d1746651bc76fba27c9c4e..9a6ebed9ab8cc59b3133a99441586c353c020d22 100644 --- a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js @@ -37,12 +37,17 @@ info: | 8. If innerResult.[[type]] is throw, return Completion(innerResult). ---*/ +var nextCount = 0; var returnCount = 0; var unreachable = 0; var thisValue = null; var args = null; var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; thisValue = this; @@ -61,7 +66,7 @@ function* g() { var result; var vals = iterable; -result = [ {}[yield] , ] = vals; +result = [ {} = yield , ] = vals; unreachable += 1; @@ -71,8 +76,13 @@ assert.sameValue(result, vals); iter = g(); iter.next(); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + result = iter.return(888); +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); assert.sameValue(result.value, 888); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js index ddd3f1fb0021d47444f39cb32f5ddc43bb9e2a24..7fb85ba02535bcee96980a5deed9b0e7a83ff866 100644 --- a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js @@ -24,12 +24,6 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] - AssignmentElement : DestructuringAssignmentTarget Initializer - 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then - a. Let lref be the result of evaluating DestructuringAssignmentTarget. - b. ReturnIfAbrupt(lref). - [...] - ArrayAssignmentPattern : [ AssignmentElementList ] [...] @@ -46,8 +40,15 @@ info: | ---*/ let unreachable = 0; +let nextCount = 0; +let returnCount = 0; let iterator = { + next() { + nextCount += 1; + return {done: false, value: undefined}; + }, return() { + returnCount += 1; return null; } }; @@ -59,7 +60,7 @@ let iterable = { let iterCount = 0; async function * fn() { - for await ([ {}[yield] ] of [iterable]) { + for await ([ {} = yield ] of [iterable]) { unreachable += 1; iterCount += 1; } @@ -68,10 +69,14 @@ async function * fn() { let iter = fn(); iter.next().then(result => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); assert.sameValue(result.value, undefined); assert.sameValue(result.done, false); iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0); assert.sameValue(constructor, TypeError); }).then($DONE, $DONE); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js index ba47174659686b574e623b5c5d42e30f2599ad21..972c6c2cba711b2f9858dff414df6128bfcf61df 100644 --- a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js +++ b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js @@ -42,13 +42,20 @@ info: | exception. ---*/ -var iterable = {}; +var nextCount = 0; +var returnCount = 0; +var unreachable = 0; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { + returnCount += 1; return null; } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; @@ -56,7 +63,7 @@ function* g() { var counter = 0; -for ([ {}[yield] ] of [iterable]) { +for ([ {} = yield ] of [iterable]) { unreachable += 1; counter += 1; } @@ -65,9 +72,14 @@ assert.sameValue(counter, 1); } -iter = g(); +var iter = g(); iter.next(); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(TypeError, function() { iter.return(); }); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js index 84175bc503a23e7e893de221b08c943f6069a30f..e1f43ddf85eee31e748434bbde39960689b72d03 100644 --- a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js +++ b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js @@ -40,12 +40,16 @@ info: | 8. If innerResult.[[type]] is throw, return Completion(innerResult). ---*/ +var nextCount = 0; var returnCount = 0; var unreachable = 0; var thisValue = null; var args = null; -var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; thisValue = this; @@ -53,7 +57,7 @@ var iterator = { return {}; } }; -var iter, result; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; @@ -62,7 +66,7 @@ function* g() { var counter = 0; -for ([ {}[yield] ] of [iterable]) { +for ([ {} = yield ] of [iterable]) { unreachable += 1; counter += 1; } @@ -70,10 +74,15 @@ for ([ {}[yield] ] of [iterable]) { assert.sameValue(counter, 1); } -iter = g(); +var iter = g(); iter.next(); -result = iter.return(777); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + +var result = iter.return(777); + +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); assert.sameValue(result.value, 777); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js index c5137f4e28166b51a91dbde2625ada8be3265543..30fb04f8bd478696603a3fd5f60dbe94279bb540 100644 --- a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js @@ -45,17 +45,21 @@ info: | 8. If innerResult.[[type]] is throw, return Completion(innerResult). ---*/ +var nextCount = 0; var returnCount = 0; var unreachable = 0; -var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; throw new Test262Error(); } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; @@ -64,7 +68,7 @@ function* g() { var counter = 0; -for ([ {}[yield] , ] of [iterable]) { +for ([ {} = yield , ] of [iterable]) { unreachable += 1; counter += 1; } @@ -73,11 +77,14 @@ assert.sameValue(counter, 1); } -iter = g(); +var iter = g(); iter.next(); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(Test262Error, function() { iter.return(); }); - +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js index 0ee69ab93f0b9f1d5ffe4357881906b2bd0c4d33..ca4219139dee70f075e335c1d24aa271c79cf549 100644 --- a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js @@ -48,13 +48,19 @@ info: | exception. ---*/ -var iterable = {}; +var nextCount = 0; +var returnCount = 0; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { + returnCount += 1; return null; } }; -var iter; +var iterable = {}; iterable[Symbol.iterator] = function() { return iterator; }; @@ -63,7 +69,7 @@ function* g() { var counter = 0; -for ([ {}[yield] , ] of [iterable]) { +for ([ {} = yield , ] of [iterable]) { counter += 1; } @@ -72,9 +78,13 @@ assert.sameValue(counter, 1); } -iter = g(); +var iter = g(); iter.next(); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); assert.throws(TypeError, function() { iter.return(); }); +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js index eb1c4c749bbc1050542b3273f0e50236e46c9c13..94ddc7db31a78ac193167859f4b242064077e11f 100644 --- a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js @@ -46,12 +46,17 @@ info: | 8. If innerResult.[[type]] is throw, return Completion(innerResult). ---*/ +var nextCount = 0; var returnCount = 0; var unreachable = 0; var thisValue = null; var args = null; var iterable = {}; var iterator = { + next: function() { + nextCount += 1; + return {done: false, value: undefined}; + }, return: function() { returnCount += 1; thisValue = this; @@ -69,7 +74,7 @@ function* g() { var counter = 0; -for ([ {}[yield] , ] of [iterable]) { +for ([ {} = yield , ] of [iterable]) { unreachable += 1; counter += 1; } @@ -80,8 +85,13 @@ assert.sameValue(counter, 1); iter = g(); iter.next(); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + result = iter.return(888); +assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 1); assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); assert.sameValue(result.value, 888);