-
Notifications
You must be signed in to change notification settings - Fork 700
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
base: main
Are you sure you want to change the base?
Conversation
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.
fcc7e47
to
083e716
Compare
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
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
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); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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.
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 aVar
fromParseValueType
.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.