| 'use strict'; |
| |
| var GetIntrinsic = require('es-abstract/GetIntrinsic'); |
| var has = require('has'); |
| var channel = require('side-channel')(); |
| |
| var $TypeError = GetIntrinsic('%TypeError%'); |
| |
| var SLOT = { |
| assert: function (O, slot) { |
| if (!O || (typeof O !== 'object' && typeof O !== 'function')) { |
| throw new $TypeError('`O` is not an object'); |
| } |
| if (typeof slot !== 'string') { |
| throw new $TypeError('`slot` must be a string'); |
| } |
| channel.assert(O); |
| }, |
| get: function (O, slot) { |
| if (!O || (typeof O !== 'object' && typeof O !== 'function')) { |
| throw new $TypeError('`O` is not an object'); |
| } |
| if (typeof slot !== 'string') { |
| throw new $TypeError('`slot` must be a string'); |
| } |
| var slots = channel.get(O); |
| return slots && slots['$' + slot]; |
| }, |
| has: function (O, slot) { |
| if (!O || (typeof O !== 'object' && typeof O !== 'function')) { |
| throw new $TypeError('`O` is not an object'); |
| } |
| if (typeof slot !== 'string') { |
| throw new $TypeError('`slot` must be a string'); |
| } |
| var slots = channel.get(O); |
| return !!slots && has(slots, '$' + slot); |
| }, |
| set: function (O, slot, V) { |
| if (!O || (typeof O !== 'object' && typeof O !== 'function')) { |
| throw new $TypeError('`O` is not an object'); |
| } |
| if (typeof slot !== 'string') { |
| throw new $TypeError('`slot` must be a string'); |
| } |
| var slots = channel.get(O); |
| if (!slots) { |
| slots = {}; |
| channel.set(O, slots); |
| } |
| slots['$' + slot] = V; |
| } |
| }; |
| |
| if (Object.freeze) { |
| Object.freeze(SLOT); |
| } |
| |
| module.exports = SLOT; |