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