mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-04-20 00:18:53 +03:00
libghostty: Action CValue should be untagged extern union
Fixes #6962 I believe this is an upstream bug (https://github.com/ziglang/zig/issues/23454), where Zig is allowing extern unions to be tagged when created via type reification. This results in a CValue that has an extra trailing byte (the tag). This wasn't causing any noticeable issues for Ghostty for some reason but others using our pattern were seeing issues. And I did confirm that our CValue was indeed tagged and was the wrong byte size. I assume Swift was just ignoring it because it was extra data. I don't know, but we should fix this in general for libghostty.
This commit is contained in:
@ -311,7 +311,7 @@ pub const Action = union(Key) {
|
|||||||
|
|
||||||
break :cvalue @Type(.{ .@"union" = .{
|
break :cvalue @Type(.{ .@"union" = .{
|
||||||
.layout = .@"extern",
|
.layout = .@"extern",
|
||||||
.tag_type = Key,
|
.tag_type = null,
|
||||||
.fields = &union_fields,
|
.fields = &union_fields,
|
||||||
.decls = &.{},
|
.decls = &.{},
|
||||||
} });
|
} });
|
||||||
@ -323,6 +323,13 @@ pub const Action = union(Key) {
|
|||||||
value: CValue,
|
value: CValue,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
comptime {
|
||||||
|
// For ABI compatibility, we expect that this is our union size.
|
||||||
|
// At the time of writing, we don't promise ABI compatibility
|
||||||
|
// so we can change this but I want to be aware of it.
|
||||||
|
assert(@sizeOf(CValue) == 16);
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the value type for the given key.
|
/// Returns the value type for the given key.
|
||||||
pub fn Value(comptime key: Key) type {
|
pub fn Value(comptime key: Key) type {
|
||||||
inline for (@typeInfo(Action).@"union".fields) |field| {
|
inline for (@typeInfo(Action).@"union".fields) |field| {
|
||||||
|
Reference in New Issue
Block a user