chain-able
Version:
interfaces that describe their intentions.
60 lines (51 loc) • 5.54 kB
JavaScript
var ObjectProperties = require('./util/props')
var traverse = require('./traverse')
var isObj = require('./is/obj')
var isArray = require('./is/array')
// function gc() {
// if (typeof window !== 'undefined') window.global = window
// if (typeof global.gc === 'function') global.gc()
// }
/**
* @see https://stackoverflow.com/questions/1947995/when-should-i-use-delete-vs-setting-elements-to-null-in-javascript
* @see https://v8project.blogspot.ca/2015/08/getting-garbage-collection-for-free.html
* @see https://github.com/natewatson999/js-gc
* @see https://github.com/siddMahen/node-gc
* @see http://buildnewgames.com/garbage-collector-friendly-code/
* @see https://stackoverflow.com/questions/27597335/ensuring-object-can-be-garbage-collected
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management
*
* @TODO: , blacklist = []
* @TODO: put all GC events into a cached map and debounce the operation
*
* @since 4.0.0
* @desc remove all methods, mark for garbage collection
* @param {Object} obj
* @param {Array<string>} ignore
* @return {void}
*/
function markForGarbageCollection(obj) {
var props = ObjectProperties(obj)
traverse(obj).forEach(function(x) {
var ref = this;
var value = ref.value;
// @NOTE: just delete the main path first, later we can use cleaner
// const shouldIgnore = path
// .map(pathPart => ignore.includes(pathPart))
// .includes(true)
// !shouldIgnore &&
/* istanbul ignore else: safety for bottom up */
// ensure the longest paths in traverser are used...
if (!isArray(value) && !isObj(value)) {
this.remove()
}
})
// simple fast easy cleanup
for (var p = 0; p < props.length; p++) {
delete obj[p]
}
props = undefined
obj = undefined
}
module.exports = markForGarbageCollection
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MuanMiLCJzb3VyY2VzIjpbImdjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IE9iamVjdFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL3V0aWwvcHJvcHMnKVxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCcuL3RyYXZlcnNlJylcbmNvbnN0IGlzT2JqID0gcmVxdWlyZSgnLi9pcy9vYmonKVxuY29uc3QgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXMvYXJyYXknKVxuXG4vLyBmdW5jdGlvbiBnYygpIHtcbi8vICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB3aW5kb3cuZ2xvYmFsID0gd2luZG93XG4vLyAgIGlmICh0eXBlb2YgZ2xvYmFsLmdjID09PSAnZnVuY3Rpb24nKSBnbG9iYWwuZ2MoKVxuLy8gfVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk0Nzk5NS93aGVuLXNob3VsZC1pLXVzZS1kZWxldGUtdnMtc2V0dGluZy1lbGVtZW50cy10by1udWxsLWluLWphdmFzY3JpcHRcbiAqIEBzZWUgaHR0cHM6Ly92OHByb2plY3QuYmxvZ3Nwb3QuY2EvMjAxNS8wOC9nZXR0aW5nLWdhcmJhZ2UtY29sbGVjdGlvbi1mb3ItZnJlZS5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uYXRld2F0c29uOTk5L2pzLWdjXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaWRkTWFoZW4vbm9kZS1nY1xuICogQHNlZSBodHRwOi8vYnVpbGRuZXdnYW1lcy5jb20vZ2FyYmFnZS1jb2xsZWN0b3ItZnJpZW5kbHktY29kZS9cbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjc1OTczMzUvZW5zdXJpbmctb2JqZWN0LWNhbi1iZS1nYXJiYWdlLWNvbGxlY3RlZFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L01lbW9yeV9NYW5hZ2VtZW50XG4gKlxuICogQFRPRE86ICwgYmxhY2tsaXN0ID0gW11cbiAqIEBUT0RPOiBwdXQgYWxsIEdDIGV2ZW50cyBpbnRvIGEgY2FjaGVkIG1hcCBhbmQgZGVib3VuY2UgdGhlIG9wZXJhdGlvblxuICpcbiAqIEBzaW5jZSA0LjAuMFxuICogQGRlc2MgcmVtb3ZlIGFsbCBtZXRob2RzLCBtYXJrIGZvciBnYXJiYWdlIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gaWdub3JlXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb24ob2JqKSB7XG4gIGxldCBwcm9wcyA9IE9iamVjdFByb3BlcnRpZXMob2JqKVxuXG4gIHRyYXZlcnNlKG9iaikuZm9yRWFjaChmdW5jdGlvbih4KSB7XG4gICAgY29uc3Qge3ZhbHVlfSA9IHRoaXNcblxuICAgIC8vIEBOT1RFOiBqdXN0IGRlbGV0ZSB0aGUgbWFpbiBwYXRoIGZpcnN0LCBsYXRlciB3ZSBjYW4gdXNlIGNsZWFuZXJcbiAgICAvLyBjb25zdCBzaG91bGRJZ25vcmUgPSBwYXRoXG4gICAgLy8gICAubWFwKHBhdGhQYXJ0ID0+IGlnbm9yZS5pbmNsdWRlcyhwYXRoUGFydCkpXG4gICAgLy8gICAuaW5jbHVkZXModHJ1ZSlcbiAgICAvLyAgICFzaG91bGRJZ25vcmUgJiZcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBzYWZldHkgZm9yIGJvdHRvbSB1cCAqL1xuICAgIC8vIGVuc3VyZSB0aGUgbG9uZ2VzdCBwYXRocyBpbiB0cmF2ZXJzZXIgYXJlIHVzZWQuLi5cbiAgICBpZiAoIWlzQXJyYXkodmFsdWUpICYmICFpc09iaih2YWx1ZSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlKClcbiAgICB9XG4gIH0pXG5cbiAgLy8gc2ltcGxlIGZhc3QgZWFzeSBjbGVhbnVwXG4gIGZvciAobGV0IHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHtcbiAgICBkZWxldGUgb2JqW3BdXG4gIH1cblxuICBwcm9wcyA9IHVuZGVmaW5lZFxuICBvYmogPSB1bmRlZmluZWRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb25cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ2hEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDdENBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNqQ0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJyQyxTQUFTLHdCQUF3QixDQUFDLEdBQUcsRUFBRTtFQUNyQ0MsR0FBRyxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7O0VBRWpDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7SUFDaEMsQUFBSyxBQUFRLE9BQUEsR0FBRyxJQUFJO0lBQWIsSUFBQSxLQUFLLGFBQU4sQUFBTSxBQUFROzs7Ozs7Ozs7O0lBVXBCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7TUFDcEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtLQUNkO0dBQ0YsQ0FBQzs7O0VBR0YsS0FBS0EsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDckMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0dBQ2Q7O0VBRUQsS0FBSyxHQUFHLFNBQVM7RUFDakIsR0FBRyxHQUFHLFNBQVM7Q0FDaEI7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyx3QkFBd0I7In0=