foop
Version:
interfaces that describe their intentions.
82 lines (74 loc) • 6.76 kB
JavaScript
var ObjectProperties = require('../util/props')
var traverse = require('../traverse')
var isObj = require('../is/obj')
var isArray = require('../is/array')
var keys = require('../util/keysObjOrArray')
// function gc() {
// if (typeof window !== 'undefined') window.global = window
// if (typeof global.gc === 'function') global.gc()
// }
/**
* @since 4.0.0
* @desc remove all methods, mark for garbage collection
*
* @param {Object} obj object to traverse and clear
* @return {void}
*
* @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 = [] param
* @TODO put all GC events into a cached map and debounce the operation
*
* @example
*
* var scoped = {}
* var ref = () => scoped
* var obj = {scoped, ref, eh: true}
*
* markForGarbageCollection(obj)
* //=> void
*
* obj
* //=> undefined|{}
*
*/
function markForGarbageCollection(obj) {
// @TODO: ArrayOrObj loop... like tons of libs do...
// let props = isObj(obj) ? ObjectProperties(obj) : obj //isArray(obj) ? obj
var props = keys(obj)
for (var p = 0; p < props.length; p++) {
if (isObj(obj[p])) {
markForGarbageCollection(obj[p])
}
delete obj[p]
}
// traverse(obj).forEach(function(x) {
// const {value} = this
//
// // @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 (let p = 0; p < props.length; p++) {
// delete obj[p]
// }
props = undefined
obj = undefined
}
module.exports = markForGarbageCollection
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MuanMiLCJzb3VyY2VzIjpbImdjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IE9iamVjdFByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi91dGlsL3Byb3BzJylcbmNvbnN0IHRyYXZlcnNlID0gcmVxdWlyZSgnLi4vdHJhdmVyc2UnKVxuY29uc3QgaXNPYmogPSByZXF1aXJlKCcuLi9pcy9vYmonKVxuY29uc3QgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2lzL2FycmF5JylcbmNvbnN0IGtleXMgPSByZXF1aXJlKCcuLi91dGlsL2tleXNPYmpPckFycmF5JylcblxuLy8gZnVuY3Rpb24gZ2MoKSB7XG4vLyAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgd2luZG93Lmdsb2JhbCA9IHdpbmRvd1xuLy8gICBpZiAodHlwZW9mIGdsb2JhbC5nYyA9PT0gJ2Z1bmN0aW9uJykgZ2xvYmFsLmdjKClcbi8vIH1cblxuLyoqXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBkZXNjIHJlbW92ZSBhbGwgbWV0aG9kcywgbWFyayBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBvYmplY3QgdG8gdHJhdmVyc2UgYW5kIGNsZWFyXG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk0Nzk5NS93aGVuLXNob3VsZC1pLXVzZS1kZWxldGUtdnMtc2V0dGluZy1lbGVtZW50cy10by1udWxsLWluLWphdmFzY3JpcHRcbiAqIEBzZWUgaHR0cHM6Ly92OHByb2plY3QuYmxvZ3Nwb3QuY2EvMjAxNS8wOC9nZXR0aW5nLWdhcmJhZ2UtY29sbGVjdGlvbi1mb3ItZnJlZS5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uYXRld2F0c29uOTk5L2pzLWdjXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaWRkTWFoZW4vbm9kZS1nY1xuICogQHNlZSBodHRwOi8vYnVpbGRuZXdnYW1lcy5jb20vZ2FyYmFnZS1jb2xsZWN0b3ItZnJpZW5kbHktY29kZS9cbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjc1OTczMzUvZW5zdXJpbmctb2JqZWN0LWNhbi1iZS1nYXJiYWdlLWNvbGxlY3RlZFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L01lbW9yeV9NYW5hZ2VtZW50XG4gKlxuICogQFRPRE8gYmxhY2tsaXN0ID0gW10gcGFyYW1cbiAqIEBUT0RPIHB1dCBhbGwgR0MgZXZlbnRzIGludG8gYSBjYWNoZWQgbWFwIGFuZCBkZWJvdW5jZSB0aGUgb3BlcmF0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgdmFyIHNjb3BlZCA9IHt9XG4gKiAgdmFyIHJlZiA9ICgpID0+IHNjb3BlZFxuICogIHZhciBvYmogPSB7c2NvcGVkLCByZWYsIGVoOiB0cnVlfVxuICpcbiAqICBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb24ob2JqKVxuICogIC8vPT4gdm9pZFxuICpcbiAqICBvYmpcbiAqICAvLz0+IHVuZGVmaW5lZHx7fVxuICpcbiAqL1xuZnVuY3Rpb24gbWFya0ZvckdhcmJhZ2VDb2xsZWN0aW9uKG9iaikge1xuICAvLyBAVE9ETzogQXJyYXlPck9iaiBsb29wLi4uIGxpa2UgdG9ucyBvZiBsaWJzIGRvLi4uXG4gIC8vIGxldCBwcm9wcyA9IGlzT2JqKG9iaikgPyBPYmplY3RQcm9wZXJ0aWVzKG9iaikgOiBvYmogLy9pc0FycmF5KG9iaikgPyBvYmpcbiAgbGV0IHByb3BzID0ga2V5cyhvYmopXG5cbiAgZm9yIChsZXQgcCA9IDA7IHAgPCBwcm9wcy5sZW5ndGg7IHArKykge1xuICAgIGlmIChpc09iaihvYmpbcF0pKSB7XG4gICAgICBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb24ob2JqW3BdKVxuICAgIH1cbiAgICBkZWxldGUgb2JqW3BdXG4gIH1cblxuICAvLyB0cmF2ZXJzZShvYmopLmZvckVhY2goZnVuY3Rpb24oeCkge1xuICAvLyAgIGNvbnN0IHt2YWx1ZX0gPSB0aGlzXG4gIC8vXG4gIC8vICAgLy8gQE5PVEU6IGp1c3QgZGVsZXRlIHRoZSBtYWluIHBhdGggZmlyc3QsIGxhdGVyIHdlIGNhbiB1c2UgY2xlYW5lclxuICAvLyAgIC8vIGNvbnN0IHNob3VsZElnbm9yZSA9IHBhdGhcbiAgLy8gICAvLyAgIC5tYXAocGF0aFBhcnQgPT4gaWdub3JlLmluY2x1ZGVzKHBhdGhQYXJ0KSlcbiAgLy8gICAvLyAgIC5pbmNsdWRlcyh0cnVlKVxuICAvLyAgIC8vICAgIXNob3VsZElnbm9yZSAmJlxuICAvL1xuICAvLyAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBzYWZldHkgZm9yIGJvdHRvbSB1cCAqL1xuICAvLyAgIC8vIGVuc3VyZSB0aGUgbG9uZ2VzdCBwYXRocyBpbiB0cmF2ZXJzZXIgYXJlIHVzZWQuLi5cbiAgLy8gICBpZiAoIWlzQXJyYXkodmFsdWUpICYmICFpc09iaih2YWx1ZSkpIHtcbiAgLy8gICAgIHRoaXMucmVtb3ZlKClcbiAgLy8gICB9XG4gIC8vIH0pXG5cbiAgLy8gc2ltcGxlIGZhc3QgZWFzeSBjbGVhbnVwXG4gIC8vIGZvciAobGV0IHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHtcbiAgLy8gICBkZWxldGUgb2JqW3BdXG4gIC8vIH1cblxuICBwcm9wcyA9IHVuZGVmaW5lZFxuICBvYmogPSB1bmRlZmluZWRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb25cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO0FBQ2pEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdkNBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNsQ0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3RDQSxHQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQzlDLFNBQVMsd0JBQXdCLENBQUMsR0FBRyxFQUFFOzs7RUFHckNDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQzs7RUFFckIsS0FBS0EsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDckMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDakIsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pDO0lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0dBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJELEtBQUssR0FBRyxTQUFTO0VBQ2pCLEdBQUcsR0FBRyxTQUFTO0NBQ2hCOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsd0JBQXdCOyJ9