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==