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;
}