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.
		
		
		
		
		
			
		
			
				
					247 lines
				
				9.1 KiB
			
		
		
			
		
	
	
					247 lines
				
				9.1 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								// ECMAScript 6 symbols shim
							 | 
						||
| 
								 | 
							
								var global = require('./_global');
							 | 
						||
| 
								 | 
							
								var has = require('./_has');
							 | 
						||
| 
								 | 
							
								var DESCRIPTORS = require('./_descriptors');
							 | 
						||
| 
								 | 
							
								var $export = require('./_export');
							 | 
						||
| 
								 | 
							
								var redefine = require('./_redefine');
							 | 
						||
| 
								 | 
							
								var META = require('./_meta').KEY;
							 | 
						||
| 
								 | 
							
								var $fails = require('./_fails');
							 | 
						||
| 
								 | 
							
								var shared = require('./_shared');
							 | 
						||
| 
								 | 
							
								var setToStringTag = require('./_set-to-string-tag');
							 | 
						||
| 
								 | 
							
								var uid = require('./_uid');
							 | 
						||
| 
								 | 
							
								var wks = require('./_wks');
							 | 
						||
| 
								 | 
							
								var wksExt = require('./_wks-ext');
							 | 
						||
| 
								 | 
							
								var wksDefine = require('./_wks-define');
							 | 
						||
| 
								 | 
							
								var enumKeys = require('./_enum-keys');
							 | 
						||
| 
								 | 
							
								var isArray = require('./_is-array');
							 | 
						||
| 
								 | 
							
								var anObject = require('./_an-object');
							 | 
						||
| 
								 | 
							
								var isObject = require('./_is-object');
							 | 
						||
| 
								 | 
							
								var toObject = require('./_to-object');
							 | 
						||
| 
								 | 
							
								var toIObject = require('./_to-iobject');
							 | 
						||
| 
								 | 
							
								var toPrimitive = require('./_to-primitive');
							 | 
						||
| 
								 | 
							
								var createDesc = require('./_property-desc');
							 | 
						||
| 
								 | 
							
								var _create = require('./_object-create');
							 | 
						||
| 
								 | 
							
								var gOPNExt = require('./_object-gopn-ext');
							 | 
						||
| 
								 | 
							
								var $GOPD = require('./_object-gopd');
							 | 
						||
| 
								 | 
							
								var $GOPS = require('./_object-gops');
							 | 
						||
| 
								 | 
							
								var $DP = require('./_object-dp');
							 | 
						||
| 
								 | 
							
								var $keys = require('./_object-keys');
							 | 
						||
| 
								 | 
							
								var gOPD = $GOPD.f;
							 | 
						||
| 
								 | 
							
								var dP = $DP.f;
							 | 
						||
| 
								 | 
							
								var gOPN = gOPNExt.f;
							 | 
						||
| 
								 | 
							
								var $Symbol = global.Symbol;
							 | 
						||
| 
								 | 
							
								var $JSON = global.JSON;
							 | 
						||
| 
								 | 
							
								var _stringify = $JSON && $JSON.stringify;
							 | 
						||
| 
								 | 
							
								var PROTOTYPE = 'prototype';
							 | 
						||
| 
								 | 
							
								var HIDDEN = wks('_hidden');
							 | 
						||
| 
								 | 
							
								var TO_PRIMITIVE = wks('toPrimitive');
							 | 
						||
| 
								 | 
							
								var isEnum = {}.propertyIsEnumerable;
							 | 
						||
| 
								 | 
							
								var SymbolRegistry = shared('symbol-registry');
							 | 
						||
| 
								 | 
							
								var AllSymbols = shared('symbols');
							 | 
						||
| 
								 | 
							
								var OPSymbols = shared('op-symbols');
							 | 
						||
| 
								 | 
							
								var ObjectProto = Object[PROTOTYPE];
							 | 
						||
| 
								 | 
							
								var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;
							 | 
						||
| 
								 | 
							
								var QObject = global.QObject;
							 | 
						||
| 
								 | 
							
								// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
							 | 
						||
| 
								 | 
							
								var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
							 | 
						||
| 
								 | 
							
								var setSymbolDesc = DESCRIPTORS && $fails(function () {
							 | 
						||
| 
								 | 
							
								  return _create(dP({}, 'a', {
							 | 
						||
| 
								 | 
							
								    get: function () { return dP(this, 'a', { value: 7 }).a; }
							 | 
						||
| 
								 | 
							
								  })).a != 7;
							 | 
						||
| 
								 | 
							
								}) ? function (it, key, D) {
							 | 
						||
| 
								 | 
							
								  var protoDesc = gOPD(ObjectProto, key);
							 | 
						||
| 
								 | 
							
								  if (protoDesc) delete ObjectProto[key];
							 | 
						||
| 
								 | 
							
								  dP(it, key, D);
							 | 
						||
| 
								 | 
							
								  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
							 | 
						||
| 
								 | 
							
								} : dP;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var wrap = function (tag) {
							 | 
						||
| 
								 | 
							
								  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
							 | 
						||
| 
								 | 
							
								  sym._k = tag;
							 | 
						||
| 
								 | 
							
								  return sym;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
							 | 
						||
| 
								 | 
							
								  return typeof it == 'symbol';
							 | 
						||
| 
								 | 
							
								} : function (it) {
							 | 
						||
| 
								 | 
							
								  return it instanceof $Symbol;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var $defineProperty = function defineProperty(it, key, D) {
							 | 
						||
| 
								 | 
							
								  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
							 | 
						||
| 
								 | 
							
								  anObject(it);
							 | 
						||
| 
								 | 
							
								  key = toPrimitive(key, true);
							 | 
						||
| 
								 | 
							
								  anObject(D);
							 | 
						||
| 
								 | 
							
								  if (has(AllSymbols, key)) {
							 | 
						||
| 
								 | 
							
								    if (!D.enumerable) {
							 | 
						||
| 
								 | 
							
								      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
							 | 
						||
| 
								 | 
							
								      it[HIDDEN][key] = true;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
							 | 
						||
| 
								 | 
							
								      D = _create(D, { enumerable: createDesc(0, false) });
							 | 
						||
| 
								 | 
							
								    } return setSymbolDesc(it, key, D);
							 | 
						||
| 
								 | 
							
								  } return dP(it, key, D);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var $defineProperties = function defineProperties(it, P) {
							 | 
						||
| 
								 | 
							
								  anObject(it);
							 | 
						||
| 
								 | 
							
								  var keys = enumKeys(P = toIObject(P));
							 | 
						||
| 
								 | 
							
								  var i = 0;
							 | 
						||
| 
								 | 
							
								  var l = keys.length;
							 | 
						||
| 
								 | 
							
								  var key;
							 | 
						||
| 
								 | 
							
								  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
							 | 
						||
| 
								 | 
							
								  return it;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var $create = function create(it, P) {
							 | 
						||
| 
								 | 
							
								  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var $propertyIsEnumerable = function propertyIsEnumerable(key) {
							 | 
						||
| 
								 | 
							
								  var E = isEnum.call(this, key = toPrimitive(key, true));
							 | 
						||
| 
								 | 
							
								  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
							 | 
						||
| 
								 | 
							
								  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
							 | 
						||
| 
								 | 
							
								  it = toIObject(it);
							 | 
						||
| 
								 | 
							
								  key = toPrimitive(key, true);
							 | 
						||
| 
								 | 
							
								  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
							 | 
						||
| 
								 | 
							
								  var D = gOPD(it, key);
							 | 
						||
| 
								 | 
							
								  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
							 | 
						||
| 
								 | 
							
								  return D;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var $getOwnPropertyNames = function getOwnPropertyNames(it) {
							 | 
						||
| 
								 | 
							
								  var names = gOPN(toIObject(it));
							 | 
						||
| 
								 | 
							
								  var result = [];
							 | 
						||
| 
								 | 
							
								  var i = 0;
							 | 
						||
| 
								 | 
							
								  var key;
							 | 
						||
| 
								 | 
							
								  while (names.length > i) {
							 | 
						||
| 
								 | 
							
								    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
							 | 
						||
| 
								 | 
							
								  } return result;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
							 | 
						||
| 
								 | 
							
								  var IS_OP = it === ObjectProto;
							 | 
						||
| 
								 | 
							
								  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
							 | 
						||
| 
								 | 
							
								  var result = [];
							 | 
						||
| 
								 | 
							
								  var i = 0;
							 | 
						||
| 
								 | 
							
								  var key;
							 | 
						||
| 
								 | 
							
								  while (names.length > i) {
							 | 
						||
| 
								 | 
							
								    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
							 | 
						||
| 
								 | 
							
								  } return result;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 19.4.1.1 Symbol([description])
							 | 
						||
| 
								 | 
							
								if (!USE_NATIVE) {
							 | 
						||
| 
								 | 
							
								  $Symbol = function Symbol() {
							 | 
						||
| 
								 | 
							
								    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
							 | 
						||
| 
								 | 
							
								    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
							 | 
						||
| 
								 | 
							
								    var $set = function (value) {
							 | 
						||
| 
								 | 
							
								      if (this === ObjectProto) $set.call(OPSymbols, value);
							 | 
						||
| 
								 | 
							
								      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
							 | 
						||
| 
								 | 
							
								      setSymbolDesc(this, tag, createDesc(1, value));
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
							 | 
						||
| 
								 | 
							
								    return wrap(tag);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
							 | 
						||
| 
								 | 
							
								    return this._k;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  $GOPD.f = $getOwnPropertyDescriptor;
							 | 
						||
| 
								 | 
							
								  $DP.f = $defineProperty;
							 | 
						||
| 
								 | 
							
								  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;
							 | 
						||
| 
								 | 
							
								  require('./_object-pie').f = $propertyIsEnumerable;
							 | 
						||
| 
								 | 
							
								  $GOPS.f = $getOwnPropertySymbols;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (DESCRIPTORS && !require('./_library')) {
							 | 
						||
| 
								 | 
							
								    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  wksExt.f = function (name) {
							 | 
						||
| 
								 | 
							
								    return wrap(wks(name));
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								for (var es6Symbols = (
							 | 
						||
| 
								 | 
							
								  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
							 | 
						||
| 
								 | 
							
								  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
							 | 
						||
| 
								 | 
							
								).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
							 | 
						||
| 
								 | 
							
								  // 19.4.2.1 Symbol.for(key)
							 | 
						||
| 
								 | 
							
								  'for': function (key) {
							 | 
						||
| 
								 | 
							
								    return has(SymbolRegistry, key += '')
							 | 
						||
| 
								 | 
							
								      ? SymbolRegistry[key]
							 | 
						||
| 
								 | 
							
								      : SymbolRegistry[key] = $Symbol(key);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  // 19.4.2.5 Symbol.keyFor(sym)
							 | 
						||
| 
								 | 
							
								  keyFor: function keyFor(sym) {
							 | 
						||
| 
								 | 
							
								    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
							 | 
						||
| 
								 | 
							
								    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  useSetter: function () { setter = true; },
							 | 
						||
| 
								 | 
							
								  useSimple: function () { setter = false; }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$export($export.S + $export.F * !USE_NATIVE, 'Object', {
							 | 
						||
| 
								 | 
							
								  // 19.1.2.2 Object.create(O [, Properties])
							 | 
						||
| 
								 | 
							
								  create: $create,
							 | 
						||
| 
								 | 
							
								  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
							 | 
						||
| 
								 | 
							
								  defineProperty: $defineProperty,
							 | 
						||
| 
								 | 
							
								  // 19.1.2.3 Object.defineProperties(O, Properties)
							 | 
						||
| 
								 | 
							
								  defineProperties: $defineProperties,
							 | 
						||
| 
								 | 
							
								  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
							 | 
						||
| 
								 | 
							
								  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
							 | 
						||
| 
								 | 
							
								  // 19.1.2.7 Object.getOwnPropertyNames(O)
							 | 
						||
| 
								 | 
							
								  getOwnPropertyNames: $getOwnPropertyNames,
							 | 
						||
| 
								 | 
							
								  // 19.1.2.8 Object.getOwnPropertySymbols(O)
							 | 
						||
| 
								 | 
							
								  getOwnPropertySymbols: $getOwnPropertySymbols
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
							 | 
						||
| 
								 | 
							
								// https://bugs.chromium.org/p/v8/issues/detail?id=3443
							 | 
						||
| 
								 | 
							
								var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {
							 | 
						||
| 
								 | 
							
								  getOwnPropertySymbols: function getOwnPropertySymbols(it) {
							 | 
						||
| 
								 | 
							
								    return $GOPS.f(toObject(it));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 24.3.2 JSON.stringify(value [, replacer [, space]])
							 | 
						||
| 
								 | 
							
								$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
							 | 
						||
| 
								 | 
							
								  var S = $Symbol();
							 | 
						||
| 
								 | 
							
								  // MS Edge converts symbol values to JSON as {}
							 | 
						||
| 
								 | 
							
								  // WebKit converts symbol values to JSON as null
							 | 
						||
| 
								 | 
							
								  // V8 throws on boxed symbols
							 | 
						||
| 
								 | 
							
								  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
							 | 
						||
| 
								 | 
							
								})), 'JSON', {
							 | 
						||
| 
								 | 
							
								  stringify: function stringify(it) {
							 | 
						||
| 
								 | 
							
								    var args = [it];
							 | 
						||
| 
								 | 
							
								    var i = 1;
							 | 
						||
| 
								 | 
							
								    var replacer, $replacer;
							 | 
						||
| 
								 | 
							
								    while (arguments.length > i) args.push(arguments[i++]);
							 | 
						||
| 
								 | 
							
								    $replacer = replacer = args[1];
							 | 
						||
| 
								 | 
							
								    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
							 | 
						||
| 
								 | 
							
								    if (!isArray(replacer)) replacer = function (key, value) {
							 | 
						||
| 
								 | 
							
								      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
							 | 
						||
| 
								 | 
							
								      if (!isSymbol(value)) return value;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    args[1] = replacer;
							 | 
						||
| 
								 | 
							
								    return _stringify.apply($JSON, args);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
							 | 
						||
| 
								 | 
							
								$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
							 | 
						||
| 
								 | 
							
								// 19.4.3.5 Symbol.prototype[@@toStringTag]
							 | 
						||
| 
								 | 
							
								setToStringTag($Symbol, 'Symbol');
							 | 
						||
| 
								 | 
							
								// 20.2.1.9 Math[@@toStringTag]
							 | 
						||
| 
								 | 
							
								setToStringTag(Math, 'Math', true);
							 | 
						||
| 
								 | 
							
								// 24.3.3 JSON[@@toStringTag]
							 | 
						||
| 
								 | 
							
								setToStringTag(global.JSON, 'JSON', true);
							 |