Skip to content

fix: don't try to add owners to non-$state class fields #14533

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 3, 2024

Conversation

dummdidumm
Copy link
Member

$state.raw and $derived(.by) will not have a state symbol on them, potentially causing a disastrous amount of traversal to potentially not find any state symbol. So it's better to not traverse them.

Potentially someone could create a $state while creating $state.raw or inside a $derived.by, but that feels so much of an edge case that it doesn't warrant a perf hit for the common case.

Fixes #14491

Before submitting the PR, please make sure you do the following

  • It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
  • Prefix your PR title with feat:, fix:, chore:, or docs:.
  • This message body should clearly illustrate what problems it solves.
  • Ideally, include a test that fails without this PR but passes with it.
  • If this PR changes code within packages/svelte/src, add a changeset (npx changeset).

Tests and linting

  • Run the tests with pnpm test and lint the project with pnpm lint

`$state.raw` and `$derived(.by)` will not have a state symbol on them, potentially causing a disastrous amount of traversal to potentially not find any state symbol. So it's better to not traverse them.

Potentially someone could create a `$state` while creating `$state.raw` or inside a `$derived.by`, but that feels so much of an edge case that it doesn't warrant a perf hit for the common case.

Fixes #14491
Copy link

changeset-bot bot commented Dec 3, 2024

🦋 Changeset detected

Latest commit: 3546645

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
svelte Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@Rich-Harris
Copy link
Member

preview: https://svelte-dev-git-preview-svelte-14533-svelte.vercel.app/

this is an automated message

Copy link
Contributor

github-actions bot commented Dec 3, 2024

Playground

pnpm add https://pkg.pr.new/svelte@14533

@dummdidumm
Copy link
Member Author

dummdidumm commented Dec 3, 2024

The same optimization could likely be applied inside component.js for bindings - check if this is definitely a $state.raw or $derived.by and skip it in that case.
Edit: Done that.

Copy link
Contributor

@trueadm trueadm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doh this is such an obvious fix on reflection, nice one finding it!

@Rich-Harris Rich-Harris merged commit bbee1fc into main Dec 3, 2024
11 checks passed
@Rich-Harris Rich-Harris deleted the ownership-perf branch December 3, 2024 22:24
@github-actions github-actions bot mentioned this pull request Dec 3, 2024
dummdidumm added a commit that referenced this pull request Jan 31, 2025
- `$derived` can contain `$state` declarations so we cannot ignore them, so this reverts #14533
- instead, we add equality checks to not do this expensive work unnecessarily
- this also adds a render effect similar to the class ownership addition when it detects a getter on a POJO during ownership addition

fixes #15164
dummdidumm added a commit that referenced this pull request Jan 31, 2025
- `$derived` can contain `$state` declarations so we cannot ignore them, so this reverts #14533
- instead, we add equality checks to not do this expensive work unnecessarily
- this also adds a render effect similar to the class ownership addition when it detects a getter on a POJO during ownership addition

fixes #15164
dummdidumm added a commit that referenced this pull request Feb 11, 2025
- `$derived` can contain `$state` declarations so we cannot ignore them, so this reverts #14533
- instead, we add equality checks to not do this expensive work unnecessarily
- this also adds a render effect similar to the class ownership addition when it detects a getter on a POJO during ownership addition

fixes #15164
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Performance issue with contexts using $derived in pair with array operations (dev mode only)
3 participants