Skip to content
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

fix: correctly inspect derived values #9731

Merged
merged 1 commit into from
Dec 1, 2023
Merged

fix: correctly inspect derived values #9731

merged 1 commit into from
Dec 1, 2023

Conversation

Rich-Harris
Copy link
Member

Closes #9728

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.

Tests and linting

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

Copy link

changeset-bot bot commented Nov 30, 2023

🦋 Changeset detected

Latest commit: 6e74c75

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

Copy link

vercel bot commented Nov 30, 2023

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
svelte-5-preview ✅ Ready (Inspect) Visit Preview 💬 Add feedback Nov 30, 2023 8:17pm

Comment on lines +197 to +223
if (DEV) {
return {
// block
b: block,
// consumers
c: null,
// destroy
d: null,
// equals
e: null,
// flags
f: flags,
// init
i: null,
// references
r: null,
// value
v: value,
// context: We can remove this if we get rid of beforeUpdate/afterUpdate
x: null,
// destroy
y: null,
// this is for DEV only
inspect: new Set()
};
}

Copy link
Contributor

Choose a reason for hiding this comment

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

Nit: might be nicer to abstract this to a base_signal const and just add the inspect property, rather than repeating the entire object twice.

i.e.

function create_computation_signal(flags, value, block) {
    const base_signal = {
        // block
        b: block,
        // consumers
        c: null,
        // destroy
        d: null,
        // equals
        e: null,
        // flags
        f: flags,
        // init
        i: null,
        // references
        r: null,
        // value
        v: value,
        // context: We can remove this if we get rid of beforeUpdate/afterUpdate
        x: null,
        // destroy
        y: null
    };

    if (DEV) {
        return {
            ...base_signal,
            // this is for DEV only
            inspect: new Set()
        };
    }
    return base_signal;
}

Same goes for the create_source_signal implementation.

Copy link
Member Author

Choose a reason for hiding this comment

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

My initial thought was to do this...

if (DEV) {
  signal.inspect = ...
}

...but the reason we don't do that is that you're changing the object shape when you do that, which IIUC (though @trueadm is the authority on such things) makes subsequent reads slower.

The spread approach should avoid that problem, though it does mean that you have to create the signal twice. It's not the worst thing in the world since it's only in dev, but ideally dev would resemble prod as closely as is practical. I'll defer to @trueadm on this question.

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah, I think this acceptable.

Comment on lines +197 to +223
if (DEV) {
return {
// block
b: block,
// consumers
c: null,
// destroy
d: null,
// equals
e: null,
// flags
f: flags,
// init
i: null,
// references
r: null,
// value
v: value,
// context: We can remove this if we get rid of beforeUpdate/afterUpdate
x: null,
// destroy
y: null,
// this is for DEV only
inspect: new Set()
};
}

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah, I think this acceptable.

@Rich-Harris Rich-Harris merged commit 765d01d into main Dec 1, 2023
9 checks passed
@Rich-Harris Rich-Harris deleted the gh-9728 branch December 1, 2023 14:42
@github-actions github-actions bot mentioned this pull request Dec 1, 2023
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.

svelte 5: $inspect runs only once on $derived value
3 participants