Skip to content

fix: restore the Equals/GetHashCode contract on B2Vec2 - #95

Merged
ikpil merged 1 commit into
mainfrom
pr/align-followup
Aug 11, 2026
Merged

fix: restore the Equals/GetHashCode contract on B2Vec2#95
ikpil merged 1 commit into
mainfrom
pr/align-followup

Conversation

@ikpil

@ikpil ikpil commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Moving operator== to an IEEE compare was the right call, it matches C. But Equals just forwarded to the operator, so a NaN vector stopped being equal to itself and stopped agreeing with GetHashCode. That breaks Dictionary<B2Vec2, _>. Keep the operator on IEEE semantics and compare bitwise in Equals.

While here:

  • b2World_Draw takes the debug draw by in. C passes b2DebugDraw*, and the struct has 27 fields, so it was copied every frame.
  • b2GrowBitSet guards its copy the way b2CreateBitSet already guards the fill. Growing a bit set created with zero capacity threw, because b2Alloc hands back null there.
  • b2ClearBit takes an int like the other three, so the call sites drop their casts.
  • b2InternalAssert is public. It is B2_API upstream.

Moving operator== to an IEEE compare was the right call, it matches C.
But Equals just forwarded to the operator, so a NaN vector stopped being
equal to itself and stopped agreeing with GetHashCode. That breaks
Dictionary<B2Vec2, _>. Keep the operator on IEEE semantics and compare
bitwise in Equals.

While here:

- b2World_Draw takes the debug draw by in. C passes b2DebugDraw*, and
  the struct has 27 fields, so it was copied every frame.
- b2GrowBitSet guards its copy the way b2CreateBitSet already guards the
  fill. Growing a bit set created with zero capacity threw, because
  b2Alloc hands back null there.
- b2ClearBit takes an int like the other three, so the call sites drop
  their casts.
- b2InternalAssert is public. It is B2_API upstream.
@ikpil
ikpil merged commit 36d5c96 into main Aug 11, 2026
10 checks passed
@ikpil
ikpil deleted the pr/align-followup branch August 11, 2026 16:46
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.

1 participant