| 2233 | /* */ |
| 2234 | |
| 2235 | function mergeVNodeHook (def, hookKey, hook) { |
| 2236 | if (def instanceof VNode) { |
| 2237 | def = def.data.hook || (def.data.hook = {}); |
| 2238 | } |
| 2239 | var invoker; |
| 2240 | var oldHook = def[hookKey]; |
| 2241 | |
| 2242 | function wrappedHook () { |
| 2243 | hook.apply(this, arguments); |
| 2244 | // important: remove merged hook to ensure it's called only once |
| 2245 | // and prevent memory leak |
| 2246 | remove(invoker.fns, wrappedHook); |
| 2247 | } |
| 2248 | |
| 2249 | if (isUndef(oldHook)) { |
| 2250 | // no existing hook |
| 2251 | invoker = createFnInvoker([wrappedHook]); |
| 2252 | } else { |
| 2253 | /* istanbul ignore if */ |
| 2254 | if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { |
| 2255 | // already a merged invoker |
| 2256 | invoker = oldHook; |
| 2257 | invoker.fns.push(wrappedHook); |
| 2258 | } else { |
| 2259 | // existing plain hook |
| 2260 | invoker = createFnInvoker([oldHook, wrappedHook]); |
| 2261 | } |
| 2262 | } |
| 2263 | |
| 2264 | invoker.merged = true; |
| 2265 | def[hookKey] = invoker; |
| 2266 | } |
| 2267 | |
| 2268 | /* */ |
| 2269 | |