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
			| 
								 
											3 years ago
										 
									 | 
							
								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
							 | 
						||
| 
								 | 
							
								};
							 |