You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							54 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							54 lines
						
					
					
						
							1.5 KiB
						
					
					
				var META = require('./_uid')('meta');
 | 
						|
var isObject = require('./_is-object');
 | 
						|
var has = require('./_has');
 | 
						|
var setDesc = require('./_object-dp').f;
 | 
						|
var id = 0;
 | 
						|
var isExtensible = Object.isExtensible || function () {
 | 
						|
  return true;
 | 
						|
};
 | 
						|
var FREEZE = !require('./_fails')(function () {
 | 
						|
  return isExtensible(Object.preventExtensions({}));
 | 
						|
});
 | 
						|
var setMeta = function (it) {
 | 
						|
  setDesc(it, META, { value: {
 | 
						|
    i: 'O' + ++id, // object ID
 | 
						|
    w: {}          // weak collections IDs
 | 
						|
  } });
 | 
						|
};
 | 
						|
var fastKey = function (it, create) {
 | 
						|
  // return primitive with prefix
 | 
						|
  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
 | 
						|
  if (!has(it, META)) {
 | 
						|
    // can't set metadata to uncaught frozen object
 | 
						|
    if (!isExtensible(it)) return 'F';
 | 
						|
    // not necessary to add metadata
 | 
						|
    if (!create) return 'E';
 | 
						|
    // add missing metadata
 | 
						|
    setMeta(it);
 | 
						|
  // return object ID
 | 
						|
  } return it[META].i;
 | 
						|
};
 | 
						|
var getWeak = function (it, create) {
 | 
						|
  if (!has(it, META)) {
 | 
						|
    // can't set metadata to uncaught frozen object
 | 
						|
    if (!isExtensible(it)) return true;
 | 
						|
    // not necessary to add metadata
 | 
						|
    if (!create) return false;
 | 
						|
    // add missing metadata
 | 
						|
    setMeta(it);
 | 
						|
  // return hash weak collections IDs
 | 
						|
  } return it[META].w;
 | 
						|
};
 | 
						|
// add metadata on freeze-family methods calling
 | 
						|
var onFreeze = function (it) {
 | 
						|
  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
 | 
						|
  return it;
 | 
						|
};
 | 
						|
var meta = module.exports = {
 | 
						|
  KEY: META,
 | 
						|
  NEED: false,
 | 
						|
  fastKey: fastKey,
 | 
						|
  getWeak: getWeak,
 | 
						|
  onFreeze: onFreeze
 | 
						|
};
 |