[Embedder API] Lock nested structs for ABI stability #40069
Merged
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.
Part of flutter/flutter#121176
Fixes flutter/flutter#121347
Background
Imagine the following change:
Bad change...
typedef struct { /// The size of this struct. Must be sizeof(A). size_t struct_size; int one; + int two; } A; typedef struct { /// The size of this struct. Must be sizeof(B). size_t struct_size; A a; int three; } B;
Adding a member to struct
A
would change the memory layout of structB
; this breaks ABI compatibility. The structs'struct_size
does not protect against this ABI break. Instead, structB
should've nested structA
by pointer:Good change...
typedef struct { /// The size of this struct. Must be sizeof(A). size_t struct_size; int one; + int two; } A; typedef struct { /// The size of this struct. Must be sizeof(B). size_t struct_size; A* a; int three; } B;
This problem affects the following structs:
FlutterTransformation
- Would breakFlutterSemanticsNode
hereFlutterRect
- Would breakFlutterSemanticsNode
here. Also,FlutterDamage
is affected by the "array of structs" problem hereFlutterPoint
would breakFlutterLayer
hereFlutterDamage
- Would breakFlutterPresentInfo
hereI did not include the following nested structs as adding members to them does not seem to introduce any ABI issues:
FlutterSize
FlutterUIntSize
FlutterRoundedRect
Pre-launch Checklist
///
).If you need help, consider asking for advice on the #hackers-new channel on Discord.