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 parsing for typed function reference types #1889

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

takikawa
Copy link
Contributor

@takikawa takikawa commented Apr 4, 2022

Previously an indexed ref type was parsed as a Var, assuming that regular types would be represented as index vars and indexed ref types would be named vars. The names would be resolved to actual indices later in a separate pass.

Unfortunately, it's also possible for a ref type to be an indexed var that overlaps with a type (e.g., the type "any" which is 0x0 and the index 0 for the type (ref 0)).

This patch fixes the issue by returning both a Type and a Var from ParseValueType.

Edit: I simplified this patch to just solve the issue at hand instead of introducing a bigger re-organization, which I realized was a bad idea.

This PR will close #1881.

@takikawa
Copy link
Contributor Author

takikawa commented Apr 4, 2022

Pinging @dbezhetskov in case you have any thoughts on this approach too. :)

Previously an indexed ref type was parsed as a `Var`,
assuming that regular types would be represented as
index vars and named ref types would be named vars.

Unfortunately, it's also possible for a ref type to
be an indexed var that overlaps with a type (e.g.,
the type "any" which is 0x0 and the index 0).

This commit restructures the code so that both a `Type`
and `Var` are returned.
keithw pushed a commit that referenced this pull request Aug 15, 2022
Previously an indexed ref type was parsed as a `Var`,
assuming that regular types would be represented as
index vars and named ref types would be named vars.

Unfortunately, it's also possible for a ref type to
be an indexed var that overlaps with a type (e.g.,
the type "any" which is 0x0 and the index 0).

This commit restructures the code so that both a `Type`
and `Var` are returned.

Closes #1889
keithw pushed a commit that referenced this pull request Aug 15, 2022
Previously an indexed ref type was parsed as a `Var`,
assuming that regular types would be represented as
index vars and named ref types would be named vars.

Unfortunately, it's also possible for a ref type to
be an indexed var that overlaps with a type (e.g.,
the type "any" which is 0x0 and the index 0).

This commit restructures the code so that both a `Type`
and `Var` are returned.

Closes #1889
@sbc100
Copy link
Member

sbc100 commented Aug 15, 2022

I think the idea is that builtin types should all have negative values .. so we know that thing >= to zero is a user type. The fact that we have this internal "Any" think value of zero sounds like a bug.

if (name.is_index()) {
*out_type = Type(Type::Reference, name.index());
} else {
*out_type = Type(Type::Reference, kInvalidIndex);
Copy link
Member

Choose a reason for hiding this comment

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

Should this not be an error?

Var type;
CHECK_RESULT(ParseValueType(&type));
global->type = Type(type.index());
CHECK_RESULT(ParseValueType(&global->type));
Copy link
Member

Choose a reason for hiding this comment

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

I like the simplification we get from have ParseValueType return the Type directly.

@keithw
Copy link
Member

keithw commented Sep 17, 2022

@takikawa Do you have cycles to respond to this review? Would be nice to get this merged (especially as #1661 is blocked on a bug that this fixes).

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.

Type funcref crash due to ref type getting read as "any" type instead of a ref type
3 participants