"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (ast, strictCode, env, realm) { // 1. Let array be ArrayCreate(0). var array = _singletons.Create.ArrayCreate(realm, 0); // 2. Let len be the result of performing ArrayAccumulation for ElementList with arguments array and 0. var elements = ast.elements || []; var len = elements.length; var nextIndex = 0; for (var i = 0; i < len; i++) { var elem = elements[i]; if (!elem) { nextIndex++; continue; } // ECMA262 12.2.5.2 if (elem.type === "SpreadElement") { // 1. Let spreadRef be the result of evaluating AssignmentExpression. var spreadRef = env.evaluate(elem.argument, strictCode); // 2. Let spreadObj be ? GetValue(spreadRef). var spreadObj = _singletons.Environment.GetValue(realm, spreadRef); // 3. Let iterator be ? GetIterator(spreadObj). var iterator = (0, _index2.GetIterator)(realm, spreadObj); // 4. Repeat while (true) { // a. Let next be ? IteratorStep(iterator). var next = (0, _iterator.IteratorStep)(realm, iterator); // b. If next is false, return nextIndex. if (next === false) break; // c. Let nextValue be ? IteratorValue(next). var nextValue = (0, _iterator.IteratorValue)(realm, next); // d. Let status be CreateDataProperty(array, ToString(ToUint32(nextIndex)), nextValue). var status = _singletons.Create.CreateDataProperty(realm, array, new _index.StringValue(realm, nextIndex++ + ""), nextValue); // e. Assert: status is true. (0, _invariant2.default)(status === true); // f. Let nextIndex be nextIndex + 1. } } else { // Redundant steps. // 1. Let postIndex be the result of performing ArrayAccumulation for ElementList with arguments array and nextIndex. // 2. ReturnIfAbrupt(postIndex). // 3. Let padding be the ElisionWidth of Elision; if Elision is not present, use the numeric value zero. // 4. Let initResult be the result of evaluating AssignmentExpression. var initResult = env.evaluate(elem, strictCode); // 5. Let initValue be ? GetValue(initResult). var initValue = _singletons.Environment.GetValue(realm, initResult); // 6. Let created be CreateDataProperty(array, ToString(ToUint32(postIndex+padding)), initValue). var created = _singletons.Create.CreateDataProperty(realm, array, new _index.StringValue(realm, nextIndex++ + ""), initValue); // 7. Assert: created is true. (0, _invariant2.default)(created === true, "expected data property creation"); } } // Not necessary since we propagate completions with exceptions. // 3. ReturnIfAbrupt(len). // 4. Perform Set(array, "length", ToUint32(len), false). _singletons.Properties.Set(realm, array, "length", new _index.NumberValue(realm, nextIndex), false); // 5. NOTE: The above Set cannot fail because of the nature of the object returned by ArrayCreate. // 6. Return array. return array; }; var _index = require("../values/index.js"); var _index2 = require("../methods/index.js"); var _invariant = require("../invariant.js"); var _invariant2 = _interopRequireDefault(_invariant); var _iterator = require("../methods/iterator.js"); var _singletons = require("../singletons.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } //# sourceMappingURL=ArrayExpression.js.map