esnext.weak-map.get-or-insert-computed.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. 'use strict';
  2. var $ = require('../internals/export');
  3. var aCallable = require('../internals/a-callable');
  4. var aWeakMap = require('../internals/a-weak-map');
  5. var aWeakKey = require('../internals/a-weak-key');
  6. var WeakMapHelpers = require('../internals/weak-map-helpers');
  7. var IS_PURE = require('../internals/is-pure');
  8. var get = WeakMapHelpers.get;
  9. var has = WeakMapHelpers.has;
  10. var set = WeakMapHelpers.set;
  11. var FORCED = IS_PURE || !function () {
  12. try {
  13. // eslint-disable-next-line es/no-weak-map, no-throw-literal -- testing
  14. if (WeakMap.prototype.getOrInsertComputed) new WeakMap().getOrInsertComputed(1, function () { throw 1; });
  15. } catch (error) {
  16. // FF144 Nightly - Beta 3 bug
  17. // https://bugzilla.mozilla.org/show_bug.cgi?id=1988369
  18. return error instanceof TypeError;
  19. }
  20. }();
  21. // `WeakMap.prototype.getOrInsertComputed` method
  22. // https://github.com/tc39/proposal-upsert
  23. $({ target: 'WeakMap', proto: true, real: true, forced: FORCED }, {
  24. getOrInsertComputed: function getOrInsertComputed(key, callbackfn) {
  25. aWeakMap(this);
  26. aWeakKey(key);
  27. aCallable(callbackfn);
  28. if (has(this, key)) return get(this, key);
  29. var value = callbackfn(key);
  30. set(this, key, value);
  31. return value;
  32. }
  33. });