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
Redo finer-grained inline constant cache invalidation #5716
Redo finer-grained inline constant cache invalidation #5716
Conversation
fce6d41
to
f836cfa
Compare
1f0e3ed
to
546c456
Compare
Some of the symbols had changed names and the script was no longer finding them.
This commit reintroduces finer-grained constant cache invalidation. After 8008fb7 got merged, it was causing issues on token-threaded builds (such as on Windows). The issue was that when you're iterating through instruction sequences and using the translator functions to get back the instruction structs, you're either using `rb_vm_insn_null_translator` or `rb_vm_insn_addr2insn2` depending if it's a direct-threading build. `rb_vm_insn_addr2insn2` does some normalization to always return to you the non-trace version of whatever instruction you're looking at. `rb_vm_insn_null_translator` does not do that normalization. This means that when you're looping through the instructions if you're trying to do an opcode comparison, it can change depending on the type of threading that you're using. This can be very confusing. So, this commit creates a new translator function `rb_vm_insn_normalizing_translator` to always return the non-trace version so that opcode comparisons don't have to worry about different configurations. [Feature #18589]
546c456
to
5b223bf
Compare
begin | ||
Container.private_constant :CONST1, :CONST2 | ||
rescue NameError | ||
end | ||
|
||
const1 |
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.
If :CONST1
and :CONST2
have the positions inverted, const1
in line 108 will return 1
.
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.
Right, CONST2
doesn't exist, so when it's reversed private_constant
raises NameError
before changing the visibility of CONST1
. On Ruby 3.1 private_constant
behaves like this too.
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.
Gotcha. Thank you for the explanation.
@kddnewton @XrXr /cc @tenderlove Can you update |
Brings back the constant invalidation code from https://bugs.ruby-lang.org/issues/18589, now that the underlying BIN comparison bug is fixed by #5741.