diff --git a/packages/@glimmer/integration-tests/test/managers/modifier-manager-test.ts b/packages/@glimmer/integration-tests/test/managers/modifier-manager-test.ts index 572400eb6..0808f7b62 100644 --- a/packages/@glimmer/integration-tests/test/managers/modifier-manager-test.ts +++ b/packages/@glimmer/integration-tests/test/managers/modifier-manager-test.ts @@ -234,6 +234,52 @@ abstract class ModifierManagerTest extends RenderTest { /You attempted to update `foo` on `.*`, but it had already been used previously in the same computation/ ); } + + @test + 'does not eagerly access arguments during destruction'(assert: Assert) { + class Foo extends CustomModifier {} + + let foo = this.defineModifier(Foo); + + let Main = defineComponent( + { foo }, + '{{#if @state.show}}

hello world

{{/if}}' + ); + + let barCount = 0; + let bazCount = 0; + + class State { + @tracked show = true; + + get bar() { + if (this.show === false) { + barCount++; + } + + return; + } + + get baz() { + if (this.show === false) { + bazCount++; + } + + return; + } + } + + let state = new State(); + + this.renderComponent(Main, { state }); + + state.show = false; + + this.rerender(); + + assert.equal(barCount, 0, 'bar was not accessed during detruction'); + assert.equal(bazCount, 0, 'baz was not accessed during detruction'); + } } class ModifierManagerTest313 extends ModifierManagerTest { diff --git a/packages/@glimmer/manager/lib/public/modifier.ts b/packages/@glimmer/manager/lib/public/modifier.ts index a2a7e4717..18c35539c 100644 --- a/packages/@glimmer/manager/lib/public/modifier.ts +++ b/packages/@glimmer/manager/lib/public/modifier.ts @@ -112,7 +112,8 @@ export class CustomModifierManager let { useArgsProxy, passFactoryToCreate } = delegate.capabilities; - let args = useArgsProxy ? argsProxyFor(capturedArgs, 'modifier') : reifyArgs(capturedArgs); + let argsProxy = argsProxyFor(capturedArgs, 'modifier'); + let args = useArgsProxy ? argsProxy : reifyArgs(capturedArgs); let instance: ModifierInstance; @@ -168,7 +169,7 @@ export class CustomModifierManager state.debugName = typeof definition === 'function' ? definition.name : definition.toString(); } - registerDestructor(state, () => delegate.destroyModifier(instance, state.args)); + registerDestructor(state, () => delegate.destroyModifier(instance, argsProxy)); return state; }