@zigc/lib 0.17.0-dev.633 → 0.17.0-dev.657
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compiler/Maker/PkgConfig.zig +1 -0
- package/compiler/Maker/ScannedConfig.zig +4 -3
- package/compiler/Maker/Step/Compile.zig +1 -3
- package/compiler/Maker/Step/FindProgram.zig +2 -2
- package/compiler/Maker/Step/Run.zig +18 -3
- package/compiler/Maker/Step/TranslateC.zig +5 -4
- package/compiler/Maker/Watch/FsEvents.zig +3 -2
- package/compiler/aro/aro/Attribute.zig +52 -51
- package/compiler/aro/aro/Compilation.zig +5 -5
- package/compiler/aro/aro/Diagnostics.zig +7 -7
- package/compiler/aro/aro/Parser.zig +2 -2
- package/compiler/aro/aro/Tree.zig +11 -11
- package/compiler/aro/aro/features.zig +4 -4
- package/compiler/aro/aro/text_literal.zig +2 -2
- package/compiler/aro/backend/Interner.zig +14 -13
- package/compiler/configurer.zig +2 -2
- package/compiler/resinator/bmp.zig +3 -2
- package/compiler/resinator/code_pages.zig +14 -12
- package/compiler/resinator/cvtres.zig +11 -10
- package/compiler/resinator/errors.zig +18 -22
- package/compiler/resinator/lang.zig +7 -7
- package/compiler/resinator/parse.zig +1 -1
- package/compiler/translate-c/ast.zig +6 -6
- package/docs/wasm/markdown/Document.zig +3 -3
- package/docs/wasm/markdown/Parser.zig +3 -3
- package/package.json +1 -1
- package/std/Build/Cache.zig +2 -2
- package/std/Build/Configuration.zig +88 -37
- package/std/Build/Step/ConfigHeader.zig +3 -2
- package/std/Build/Step/Options.zig +28 -22
- package/std/Build.zig +85 -56
- package/std/Io/Kqueue.zig +2 -2
- package/std/Io/Reader.zig +1 -1
- package/std/Io/Threaded.zig +18 -15
- package/std/Io/Uring.zig +4 -2
- package/std/Io/Writer.zig +18 -18
- package/std/Io/net.zig +3 -1
- package/std/Io.zig +7 -6
- package/std/Progress.zig +2 -2
- package/std/Target/aarch64.zig +2 -2
- package/std/Target/alpha.zig +2 -2
- package/std/Target/amdgcn.zig +2 -2
- package/std/Target/arc.zig +2 -2
- package/std/Target/arm.zig +2 -2
- package/std/Target/avr.zig +2 -2
- package/std/Target/bpf.zig +2 -2
- package/std/Target/csky.zig +2 -2
- package/std/Target/hexagon.zig +2 -2
- package/std/Target/hppa.zig +2 -2
- package/std/Target/kvx.zig +2 -2
- package/std/Target/lanai.zig +2 -2
- package/std/Target/loongarch.zig +2 -2
- package/std/Target/m68k.zig +2 -2
- package/std/Target/mips.zig +2 -2
- package/std/Target/msp430.zig +2 -2
- package/std/Target/nvptx.zig +2 -2
- package/std/Target/powerpc.zig +2 -2
- package/std/Target/propeller.zig +2 -2
- package/std/Target/riscv.zig +2 -2
- package/std/Target/s390x.zig +2 -2
- package/std/Target/sparc.zig +2 -2
- package/std/Target/spirv.zig +2 -2
- package/std/Target/ve.zig +2 -2
- package/std/Target/wasm.zig +2 -2
- package/std/Target/x86.zig +2 -2
- package/std/Target/xcore.zig +2 -2
- package/std/Target/xtensa.zig +2 -2
- package/std/Target.zig +4 -4
- package/std/c/darwin.zig +1 -1
- package/std/coff.zig +1 -1
- package/std/crypto/codecs/asn1/Oid.zig +8 -8
- package/std/crypto/codecs/asn1/der/Decoder.zig +7 -7
- package/std/crypto/codecs/asn1/der/Encoder.zig +10 -8
- package/std/crypto/phc_encoding.zig +23 -20
- package/std/crypto/timing_safe.zig +1 -1
- package/std/crypto/tls/Client.zig +3 -3
- package/std/crypto/tls.zig +1 -1
- package/std/debug/Dwarf/Unwind/VirtualMachine.zig +11 -5
- package/std/debug/ElfFile.zig +12 -8
- package/std/debug/MachOFile.zig +2 -2
- package/std/debug/SelfInfo/MachO.zig +2 -2
- package/std/debug/SelfInfo/Windows.zig +2 -2
- package/std/elf.zig +7 -7
- package/std/enums.zig +66 -67
- package/std/gpu.zig +1 -1
- package/std/hash/auto_hash.zig +8 -8
- package/std/hash/verify.zig +3 -3
- package/std/http/Client.zig +2 -2
- package/std/json/Stringify.zig +14 -14
- package/std/json/static.zig +47 -31
- package/std/lang.zig +65 -97
- package/std/math.zig +2 -2
- package/std/mem/Allocator.zig +9 -9
- package/std/mem.zig +86 -102
- package/std/meta/trailer_flags.zig +26 -19
- package/std/meta.zig +131 -171
- package/std/multi_array_list.zig +49 -57
- package/std/os/uefi/protocol/device_path.zig +8 -7
- package/std/os/uefi/tables/boot_services.zig +1 -1
- package/std/os/windows.zig +9 -15
- package/std/start.zig +6 -6
- package/std/testing/Smith.zig +35 -21
- package/std/testing.zig +15 -15
- package/std/zig/Ast.zig +4 -4
- package/std/zig/AstGen.zig +42 -42
- package/std/zig/ErrorBundle.zig +16 -13
- package/std/zig/LibCInstallation.zig +11 -11
- package/std/zig/Parse.zig +6 -6
- package/std/zig/Zir.zig +10 -10
- package/std/zig/c_translation/helpers.zig +2 -2
- package/std/zig/llvm/BitcodeReader.zig +3 -3
- package/std/zig/llvm/Builder.zig +124 -93
- package/std/zig/llvm/bitcode_writer.zig +4 -4
- package/std/zig/system/windows.zig +11 -11
- package/std/zig/system.zig +4 -4
- package/std/zig.zig +4 -4
- package/std/zon/Serializer.zig +28 -23
- package/std/zon/parse.zig +58 -61
|
@@ -178,19 +178,20 @@ pub const UnsupportedCodePage = enum(u16) {
|
|
|
178
178
|
};
|
|
179
179
|
|
|
180
180
|
pub const CodePage = blk: {
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
var
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
181
|
+
const field_names = @typeInfo(SupportedCodePage).@"enum".field_names ++ @typeInfo(UnsupportedCodePage).@"enum".field_names;
|
|
182
|
+
const field_values = @typeInfo(SupportedCodePage).@"enum".field_values ++ @typeInfo(UnsupportedCodePage).@"enum".field_values;
|
|
183
|
+
var cp_field_names: [field_names.len][]const u8 = undefined;
|
|
184
|
+
var cp_field_values: [field_names.len]u16 = undefined;
|
|
185
|
+
for (field_names, field_values, &cp_field_names, &cp_field_values) |field_name, field_value, *name, *val| {
|
|
186
|
+
name.* = field_name;
|
|
187
|
+
val.* = field_value;
|
|
187
188
|
}
|
|
188
|
-
break :blk @Enum(u16, .exhaustive, &
|
|
189
|
+
break :blk @Enum(u16, .exhaustive, &cp_field_names, &cp_field_values);
|
|
189
190
|
};
|
|
190
191
|
|
|
191
192
|
pub fn isSupported(code_page: CodePage) bool {
|
|
192
|
-
inline for (@typeInfo(SupportedCodePage).@"enum".
|
|
193
|
-
if (@intFromEnum(code_page) == @intFromEnum(@field(SupportedCodePage,
|
|
193
|
+
inline for (@typeInfo(SupportedCodePage).@"enum".field_names) |field_name| {
|
|
194
|
+
if (@intFromEnum(code_page) == @intFromEnum(@field(SupportedCodePage, field_name))) {
|
|
194
195
|
return true;
|
|
195
196
|
}
|
|
196
197
|
}
|
|
@@ -200,9 +201,10 @@ pub fn isSupported(code_page: CodePage) bool {
|
|
|
200
201
|
pub fn getByIdentifier(identifier: u16) !CodePage {
|
|
201
202
|
// There's probably a more efficient way to do this (e.g. ComptimeHashMap?) but
|
|
202
203
|
// this should be fine, especially since this function likely won't be called much.
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
const info = @typeInfo(CodePage).@"enum";
|
|
205
|
+
inline for (info.field_names, info.field_values) |field_name, field_value| {
|
|
206
|
+
if (identifier == field_value) {
|
|
207
|
+
return @field(CodePage, field_name);
|
|
206
208
|
}
|
|
207
209
|
}
|
|
208
210
|
return error.InvalidCodePage;
|
|
@@ -1054,17 +1054,18 @@ pub const supported_targets = struct {
|
|
|
1054
1054
|
.ebc,
|
|
1055
1055
|
};
|
|
1056
1056
|
comptime {
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1057
|
+
const info = @typeInfo(Arch).@"enum";
|
|
1058
|
+
for (info.field_names, info.field_values) |field_name, field_value| {
|
|
1059
|
+
_ = std.mem.indexOfScalar(Arch, ordered_for_display, @enumFromInt(field_value)) orelse {
|
|
1060
|
+
@compileError(std.fmt.comptimePrint("'{s}' missing from ordered_for_display", .{field_name}));
|
|
1060
1061
|
};
|
|
1061
1062
|
}
|
|
1062
1063
|
}
|
|
1063
1064
|
|
|
1064
1065
|
pub const longest_name = blk: {
|
|
1065
1066
|
var len = 0;
|
|
1066
|
-
for (@typeInfo(Arch).@"enum".
|
|
1067
|
-
if (
|
|
1067
|
+
for (@typeInfo(Arch).@"enum".field_names) |field_name| {
|
|
1068
|
+
if (field_name.len > len) len = field_name.len;
|
|
1068
1069
|
}
|
|
1069
1070
|
break :blk len;
|
|
1070
1071
|
};
|
|
@@ -1106,14 +1107,14 @@ pub const supported_targets = struct {
|
|
|
1106
1107
|
// Enforce two things:
|
|
1107
1108
|
// 1. Arch enum field names are all lowercase (necessary for how fromStringIgnoreCase is implemented)
|
|
1108
1109
|
// 2. All enum fields in Arch have an associated RVA relocation type when converted to a coff.IMAGE.FILE.MACHINE
|
|
1109
|
-
for (@typeInfo(Arch).@"enum".
|
|
1110
|
-
const all_lower = all_lower: for (
|
|
1110
|
+
for (@typeInfo(Arch).@"enum".field_names) |field_name| {
|
|
1111
|
+
const all_lower = all_lower: for (field_name) |c| {
|
|
1111
1112
|
if (std.ascii.isUpper(c)) break :all_lower false;
|
|
1112
1113
|
} else break :all_lower true;
|
|
1113
|
-
if (!all_lower) @compileError(std.fmt.comptimePrint("Arch field is not all lowercase: {s}", .{
|
|
1114
|
-
const coff_machine = @field(Arch,
|
|
1114
|
+
if (!all_lower) @compileError(std.fmt.comptimePrint("Arch field is not all lowercase: {s}", .{field_name}));
|
|
1115
|
+
const coff_machine = @field(Arch, field_name).toCoffMachineType();
|
|
1115
1116
|
_ = rvaRelocationTypeIndicator(coff_machine) orelse {
|
|
1116
|
-
@compileError(std.fmt.comptimePrint("No RVA relocation for Arch: {s}", .{
|
|
1117
|
+
@compileError(std.fmt.comptimePrint("No RVA relocation for Arch: {s}", .{field_name}));
|
|
1117
1118
|
};
|
|
1118
1119
|
}
|
|
1119
1120
|
}
|
|
@@ -145,8 +145,8 @@ pub const ErrorDetails = struct {
|
|
|
145
145
|
|
|
146
146
|
comptime {
|
|
147
147
|
// all fields in the extra union should be 32 bits or less
|
|
148
|
-
for (std.meta.
|
|
149
|
-
std.debug.assert(@bitSizeOf(
|
|
148
|
+
for (std.meta.fieldTypes(Extra)) |field_type| {
|
|
149
|
+
std.debug.assert(@bitSizeOf(field_type) <= 32);
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
|
|
@@ -257,18 +257,18 @@ pub const ErrorDetails = struct {
|
|
|
257
257
|
|
|
258
258
|
pub fn writeCommaSeparated(self: ExpectedTypes, writer: *std.Io.Writer) !void {
|
|
259
259
|
const struct_info = @typeInfo(ExpectedTypes).@"struct";
|
|
260
|
-
const num_real_fields = struct_info.
|
|
260
|
+
const num_real_fields = struct_info.field_names.len - 1;
|
|
261
261
|
const num_padding_bits = @bitSizeOf(ExpectedTypes) - num_real_fields;
|
|
262
262
|
const mask = std.math.maxInt(struct_info.backing_integer.?) >> num_padding_bits;
|
|
263
263
|
const relevant_bits_only = @as(struct_info.backing_integer.?, @bitCast(self)) & mask;
|
|
264
264
|
const num_set_bits = @popCount(relevant_bits_only);
|
|
265
265
|
|
|
266
266
|
var i: usize = 0;
|
|
267
|
-
inline for (struct_info.
|
|
268
|
-
if (
|
|
267
|
+
inline for (struct_info.field_names, struct_info.field_types) |field_name, field_type| {
|
|
268
|
+
if (field_type != bool) continue;
|
|
269
269
|
if (i == num_set_bits) return;
|
|
270
|
-
if (@field(self,
|
|
271
|
-
try writer.writeAll(strings.get(
|
|
270
|
+
if (@field(self, field_name)) {
|
|
271
|
+
try writer.writeAll(strings.get(field_name).?);
|
|
272
272
|
i += 1;
|
|
273
273
|
if (num_set_bits > 2 and i != num_set_bits) {
|
|
274
274
|
try writer.writeAll(", ");
|
|
@@ -857,24 +857,20 @@ pub const ErrorDetails = struct {
|
|
|
857
857
|
|
|
858
858
|
/// Convenience struct only useful when the code page can be inferred from the token
|
|
859
859
|
pub const ErrorDetailsWithoutCodePage = blk: {
|
|
860
|
-
const details_info = @typeInfo(ErrorDetails);
|
|
861
|
-
const
|
|
862
|
-
var field_names: [
|
|
863
|
-
var field_types: [
|
|
864
|
-
var field_attrs: [
|
|
860
|
+
const details_info = @typeInfo(ErrorDetails).@"struct";
|
|
861
|
+
const field_count = details_info.field_names.len;
|
|
862
|
+
var field_names: [field_count - 1][]const u8 = undefined;
|
|
863
|
+
var field_types: [field_count - 1]type = undefined;
|
|
864
|
+
var field_attrs: [field_count - 1]std.builtin.Type.Struct.FieldAttributes = undefined;
|
|
865
865
|
var i: usize = 0;
|
|
866
|
-
for (
|
|
867
|
-
if (std.mem.eql(u8,
|
|
868
|
-
field_names[i] =
|
|
869
|
-
field_types[i] =
|
|
870
|
-
field_attrs[i] =
|
|
871
|
-
.@"comptime" = field.is_comptime,
|
|
872
|
-
.@"align" = field.alignment,
|
|
873
|
-
.default_value_ptr = field.default_value_ptr,
|
|
874
|
-
};
|
|
866
|
+
for (details_info.field_names, details_info.field_types, details_info.field_attrs) |field_name, field_type, field_attr| {
|
|
867
|
+
if (std.mem.eql(u8, field_name, "code_page")) continue;
|
|
868
|
+
field_names[i] = field_name;
|
|
869
|
+
field_types[i] = field_type;
|
|
870
|
+
field_attrs[i] = field_attr;
|
|
875
871
|
i += 1;
|
|
876
872
|
}
|
|
877
|
-
std.debug.assert(i ==
|
|
873
|
+
std.debug.assert(i == field_count - 1);
|
|
878
874
|
break :blk @Struct(.auto, null, &field_names, &field_types, &field_attrs);
|
|
879
875
|
};
|
|
880
876
|
|
|
@@ -87,8 +87,8 @@ pub fn tagToId(tag: []const u8) error{InvalidLanguageTag}!?LanguageId {
|
|
|
87
87
|
if (parsed.multiple_suffixes) return null;
|
|
88
88
|
const longest_known_tag = comptime blk: {
|
|
89
89
|
var len = 0;
|
|
90
|
-
for (@typeInfo(LanguageId).@"enum".
|
|
91
|
-
if (
|
|
90
|
+
for (@typeInfo(LanguageId).@"enum".field_names) |field_name| {
|
|
91
|
+
if (field_name.len > len) len = field_name.len;
|
|
92
92
|
}
|
|
93
93
|
break :blk len;
|
|
94
94
|
};
|
|
@@ -120,13 +120,13 @@ test tagToId {
|
|
|
120
120
|
|
|
121
121
|
test "exhaustive tagToId" {
|
|
122
122
|
@setEvalBranchQuota(2000);
|
|
123
|
-
inline for (@typeInfo(LanguageId).@"enum".
|
|
124
|
-
const id = tagToId(
|
|
125
|
-
std.debug.print("tag: {s}\n", .{
|
|
123
|
+
inline for (@typeInfo(LanguageId).@"enum".field_names) |field_name| {
|
|
124
|
+
const id = tagToId(field_name) catch |err| {
|
|
125
|
+
std.debug.print("tag: {s}\n", .{field_name});
|
|
126
126
|
return err;
|
|
127
127
|
};
|
|
128
|
-
try std.testing.expectEqual(@field(LanguageId,
|
|
129
|
-
std.debug.print("tag: {s}, got null\n", .{
|
|
128
|
+
try std.testing.expectEqual(@field(LanguageId, field_name), id orelse {
|
|
129
|
+
std.debug.print("tag: {s}, got null\n", .{field_name});
|
|
130
130
|
return error.TestExpectedEqual;
|
|
131
131
|
});
|
|
132
132
|
}
|
|
@@ -137,7 +137,7 @@ pub const Parser = struct {
|
|
|
137
137
|
fn parseOptionalStatements(self: *Self, resource: ResourceType) ![]*Node {
|
|
138
138
|
var optional_statements: std.ArrayList(*Node) = .empty;
|
|
139
139
|
|
|
140
|
-
const num_statement_types = @typeInfo(rc.OptionalStatements).@"enum".
|
|
140
|
+
const num_statement_types = @typeInfo(rc.OptionalStatements).@"enum".field_names.len;
|
|
141
141
|
var statement_type_has_duplicates: [num_statement_types]bool = @splat(false);
|
|
142
142
|
var last_statement_per_type: [num_statement_types]?*Node = @splat(null);
|
|
143
143
|
|
|
@@ -925,18 +925,18 @@ const Context = struct {
|
|
|
925
925
|
}
|
|
926
926
|
|
|
927
927
|
fn addExtra(c: *Context, extra: anytype) Allocator.Error!std.zig.Ast.ExtraIndex {
|
|
928
|
-
const
|
|
929
|
-
try c.extra_data.ensureUnusedCapacity(c.gpa,
|
|
928
|
+
const info = @typeInfo(@TypeOf(extra)).@"struct";
|
|
929
|
+
try c.extra_data.ensureUnusedCapacity(c.gpa, info.field_names.len);
|
|
930
930
|
const result: std.zig.Ast.ExtraIndex = @enumFromInt(c.extra_data.items.len);
|
|
931
|
-
inline for (
|
|
932
|
-
const data: u32 = switch (
|
|
931
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
932
|
+
const data: u32 = switch (field_type) {
|
|
933
933
|
NodeIndex,
|
|
934
934
|
std.zig.Ast.Node.OptionalIndex,
|
|
935
935
|
std.zig.Ast.OptionalTokenIndex,
|
|
936
936
|
std.zig.Ast.ExtraIndex,
|
|
937
|
-
=> @intFromEnum(@field(extra,
|
|
937
|
+
=> @intFromEnum(@field(extra, field_name)),
|
|
938
938
|
TokenIndex,
|
|
939
|
-
=> @field(extra,
|
|
939
|
+
=> @field(extra, field_name),
|
|
940
940
|
else => @compileError("unexpected field type"),
|
|
941
941
|
};
|
|
942
942
|
c.extra_data.appendAssumeCapacity(data);
|
|
@@ -170,11 +170,11 @@ pub fn ExtraData(comptime T: type) type {
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
pub fn extraData(doc: Document, comptime T: type, index: ExtraIndex) ExtraData(T) {
|
|
173
|
-
const
|
|
173
|
+
const info = @typeInfo(T).@"struct";
|
|
174
174
|
var i: usize = @intFromEnum(index);
|
|
175
175
|
var result: T = undefined;
|
|
176
|
-
inline for (
|
|
177
|
-
@field(result,
|
|
176
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
177
|
+
@field(result, field_name) = switch (field_type) {
|
|
178
178
|
u32 => doc.extra[i],
|
|
179
179
|
else => @compileError("bad field type"),
|
|
180
180
|
};
|
|
@@ -1574,11 +1574,11 @@ fn parseInlines(p: *Parser, content: []const u8) !ExtraIndex {
|
|
|
1574
1574
|
}
|
|
1575
1575
|
|
|
1576
1576
|
pub fn extraData(p: Parser, comptime T: type, index: ExtraIndex) ExtraData(T) {
|
|
1577
|
-
const
|
|
1577
|
+
const info = @typeInfo(T).@"struct";
|
|
1578
1578
|
var i: usize = @intFromEnum(index);
|
|
1579
1579
|
var result: T = undefined;
|
|
1580
|
-
inline for (
|
|
1581
|
-
@field(result,
|
|
1580
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
1581
|
+
@field(result, field_name) = switch (field_type) {
|
|
1582
1582
|
u32 => p.extra.items[i],
|
|
1583
1583
|
else => @compileError("bad field type"),
|
|
1584
1584
|
};
|
package/package.json
CHANGED
package/std/Build/Cache.zig
CHANGED
|
@@ -1241,7 +1241,7 @@ pub const Manifest = struct {
|
|
|
1241
1241
|
}
|
|
1242
1242
|
|
|
1243
1243
|
pub fn populateFileSystemInputs(man: *Manifest, buf: *std.ArrayList(u8)) Allocator.Error!void {
|
|
1244
|
-
assert(@typeInfo(std.zig.Server.Message.PathPrefix).@"enum".
|
|
1244
|
+
assert(@typeInfo(std.zig.Server.Message.PathPrefix).@"enum".field_names.len == man.cache.prefixes_len);
|
|
1245
1245
|
buf.clearRetainingCapacity();
|
|
1246
1246
|
const gpa = man.cache.gpa;
|
|
1247
1247
|
const files = man.files.keys();
|
|
@@ -1259,7 +1259,7 @@ pub const Manifest = struct {
|
|
|
1259
1259
|
|
|
1260
1260
|
pub fn populateOtherManifest(man: *Manifest, other: *Manifest, prefix_map: [4]u8) Allocator.Error!void {
|
|
1261
1261
|
const gpa = other.cache.gpa;
|
|
1262
|
-
assert(@typeInfo(std.zig.Server.Message.PathPrefix).@"enum".
|
|
1262
|
+
assert(@typeInfo(std.zig.Server.Message.PathPrefix).@"enum".field_names.len == man.cache.prefixes_len);
|
|
1263
1263
|
assert(man.cache.prefixes_len == 4);
|
|
1264
1264
|
for (man.files.keys()) |file| {
|
|
1265
1265
|
const prefixed_path: PrefixedPath = .{
|
|
@@ -2144,6 +2144,33 @@ pub const ResolvedTarget = struct {
|
|
|
2144
2144
|
return (unwrap(this) orelse return null).get(c);
|
|
2145
2145
|
}
|
|
2146
2146
|
};
|
|
2147
|
+
|
|
2148
|
+
pub fn unwrapQuery(rt: *const ResolvedTarget, c: *const Configuration) ?std.Target.Query {
|
|
2149
|
+
const tq = rt.query.get(c) orelse return null;
|
|
2150
|
+
const cpu_arch = tq.flags.cpu_arch.unwrap() orelse rt.result.get(c).flags.cpu_arch.unwrap().?;
|
|
2151
|
+
return .{
|
|
2152
|
+
.cpu_arch = cpu_arch,
|
|
2153
|
+
.cpu_model = switch (tq.flags.cpu_model) {
|
|
2154
|
+
.native => .native,
|
|
2155
|
+
.baseline => .baseline,
|
|
2156
|
+
.determined_by_arch_os => .determined_by_arch_os,
|
|
2157
|
+
.explicit => .{ .explicit = cpu_arch.parseCpuModel(tq.cpu_name.value.?.slice(c)).? },
|
|
2158
|
+
},
|
|
2159
|
+
.cpu_features_add = tq.cpu_features_add.value orelse .empty,
|
|
2160
|
+
.cpu_features_sub = tq.cpu_features_sub.value orelse .empty,
|
|
2161
|
+
.os_tag = tq.flags.os_tag.unwrap(),
|
|
2162
|
+
.os_version_min = tq.os_version_min.u.unwrap(c),
|
|
2163
|
+
.os_version_max = tq.os_version_max.u.unwrap(c),
|
|
2164
|
+
.glibc_version = if (tq.glibc_version.value) |s|
|
|
2165
|
+
std.SemanticVersion.parse(s.slice(c)) catch unreachable
|
|
2166
|
+
else
|
|
2167
|
+
null,
|
|
2168
|
+
.android_api_level = tq.android_api_level.value,
|
|
2169
|
+
.abi = tq.flags.abi.unwrap(),
|
|
2170
|
+
.dynamic_linker = if (tq.dynamic_linker.value) |s| .init(s.slice(c)) else null,
|
|
2171
|
+
.ofmt = tq.flags.object_format.unwrap(),
|
|
2172
|
+
};
|
|
2173
|
+
}
|
|
2147
2174
|
};
|
|
2148
2175
|
|
|
2149
2176
|
pub const TargetQuery = struct {
|
|
@@ -2731,29 +2758,50 @@ pub const TargetQuery = struct {
|
|
|
2731
2758
|
dynamic_linker: bool,
|
|
2732
2759
|
};
|
|
2733
2760
|
|
|
2734
|
-
pub fn
|
|
2735
|
-
const cpu_arch = tq.flags.cpu_arch.unwrap()
|
|
2761
|
+
pub fn unwrapTarget(tq: *const TargetQuery, c: *const Configuration) std.Target {
|
|
2762
|
+
const cpu_arch = tq.flags.cpu_arch.unwrap().?;
|
|
2763
|
+
const os_tag = tq.flags.os_tag.unwrap().?;
|
|
2736
2764
|
return .{
|
|
2737
|
-
.
|
|
2738
|
-
|
|
2739
|
-
.
|
|
2740
|
-
.
|
|
2741
|
-
.determined_by_arch_os => .determined_by_arch_os,
|
|
2742
|
-
.explicit => .{ .explicit = cpu_arch.?.parseCpuModel(tq.cpu_name.value.?.slice(c)).? },
|
|
2765
|
+
.cpu = .{
|
|
2766
|
+
.arch = cpu_arch,
|
|
2767
|
+
.model = cpu_arch.parseCpuModel(tq.cpu_name.value.?.slice(c)).?,
|
|
2768
|
+
.features = tq.cpu_features_add.value.?,
|
|
2743
2769
|
},
|
|
2744
|
-
.
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
2756
|
-
|
|
2770
|
+
.os = .{
|
|
2771
|
+
.tag = os_tag,
|
|
2772
|
+
.version_range = switch (os_tag) {
|
|
2773
|
+
.linux => .{ .linux = .{
|
|
2774
|
+
.range = .{
|
|
2775
|
+
.min = tq.os_version_min.u.unwrap(c).?.semver,
|
|
2776
|
+
.max = tq.os_version_max.u.unwrap(c).?.semver,
|
|
2777
|
+
},
|
|
2778
|
+
.glibc = std.SemanticVersion.parse(tq.glibc_version.value.?.slice(c)) catch unreachable,
|
|
2779
|
+
.android = tq.android_api_level.value.?,
|
|
2780
|
+
} },
|
|
2781
|
+
.hurd => .{ .hurd = .{
|
|
2782
|
+
.range = .{
|
|
2783
|
+
.min = tq.os_version_min.u.unwrap(c).?.semver,
|
|
2784
|
+
.max = tq.os_version_max.u.unwrap(c).?.semver,
|
|
2785
|
+
},
|
|
2786
|
+
.glibc = std.SemanticVersion.parse(tq.glibc_version.value.?.slice(c)) catch unreachable,
|
|
2787
|
+
} },
|
|
2788
|
+
.windows => .{ .windows = .{
|
|
2789
|
+
.min = tq.os_version_min.u.unwrap(c).?.windows,
|
|
2790
|
+
.max = tq.os_version_max.u.unwrap(c).?.windows,
|
|
2791
|
+
} },
|
|
2792
|
+
else => switch (tq.os_version_min.u.unwrap(c).?) {
|
|
2793
|
+
.none => .{ .none = {} },
|
|
2794
|
+
.semver => |min| .{ .semver = .{
|
|
2795
|
+
.min = min,
|
|
2796
|
+
.max = tq.os_version_max.u.unwrap(c).?.semver,
|
|
2797
|
+
} },
|
|
2798
|
+
.windows => unreachable,
|
|
2799
|
+
},
|
|
2800
|
+
},
|
|
2801
|
+
},
|
|
2802
|
+
.abi = tq.flags.abi.unwrap().?,
|
|
2803
|
+
.ofmt = tq.flags.object_format.unwrap().?,
|
|
2804
|
+
.dynamic_linker = .init(if (tq.dynamic_linker.value) |s| s.slice(c) else null),
|
|
2757
2805
|
};
|
|
2758
2806
|
}
|
|
2759
2807
|
};
|
|
@@ -2836,7 +2884,10 @@ pub const Storage = enum {
|
|
|
2836
2884
|
}
|
|
2837
2885
|
|
|
2838
2886
|
pub fn cast(this: @This(), c: *const Configuration, comptime S: type) ?S {
|
|
2839
|
-
const wanted_tag =
|
|
2887
|
+
const wanted_tag = blk: {
|
|
2888
|
+
const info = @typeInfo(S.Flags).@"struct";
|
|
2889
|
+
break :blk info.field_attrs[0].defaultValue(info.field_types[0]).?;
|
|
2890
|
+
};
|
|
2840
2891
|
const base_flags: BaseFlags = @bitCast(c.extra[@intFromEnum(this)]);
|
|
2841
2892
|
if (base_flags.tag != wanted_tag) return null;
|
|
2842
2893
|
var i: usize = @intFromEnum(this);
|
|
@@ -2999,8 +3050,8 @@ pub const Storage = enum {
|
|
|
2999
3050
|
switch (@typeInfo(T)) {
|
|
3000
3051
|
.@"struct" => |info| {
|
|
3001
3052
|
var result: T = undefined;
|
|
3002
|
-
inline for (info.
|
|
3003
|
-
@field(result,
|
|
3053
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
3054
|
+
@field(result, field_name) = dataField(buffer, i, &result, field_type);
|
|
3004
3055
|
}
|
|
3005
3056
|
return result;
|
|
3006
3057
|
},
|
|
@@ -3010,7 +3061,7 @@ pub const Storage = enum {
|
|
|
3010
3061
|
inline else => |comptime_tag| @unionInit(
|
|
3011
3062
|
T,
|
|
3012
3063
|
@tagName(comptime_tag),
|
|
3013
|
-
data(buffer, i, info.
|
|
3064
|
+
data(buffer, i, info.field_types[@intFromEnum(comptime_tag)]),
|
|
3014
3065
|
),
|
|
3015
3066
|
};
|
|
3016
3067
|
},
|
|
@@ -3077,7 +3128,7 @@ pub const Storage = enum {
|
|
|
3077
3128
|
buffer,
|
|
3078
3129
|
i,
|
|
3079
3130
|
container,
|
|
3080
|
-
@typeInfo(Field.Union).@"union".
|
|
3131
|
+
@typeInfo(Field.Union).@"union".field_types[@intFromEnum(comptime_tag)],
|
|
3081
3132
|
),
|
|
3082
3133
|
),
|
|
3083
3134
|
},
|
|
@@ -3119,7 +3170,7 @@ pub const Storage = enum {
|
|
|
3119
3170
|
.multi_list => {
|
|
3120
3171
|
const data_start = i.* + 1;
|
|
3121
3172
|
const len = buffer[data_start - 1];
|
|
3122
|
-
defer i.* = data_start + len * @typeInfo(Field.Elem).@"struct".
|
|
3173
|
+
defer i.* = data_start + len * @typeInfo(Field.Elem).@"struct".field_names.len;
|
|
3123
3174
|
return .{ .mal = .{
|
|
3124
3175
|
.bytes = @ptrCast(@constCast(buffer[data_start..][0..len])),
|
|
3125
3176
|
.len = len,
|
|
@@ -3157,10 +3208,10 @@ pub const Storage = enum {
|
|
|
3157
3208
|
|
|
3158
3209
|
/// Returns new end index.
|
|
3159
3210
|
fn setExtra(buffer: []u32, index: usize, extra: anytype) usize {
|
|
3160
|
-
const
|
|
3211
|
+
const info = @typeInfo(@TypeOf(extra)).@"struct";
|
|
3161
3212
|
var i = index;
|
|
3162
|
-
inline for (
|
|
3163
|
-
i += setExtraField(buffer, i,
|
|
3213
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
3214
|
+
i += setExtraField(buffer, i, field_type, @field(extra, field_name));
|
|
3164
3215
|
}
|
|
3165
3216
|
return i;
|
|
3166
3217
|
}
|
|
@@ -3188,7 +3239,7 @@ pub const Storage = enum {
|
|
|
3188
3239
|
.flag_length_prefixed_list,
|
|
3189
3240
|
.flag_list,
|
|
3190
3241
|
=> 1 + @divExact(@sizeOf(Field.Elem), @sizeOf(u32)) * field.slice.len,
|
|
3191
|
-
.multi_list => 1 + field.mal.len * @typeInfo(Field.Elem).@"struct".
|
|
3242
|
+
.multi_list => 1 + field.mal.len * @typeInfo(Field.Elem).@"struct".field_names.len,
|
|
3192
3243
|
.union_list => Field.extraLen(field.len),
|
|
3193
3244
|
.flag_union => switch (field.u) {
|
|
3194
3245
|
inline else => |v| extraFieldLen(v),
|
|
@@ -3201,10 +3252,10 @@ pub const Storage = enum {
|
|
|
3201
3252
|
}
|
|
3202
3253
|
|
|
3203
3254
|
fn extraLen(extra: anytype) usize {
|
|
3204
|
-
const
|
|
3255
|
+
const field_names = @typeInfo(@TypeOf(extra)).@"struct".field_names;
|
|
3205
3256
|
var i: usize = 0;
|
|
3206
|
-
inline for (
|
|
3207
|
-
i += Storage.extraFieldLen(@field(extra,
|
|
3257
|
+
inline for (field_names) |name| {
|
|
3258
|
+
i += Storage.extraFieldLen(@field(extra, name));
|
|
3208
3259
|
}
|
|
3209
3260
|
return i;
|
|
3210
3261
|
}
|
|
@@ -3276,12 +3327,12 @@ pub const Storage = enum {
|
|
|
3276
3327
|
.multi_list => {
|
|
3277
3328
|
const len: u32 = @intCast(value.mal.len);
|
|
3278
3329
|
buffer[i] = len;
|
|
3279
|
-
const
|
|
3280
|
-
inline for (0..
|
|
3330
|
+
const field_names = @typeInfo(Field.Elem).@"struct".field_names;
|
|
3331
|
+
inline for (0..field_names.len) |field_i| @memcpy(
|
|
3281
3332
|
buffer[i + 1 + field_i * len ..][0..len],
|
|
3282
3333
|
@as([]const u32, @ptrCast(value.mal.items(@enumFromInt(field_i)))),
|
|
3283
3334
|
);
|
|
3284
|
-
return 1 +
|
|
3335
|
+
return 1 + field_names.len * len;
|
|
3285
3336
|
},
|
|
3286
3337
|
.union_list => {
|
|
3287
3338
|
if (value.len == 0) return 0;
|
|
@@ -173,8 +173,9 @@ fn addValueInner(config_header: *ConfigHeader, name: []const u8, comptime T: typ
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
pub fn addValues(config_header: *ConfigHeader, values: anytype) void {
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
const info = @typeInfo(@TypeOf(values)).@"struct";
|
|
177
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
178
|
+
addValue(config_header, field_name, field_type, @field(values, field_name));
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
181
|
|
|
@@ -299,14 +299,14 @@ fn printEnum(
|
|
|
299
299
|
try out.appendNTimes(gpa, ' ', indent);
|
|
300
300
|
try out.print(gpa, "pub const {f} = enum ({s}) {{\n", .{ std.zig.fmtId(@typeName(T)), @typeName(val.tag_type) });
|
|
301
301
|
|
|
302
|
-
inline for (val.
|
|
302
|
+
inline for (val.field_names, val.field_values) |field_name, field_value| {
|
|
303
303
|
try out.appendNTimes(gpa, ' ', indent);
|
|
304
304
|
try out.print(gpa, " {f} = {d},\n", .{
|
|
305
|
-
std.zig.fmtIdFlags(
|
|
305
|
+
std.zig.fmtIdFlags(field_name, .{ .allow_primitive = true }), field_value,
|
|
306
306
|
});
|
|
307
307
|
}
|
|
308
308
|
|
|
309
|
-
if (
|
|
309
|
+
if (val.mode == .nonexhaustive) {
|
|
310
310
|
try out.appendNTimes(gpa, ' ', indent);
|
|
311
311
|
try out.appendSlice(gpa, " _,\n");
|
|
312
312
|
}
|
|
@@ -315,7 +315,13 @@ fn printEnum(
|
|
|
315
315
|
try out.appendSlice(gpa, "};\n");
|
|
316
316
|
}
|
|
317
317
|
|
|
318
|
-
fn printStruct(
|
|
318
|
+
fn printStruct(
|
|
319
|
+
options: *Options,
|
|
320
|
+
out: *std.ArrayList(u8),
|
|
321
|
+
comptime T: type,
|
|
322
|
+
comptime val: std.builtin.Type.Struct,
|
|
323
|
+
indent: u8,
|
|
324
|
+
) !void {
|
|
319
325
|
const gpa = options.step.owner.allocator;
|
|
320
326
|
const gop = try options.encountered_types.getOrPut(gpa, @typeName(T));
|
|
321
327
|
if (gop.found_existing) return;
|
|
@@ -331,32 +337,32 @@ fn printStruct(options: *Options, out: *std.ArrayList(u8), comptime T: type, com
|
|
|
331
337
|
|
|
332
338
|
try out.appendSlice(gpa, " {\n");
|
|
333
339
|
|
|
334
|
-
inline for (val.
|
|
340
|
+
inline for (val.field_names, val.field_types, val.field_attrs) |field_name, field_type, field_attrs| {
|
|
335
341
|
try out.appendNTimes(gpa, ' ', indent);
|
|
336
342
|
|
|
337
|
-
const type_name = @typeName(
|
|
343
|
+
const type_name = @typeName(field_type);
|
|
338
344
|
|
|
339
345
|
// If the type name doesn't contains a '.' the type is from zig builtins.
|
|
340
346
|
if (std.mem.containsAtLeast(u8, type_name, 1, ".")) {
|
|
341
347
|
try out.print(gpa, " {f}: {f}", .{
|
|
342
|
-
std.zig.fmtIdFlags(
|
|
348
|
+
std.zig.fmtIdFlags(field_name, .{ .allow_underscore = true, .allow_primitive = true }),
|
|
343
349
|
std.zig.fmtId(type_name),
|
|
344
350
|
});
|
|
345
351
|
} else {
|
|
346
352
|
try out.print(gpa, " {f}: {s}", .{
|
|
347
|
-
std.zig.fmtIdFlags(
|
|
353
|
+
std.zig.fmtIdFlags(field_name, .{ .allow_underscore = true, .allow_primitive = true }),
|
|
348
354
|
type_name,
|
|
349
355
|
});
|
|
350
356
|
}
|
|
351
357
|
|
|
352
|
-
if (
|
|
358
|
+
if (field_attrs.defaultValue(field_type)) |default_value| {
|
|
353
359
|
try out.appendSlice(gpa, " = ");
|
|
354
|
-
switch (@typeInfo(
|
|
360
|
+
switch (@typeInfo(field_type)) {
|
|
355
361
|
.@"enum" => try out.print(gpa, ".{s},\n", .{@tagName(default_value)}),
|
|
356
362
|
.@"struct" => |info| {
|
|
357
363
|
try printStructValue(options, out, info, default_value, indent + 4);
|
|
358
364
|
},
|
|
359
|
-
else => try printType(options, out,
|
|
365
|
+
else => try printType(options, out, field_type, default_value, indent, null),
|
|
360
366
|
}
|
|
361
367
|
} else {
|
|
362
368
|
try out.appendSlice(gpa, ",\n");
|
|
@@ -368,8 +374,8 @@ fn printStruct(options: *Options, out: *std.ArrayList(u8), comptime T: type, com
|
|
|
368
374
|
try out.appendNTimes(gpa, ' ', indent);
|
|
369
375
|
try out.appendSlice(gpa, "};\n");
|
|
370
376
|
|
|
371
|
-
inline for (val.
|
|
372
|
-
try printUserDefinedType(options, out,
|
|
377
|
+
inline for (val.field_types) |field_type| {
|
|
378
|
+
try printUserDefinedType(options, out, field_type, 0);
|
|
373
379
|
}
|
|
374
380
|
}
|
|
375
381
|
|
|
@@ -384,24 +390,24 @@ fn printStructValue(
|
|
|
384
390
|
try out.appendSlice(gpa, ".{\n");
|
|
385
391
|
|
|
386
392
|
if (struct_val.is_tuple) {
|
|
387
|
-
inline for (struct_val.
|
|
393
|
+
inline for (struct_val.field_names) |field_name| {
|
|
388
394
|
try out.appendNTimes(gpa, ' ', indent);
|
|
389
|
-
try printType(options, out, @TypeOf(@field(val,
|
|
395
|
+
try printType(options, out, @TypeOf(@field(val, field_name)), @field(val, field_name), indent, null);
|
|
390
396
|
}
|
|
391
397
|
} else {
|
|
392
|
-
inline for (struct_val.
|
|
398
|
+
inline for (struct_val.field_names) |field_name| {
|
|
393
399
|
try out.appendNTimes(gpa, ' ', indent);
|
|
394
400
|
try out.print(gpa, " .{f} = ", .{
|
|
395
|
-
std.zig.fmtIdFlags(
|
|
401
|
+
std.zig.fmtIdFlags(field_name, .{ .allow_primitive = true, .allow_underscore = true }),
|
|
396
402
|
});
|
|
397
403
|
|
|
398
|
-
const
|
|
399
|
-
switch (@typeInfo(@TypeOf(
|
|
400
|
-
.@"enum" => try out.print(gpa, ".{s},\n", .{@tagName(
|
|
404
|
+
const field_val = @field(val, field_name);
|
|
405
|
+
switch (@typeInfo(@TypeOf(field_val))) {
|
|
406
|
+
.@"enum" => try out.print(gpa, ".{s},\n", .{@tagName(field_val)}),
|
|
401
407
|
.@"struct" => |struct_info| {
|
|
402
|
-
try printStructValue(options, out, struct_info,
|
|
408
|
+
try printStructValue(options, out, struct_info, field_val, indent + 4);
|
|
403
409
|
},
|
|
404
|
-
else => try printType(options, out, @TypeOf(
|
|
410
|
+
else => try printType(options, out, @TypeOf(field_val), field_val, indent, null),
|
|
405
411
|
}
|
|
406
412
|
}
|
|
407
413
|
}
|