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