| 'use strict'; |
| |
| var GetIntrinsic = require('get-intrinsic'); |
| |
| var $TypeError = GetIntrinsic('%TypeError%'); |
| |
| var $setProto = require('../helpers/setProto'); |
| |
| var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf'); |
| var Type = require('./Type'); |
| |
| // https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof |
| |
| module.exports = function OrdinarySetPrototypeOf(O, V) { |
| if (Type(V) !== 'Object' && Type(V) !== 'Null') { |
| throw new $TypeError('Assertion failed: V must be Object or Null'); |
| } |
| /* |
| var extensible = IsExtensible(O); |
| var current = OrdinaryGetPrototypeOf(O); |
| if (SameValue(V, current)) { |
| return true; |
| } |
| if (!extensible) { |
| return false; |
| } |
| */ |
| try { |
| $setProto(O, V); |
| } catch (e) { |
| return false; |
| } |
| return OrdinaryGetPrototypeOf(O) === V; |
| /* |
| var p = V; |
| var done = false; |
| while (!done) { |
| if (p === null) { |
| done = true; |
| } else if (SameValue(p, O)) { |
| return false; |
| } else { |
| if (wat) { |
| done = true; |
| } else { |
| p = p.[[Prototype]]; |
| } |
| } |
| } |
| O.[[Prototype]] = V; |
| return true; |
| */ |
| }; |