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.
49 lines
1.5 KiB
49 lines
1.5 KiB
// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` |
|
require('../modules/es.map'); |
|
require('../modules/es.weak-map'); |
|
var getBuiltIn = require('../internals/get-built-in'); |
|
var create = require('../internals/object-create'); |
|
var isObject = require('../internals/is-object'); |
|
|
|
var $Object = Object; |
|
var $TypeError = TypeError; |
|
var Map = getBuiltIn('Map'); |
|
var WeakMap = getBuiltIn('WeakMap'); |
|
|
|
var Node = function () { |
|
// keys |
|
this.object = null; |
|
this.symbol = null; |
|
// child nodes |
|
this.primitives = null; |
|
this.objectsByIndex = create(null); |
|
}; |
|
|
|
Node.prototype.get = function (key, initializer) { |
|
return this[key] || (this[key] = initializer()); |
|
}; |
|
|
|
Node.prototype.next = function (i, it, IS_OBJECT) { |
|
var store = IS_OBJECT |
|
? this.objectsByIndex[i] || (this.objectsByIndex[i] = new WeakMap()) |
|
: this.primitives || (this.primitives = new Map()); |
|
var entry = store.get(it); |
|
if (!entry) store.set(it, entry = new Node()); |
|
return entry; |
|
}; |
|
|
|
var root = new Node(); |
|
|
|
module.exports = function () { |
|
var active = root; |
|
var length = arguments.length; |
|
var i, it; |
|
// for prevent leaking, start from objects |
|
for (i = 0; i < length; i++) { |
|
if (isObject(it = arguments[i])) active = active.next(i, it, true); |
|
} |
|
if (this === $Object && active === root) throw $TypeError('Composite keys must contain a non-primitive component'); |
|
for (i = 0; i < length; i++) { |
|
if (!isObject(it = arguments[i])) active = active.next(i, it, false); |
|
} return active; |
|
};
|
|
|