| // Copyright (C) 2017 André Bargull. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| |
| /*--- |
| esid: sec-function-calls-runtime-semantics-evaluation |
| description: > |
| Direct eval call with spread. |
| info: | |
| 12.3.4.1 Runtime Semantics: Evaluation |
| ... |
| 3. If Type(ref) is Reference and IsPropertyReference(ref) is false and GetReferencedName(ref) is "eval", then |
| a. If SameValue(func, %eval%) is true, then |
| i. Let argList be ? ArgumentListEvaluation(Arguments). |
| ii. If argList has no elements, return undefined. |
| iii. Let evalText be the first element of argList. |
| ... |
| |
| features: [Symbol.iterator] |
| ---*/ |
| |
| var elements = [ |
| "x = 1;", |
| "x = 2;", |
| ]; |
| |
| var nextCount = 0; |
| var iter = {}; |
| iter[Symbol.iterator] = function() { |
| return { |
| next: function() { |
| var i = nextCount++; |
| if (i < elements.length) { |
| return {done: false, value: elements[i]}; |
| } |
| return {done: true, value: undefined}; |
| } |
| }; |
| }; |
| |
| var x = "global"; |
| |
| (function() { |
| var x = "local"; |
| eval(...iter); |
| assert.sameValue(x, 1); |
| })(); |
| |
| assert.sameValue(x, "global"); |
| assert.sameValue(nextCount, 3); |