1 var $ = require('../internals/export');
2 var uncurryThis = require('../internals/function-uncurry-this');
3 var hiddenKeys = require('../internals/hidden-keys');
4 var isObject = require('../internals/is-object');
5 var hasOwn = require('../internals/has-own-property');
6 var defineProperty = require('../internals/object-define-property').f;
7 var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');
8 var getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');
9 var isExtensible = require('../internals/object-is-extensible');
10 var uid = require('../internals/uid');
11 var FREEZING = require('../internals/freezing');
14 var METADATA = uid('meta');
17 var setMetadata = function (it) {
18 defineProperty(it, METADATA, { value: {
19 objectID: 'O' + id++, // object ID
20 weakData: {} // weak collections IDs
24 var fastKey = function (it, create) {
25 // return a primitive with prefix
26 if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
27 if (!hasOwn(it, METADATA)) {
28 // can't set metadata to uncaught frozen object
29 if (!isExtensible(it)) return 'F';
30 // not necessary to add metadata
31 if (!create) return 'E';
32 // add missing metadata
35 } return it[METADATA].objectID;
38 var getWeakData = function (it, create) {
39 if (!hasOwn(it, METADATA)) {
40 // can't set metadata to uncaught frozen object
41 if (!isExtensible(it)) return true;
42 // not necessary to add metadata
43 if (!create) return false;
44 // add missing metadata
46 // return the store of weak collections IDs
47 } return it[METADATA].weakData;
50 // add metadata on freeze-family methods calling
51 var onFreeze = function (it) {
52 if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);
56 var enable = function () {
57 meta.enable = function () { /* empty */ };
59 var getOwnPropertyNames = getOwnPropertyNamesModule.f;
60 var splice = uncurryThis([].splice);
64 // prevent exposing of metadata key
65 if (getOwnPropertyNames(test).length) {
66 getOwnPropertyNamesModule.f = function (it) {
67 var result = getOwnPropertyNames(it);
68 for (var i = 0, length = result.length; i < length; i++) {
69 if (result[i] === METADATA) {
76 $({ target: 'Object', stat: true, forced: true }, {
77 getOwnPropertyNames: getOwnPropertyNamesExternalModule.f
82 var meta = module.exports = {
85 getWeakData: getWeakData,
89 hiddenKeys[METADATA] = true;