Skip to content

Commit 82a73da

Browse files
authored
fix(runtime-core): ensure that errors in slot function execution do not affect block tracking (#5670)
fix #5657
1 parent 5ee4053 commit 82a73da

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

Diff for: packages/runtime-core/__tests__/vnode.spec.ts

+26-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import {
88
cloneVNode,
99
mergeProps,
1010
normalizeVNode,
11-
transformVNodeArgs
11+
transformVNodeArgs,
12+
isBlockTreeEnabled
1213
} from '../src/vnode'
1314
import { Data } from '../src/component'
1415
import { ShapeFlags, PatchFlags } from '@vue/shared'
15-
import { h, reactive, isReactive, setBlockTracking, ref } from '../src'
16+
import { h, reactive, isReactive, setBlockTracking, ref, withCtx } from '../src'
1617
import { createApp, nodeOps, serializeInner } from '@vue/runtime-test'
1718
import { setCurrentRenderingInstance } from '../src/componentRenderContext'
1819

@@ -614,6 +615,29 @@ describe('vnode', () => {
614615
]))
615616
expect(vnode.dynamicChildren).toStrictEqual([])
616617
})
618+
// #5657
619+
test('error of slot function execution should not affect block tracking', () => {
620+
expect(isBlockTreeEnabled).toStrictEqual(1)
621+
const slotFn = withCtx(
622+
() => {
623+
throw new Error('slot execution error')
624+
},
625+
{ type: {}, appContext: {} } as any
626+
)
627+
const Parent = {
628+
setup(_: any, { slots }: any) {
629+
return () => {
630+
try {
631+
slots.default()
632+
} catch (e) {}
633+
}
634+
}
635+
}
636+
const vnode =
637+
(openBlock(), createBlock(Parent, null, { default: slotFn }))
638+
createApp(vnode).mount(nodeOps.createElement('div'))
639+
expect(isBlockTreeEnabled).toStrictEqual(1)
640+
})
617641
})
618642

619643
describe('transformVNodeArgs', () => {

Diff for: packages/runtime-core/src/componentRenderContext.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,14 @@ export function withCtx(
8989
setBlockTracking(-1)
9090
}
9191
const prevInstance = setCurrentRenderingInstance(ctx)
92-
const res = fn(...args)
93-
setCurrentRenderingInstance(prevInstance)
94-
if (renderFnWithContext._d) {
95-
setBlockTracking(1)
92+
let res
93+
try {
94+
res = fn(...args)
95+
} finally {
96+
setCurrentRenderingInstance(prevInstance)
97+
if (renderFnWithContext._d) {
98+
setBlockTracking(1)
99+
}
96100
}
97101

98102
if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {

0 commit comments

Comments
 (0)