glimmerjs / glimmer-vm

MIT License
1.13k stars 191 forks source link

Some destroyables aren't destroyed #1446

Open swastik opened 1 year ago

swastik commented 1 year ago

I'm not familiar with Glimmer internals, so I'm not sure if this is an issue or if it works as intended, but here's a pretty simple Ember app that inserts 100 divs on click, then clears them out. If I enable destroy tracking, then assert it's all destroyed later, that seems like it doesn't quite happen.

In our actual app, this seems to retain a ton of these destroyables that should (?) be destroyed at this point but aren't for some reason.

https://github.com/glimmerjs/glimmer-vm/assets/1569205/f37af721-fe3e-47cb-bab0-0fbb1c343fe8


Code:

  @tracked items = [];
  @tracked count = 0;

  @action addItems() {
    this.items = [
      ...this.items,
      ...Array(100)
        .fill(0)
        .map((_, i) => i),
    ];
  }

  @action clear() {
    this.items = [];
  }
<div>
  <button
    class="p-2 ml-2 add-items"
    type="button"
    {{on "click" this.addItems}}
  >Add 100 items</button>
  <button
    class="p-2 ml-2 clear"
    type="button"
    {{on "click" this.clear}}
  >Clear</button>
</div>

{{#each this.items as |item|}}
  <div>
    {{item}}
  </div>
{{/each}}
swastik commented 1 year ago

I have a feeling these APIs are intended only for tests, but I'm not seeing everything being destroyed in tests either. 🤔

NullVoxPopuli commented 1 month ago

Do you have an ember test that reproduces the issue? In which ember version?