You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.6 KiB
98 lines
2.6 KiB
'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;
|
|
|