Calculate item hash only if needed #4687
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes a stackoverflow with SilentGear.
The problem is that SilentGear has a complicated parts system and to get the damage value of an
ItemStack
it first constructs the relevantPartInstance
, which involves defensively copying theItemStack
before storing it in the newPartInstance
. Copying anItemStack
of course triggers our hash calculation in the constructor run for the copy, we query the damage value of the new stack, and the cycle repeats.With this change we only calculate the hash once we actually need it (and if the hash happens to be 0 we do so every time it is needed).
An alternative would be to try copying the hash from the old stack to the new one, though given the Mixin hackery this would require I'm not sure whether that would actually be better. (Need to redirect the relevant constructor call and probably also need a
ThreadLocal
to pass the hash)Testing: TBD
Fixes #4538