diff --git a/package.json b/package.json index fbb424411..921714921 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "typescript": "4.0.2" }, "dependencies": { - "@handlebars/parser": "^2.0.0", + "@handlebars/parser": "~2.0.0", "@simple-dom/document": "^1.4.0", "@simple-dom/interface": "^1.4.0", "@simple-dom/serializer": "^1.4.0", 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; } diff --git a/yarn.lock b/yarn.lock index 4a3a1f3ea..4e0835ce8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1529,7 +1529,7 @@ resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= -"@handlebars/parser@^2.0.0": +"@handlebars/parser@^2.0.0", "@handlebars/parser@~2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5" integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA==