es.weak-map.constructor.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. 'use strict';
  2. var FREEZING = require('../internals/freezing');
  3. var global = require('../internals/global');
  4. var uncurryThis = require('../internals/function-uncurry-this');
  5. var defineBuiltIns = require('../internals/define-built-ins');
  6. var InternalMetadataModule = require('../internals/internal-metadata');
  7. var collection = require('../internals/collection');
  8. var collectionWeak = require('../internals/collection-weak');
  9. var isObject = require('../internals/is-object');
  10. var enforceInternalState = require('../internals/internal-state').enforce;
  11. var fails = require('../internals/fails');
  12. var NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');
  13. var $Object = Object;
  14. // eslint-disable-next-line es/no-array-isarray -- safe
  15. var isArray = Array.isArray;
  16. // eslint-disable-next-line es/no-object-isextensible -- safe
  17. var isExtensible = $Object.isExtensible;
  18. // eslint-disable-next-line es/no-object-isfrozen -- safe
  19. var isFrozen = $Object.isFrozen;
  20. // eslint-disable-next-line es/no-object-issealed -- safe
  21. var isSealed = $Object.isSealed;
  22. // eslint-disable-next-line es/no-object-freeze -- safe
  23. var freeze = $Object.freeze;
  24. // eslint-disable-next-line es/no-object-seal -- safe
  25. var seal = $Object.seal;
  26. var FROZEN = {};
  27. var SEALED = {};
  28. var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
  29. var InternalWeakMap;
  30. var wrapper = function (init) {
  31. return function WeakMap() {
  32. return init(this, arguments.length ? arguments[0] : undefined);
  33. };
  34. };
  35. // `WeakMap` constructor
  36. // https://tc39.es/ecma262/#sec-weakmap-constructor
  37. var $WeakMap = collection('WeakMap', wrapper, collectionWeak);
  38. var WeakMapPrototype = $WeakMap.prototype;
  39. var nativeSet = uncurryThis(WeakMapPrototype.set);
  40. // Chakra Edge bug: adding frozen arrays to WeakMap unfreeze them
  41. var hasMSEdgeFreezingBug = function () {
  42. return FREEZING && fails(function () {
  43. var frozenArray = freeze([]);
  44. nativeSet(new $WeakMap(), frozenArray, 1);
  45. return !isFrozen(frozenArray);
  46. });
  47. };
  48. // IE11 WeakMap frozen keys fix
  49. // We can't use feature detection because it crash some old IE builds
  50. // https://github.com/zloirock/core-js/issues/485
  51. if (NATIVE_WEAK_MAP) if (IS_IE11) {
  52. InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);
  53. InternalMetadataModule.enable();
  54. var nativeDelete = uncurryThis(WeakMapPrototype['delete']);
  55. var nativeHas = uncurryThis(WeakMapPrototype.has);
  56. var nativeGet = uncurryThis(WeakMapPrototype.get);
  57. defineBuiltIns(WeakMapPrototype, {
  58. 'delete': function (key) {
  59. if (isObject(key) && !isExtensible(key)) {
  60. var state = enforceInternalState(this);
  61. if (!state.frozen) state.frozen = new InternalWeakMap();
  62. return nativeDelete(this, key) || state.frozen['delete'](key);
  63. } return nativeDelete(this, key);
  64. },
  65. has: function has(key) {
  66. if (isObject(key) && !isExtensible(key)) {
  67. var state = enforceInternalState(this);
  68. if (!state.frozen) state.frozen = new InternalWeakMap();
  69. return nativeHas(this, key) || state.frozen.has(key);
  70. } return nativeHas(this, key);
  71. },
  72. get: function get(key) {
  73. if (isObject(key) && !isExtensible(key)) {
  74. var state = enforceInternalState(this);
  75. if (!state.frozen) state.frozen = new InternalWeakMap();
  76. return nativeHas(this, key) ? nativeGet(this, key) : state.frozen.get(key);
  77. } return nativeGet(this, key);
  78. },
  79. set: function set(key, value) {
  80. if (isObject(key) && !isExtensible(key)) {
  81. var state = enforceInternalState(this);
  82. if (!state.frozen) state.frozen = new InternalWeakMap();
  83. nativeHas(this, key) ? nativeSet(this, key, value) : state.frozen.set(key, value);
  84. } else nativeSet(this, key, value);
  85. return this;
  86. }
  87. });
  88. // Chakra Edge frozen keys fix
  89. } else if (hasMSEdgeFreezingBug()) {
  90. defineBuiltIns(WeakMapPrototype, {
  91. set: function set(key, value) {
  92. var arrayIntegrityLevel;
  93. if (isArray(key)) {
  94. if (isFrozen(key)) arrayIntegrityLevel = FROZEN;
  95. else if (isSealed(key)) arrayIntegrityLevel = SEALED;
  96. }
  97. nativeSet(this, key, value);
  98. if (arrayIntegrityLevel === FROZEN) freeze(key);
  99. if (arrayIntegrityLevel === SEALED) seal(key);
  100. return this;
  101. }
  102. });
  103. }