'use strict'; var ES2015 = require('./es2015'); var GetIntrinsic = require('./GetIntrinsic'); var assign = require('./helpers/assign'); var $setProto = require('./helpers/setProto'); var callBound = require('./helpers/callBound'); var getIteratorMethod = require('./helpers/getIteratorMethod'); var $TypeError = GetIntrinsic('%TypeError%'); var $arrayPush = callBound('Array.prototype.push'); var $getProto = require('./helpers/getProto'); var ES2016 = assign(assign({}, ES2015), { // https://www.ecma-international.org/ecma-262/7.0/#sec-samevaluenonnumber SameValueNonNumber: function SameValueNonNumber(x, y) { if (typeof x === 'number' || typeof x !== typeof y) { throw new TypeError('SameValueNonNumber requires two non-number values of the same type.'); } return this.SameValue(x, y); }, // https://www.ecma-international.org/ecma-262/7.0/#sec-iterabletoarraylike IterableToArrayLike: function IterableToArrayLike(items) { var usingIterator = getIteratorMethod(this, items); if (typeof usingIterator !== 'undefined') { var iterator = this.GetIterator(items, usingIterator); var values = []; var next = true; while (next) { next = this.IteratorStep(iterator); if (next) { var nextValue = this.IteratorValue(next); $arrayPush(values, nextValue); } } return values; } return this.ToObject(items); }, // https://ecma-international.org/ecma-262/7.0/#sec-ordinarygetprototypeof OrdinaryGetPrototypeOf: function (O) { if (this.Type(O) !== 'Object') { throw new $TypeError('Assertion failed: O must be an Object'); } if (!$getProto) { throw new $TypeError('This environment does not support fetching prototypes.'); } return $getProto(O); }, // https://ecma-international.org/ecma-262/7.0/#sec-ordinarysetprototypeof OrdinarySetPrototypeOf: function (O, V) { if (this.Type(V) !== 'Object' && this.Type(V) !== 'Null') { throw new $TypeError('Assertion failed: V must be Object or Null'); } /* var extensible = this.IsExtensible(O); var current = this.OrdinaryGetPrototypeOf(O); if (this.SameValue(V, current)) { return true; } if (!extensible) { return false; } */ try { $setProto(O, V); } catch (e) { return false; } return this.OrdinaryGetPrototypeOf(O) === V; /* var p = V; var done = false; while (!done) { if (p === null) { done = true; } else if (this.SameValue(p, O)) { return false; } else { if (wat) { done = true; } else { p = p.[[Prototype]]; } } } O.[[Prototype]] = V; return true; */ } }); module.exports = ES2016;