Add metatable to correctly handle FSO objects #7190
+18
−0
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.
Consider the following script:
This rather unintuitive behaviour is because lua table lookups are by rawequal. As teams, and basically all FSO objects, are userdata, their rawequal check does not call metamethods, and thus does not respect the built-in equality operators for FSO userdata. Instead, userdata is just checked against same instance, which is not the case for the example script.
This PR adds a metatable which changes this by explicitly calling
==instead, overwriting or querying entries that are semantically equal but not rawequal.When using FSO-userdata as table keys, this is almost always the intended behaviour (though with correct design in some circumstances rawequal can suffice as well, but semantically equal would work just as well).
So with this PR, the upper example could be made to work as follows:
Of course, a user could write / paste the entire metatable and not need this PR, but its such a common usecase and footgun that I'd like to include it in our globals.