GetSetRecord.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. 'use strict';
  2. var $RangeError = require('es-errors/range');
  3. var $TypeError = require('es-errors/type');
  4. var Get = require('./Get');
  5. var IsCallable = require('./IsCallable');
  6. var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');
  7. var ToNumber = require('./ToNumber');
  8. var isNaN = require('..//helpers/isNaN');
  9. var isObject = require('es-object-atoms/isObject');
  10. var callBind = require('call-bind');
  11. var isSet = require('is-set');
  12. var stopIterationIterator = require('stop-iteration-iterator');
  13. // https://262.ecma-international.org/16.0/#sec-getsetrecord
  14. module.exports = function GetSetRecord(obj) {
  15. if (!isObject(obj)) {
  16. throw new $TypeError('obj is not an Object'); // step 1
  17. }
  18. var rawSize = Get(obj, 'size'); // step 2
  19. var numSize = ToNumber(rawSize); // step 3
  20. // 4. NOTE: If rawSize is undefined, then numSize will be NaN.
  21. if (isNaN(numSize)) {
  22. throw new $TypeError('`size` is not a non-NaN Number'); // step 5
  23. }
  24. var intSize = ToIntegerOrInfinity(numSize); // step 6
  25. if (intSize < 0) {
  26. throw new $RangeError('set size must be non-negative'); // step 7
  27. }
  28. var has = Get(obj, 'has'); // step 8
  29. if (!IsCallable(has)) {
  30. throw new $TypeError('has is not a function'); // step 9
  31. }
  32. var keys = Get(obj, 'keys'); // step 10
  33. if (!IsCallable(keys)) {
  34. throw new $TypeError('keys is not a function'); // step 11
  35. }
  36. /* globals StopIteration: false */
  37. if (isSet(obj) && typeof StopIteration === 'object') {
  38. var boundKeys = callBind(keys);
  39. keys = function keys() { // eslint-disable-line no-shadow
  40. return stopIterationIterator(boundKeys(this)); // eslint-disable-line no-invalid-this
  41. };
  42. }
  43. return {
  44. '[[SetObject]]': obj,
  45. '[[Size]]': intSize,
  46. '[[Has]]': has,
  47. '[[Keys]]': keys
  48. }; // step 12
  49. };