| var baseSetData = require('./baseSetData'), |
| now = require('../date/now'); |
| |
| /** Used to detect when a function becomes hot. */ |
| var HOT_COUNT = 150, |
| HOT_SPAN = 16; |
| |
| /** |
| * Sets metadata for `func`. |
| * |
| * **Note:** If this function becomes hot, i.e. is invoked a lot in a short |
| * period of time, it will trip its breaker and transition to an identity function |
| * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070) |
| * for more details. |
| * |
| * @private |
| * @param {Function} func The function to associate metadata with. |
| * @param {*} data The metadata. |
| * @returns {Function} Returns `func`. |
| */ |
| var setData = (function() { |
| var count = 0, |
| lastCalled = 0; |
| |
| return function(key, value) { |
| var stamp = now(), |
| remaining = HOT_SPAN - (stamp - lastCalled); |
| |
| lastCalled = stamp; |
| if (remaining > 0) { |
| if (++count >= HOT_COUNT) { |
| return key; |
| } |
| } else { |
| count = 0; |
| } |
| return baseSetData(key, value); |
| }; |
| }()); |
| |
| module.exports = setData; |