Skip to content

Commit

Permalink
fix: revert shared static tree cache to avoid memory leak
Browse files Browse the repository at this point in the history
revert f0a66c5
fix #7184
  • Loading branch information
yyx990803 committed Dec 5, 2017
1 parent 0da8bce commit 5875c7c
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 21 deletions.
10 changes: 4 additions & 6 deletions src/compiler/codegen/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,13 @@ export function genElement (el: ASTElement, state: CodegenState): string {
}

// hoist static sub-trees out
function genStatic (el: ASTElement, state: CodegenState, once: ?boolean): string {
function genStatic (el: ASTElement, state: CodegenState): string {
el.staticProcessed = true
state.staticRenderFns.push(`with(this){return ${genElement(el, state)}}`)
return `_m(${
state.staticRenderFns.length - 1
},${
el.staticInFor ? 'true' : 'false'
},${
once ? 'true' : 'false'
}${
el.staticInFor ? ',true' : ''
})`
}

Expand All @@ -121,7 +119,7 @@ function genOnce (el: ASTElement, state: CodegenState): string {
}
return `_o(${genElement(el, state)},${state.onceId++},${key})`
} else {
return genStatic(el, state, true)
return genStatic(el, state)
}
}

Expand Down
20 changes: 7 additions & 13 deletions src/core/instance/render-helpers/render-static.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,9 @@ import { cloneVNode, cloneVNodes } from 'core/vdom/vnode'
*/
export function renderStatic (
index: number,
isInFor: boolean,
isOnce: boolean
isInFor: boolean
): VNode | Array<VNode> {
// render fns generated by compiler < 2.5.4 does not provide v-once
// information to runtime so be conservative
const isOldVersion = arguments.length < 3
// if a static tree is generated by v-once, it is cached on the instance;
// otherwise it is purely static and can be cached on the shared options
// across all instances.
const renderFns = this.$options.staticRenderFns
const cached = isOldVersion || isOnce
? (this._staticTrees || (this._staticTrees = []))
: (renderFns.cached || (renderFns.cached = []))
const cached = this._staticTrees || (this._staticTrees = [])
let tree = cached[index]
// if has already-rendered static tree and not inside v-for,
// we can reuse the same tree by doing a shallow clone.
Expand All @@ -29,7 +19,11 @@ export function renderStatic (
: cloneVNode(tree)
}
// otherwise, render a fresh tree.
tree = cached[index] = renderFns[index].call(this._renderProxy, null, this)
tree = cached[index] = this.$options.staticRenderFns[index].call(
this._renderProxy,
null,
this // for render fns generated for functional component templates
)
markStatic(tree, `__static__${index}`, false)
return tree
}
Expand Down
4 changes: 2 additions & 2 deletions test/unit/modules/compiler/codegen.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ describe('codegen', () => {
// have "inline-template'"
assertCodegen(
'<my-component inline-template><p><span>hello world</span></p></my-component>',
`with(this){return _c('my-component',{inlineTemplate:{render:function(){with(this){return _m(0,false,false)}},staticRenderFns:[function(){with(this){return _c('p',[_c('span',[_v("hello world")])])}}]}})}`
`with(this){return _c('my-component',{inlineTemplate:{render:function(){with(this){return _m(0)}},staticRenderFns:[function(){with(this){return _c('p',[_c('span',[_v("hello world")])])}}]}})}`
)
// "have inline-template attrs, but not having exactly one child element
assertCodegen(
Expand All @@ -498,7 +498,7 @@ describe('codegen', () => {
it('generate static trees inside v-for', () => {
assertCodegen(
`<div><div v-for="i in 10"><p><span></span></p></div></div>`,
`with(this){return _c('div',_l((10),function(i){return _c('div',[_m(0,true,false)])}))}`,
`with(this){return _c('div',_l((10),function(i){return _c('div',[_m(0,true)])}))}`,
[`with(this){return _c('p',[_c('span')])}`]
)
})
Expand Down

0 comments on commit 5875c7c

Please sign in to comment.