@zigc/lib 0.17.0-dev.644 → 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/ScannedConfig.zig +4 -3
- package/compiler/Maker/Step/FindProgram.zig +2 -2
- 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 +19 -16
- package/std/Build/Step/ConfigHeader.zig +3 -2
- package/std/Build/Step/Options.zig +28 -22
- package/std/Build.zig +52 -53
- 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 +2 -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
|
@@ -49,9 +49,10 @@ pub fn print(sc: *const ScannedConfig, w: *Writer) Writer.Error!void {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
fn printStruct(sc: *const ScannedConfig, s: *Serializer.Struct, comptime S: type, v: S) !void {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
try
|
|
52
|
+
const info = @typeInfo(S).@"struct";
|
|
53
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
54
|
+
try s.fieldPrefix(field_name);
|
|
55
|
+
try printValue(sc, s.container.serializer, field_type, @field(v, field_name));
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
58
|
|
|
@@ -113,8 +113,8 @@ fn checkCandidate(
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
fn supportedWindowsProgramExtension(ext: []const u8) bool {
|
|
116
|
-
inline for (@typeInfo(std.process.WindowsExtension).@"enum".
|
|
117
|
-
if (std.ascii.eqlIgnoreCase(ext, "." ++
|
|
116
|
+
inline for (@typeInfo(std.process.WindowsExtension).@"enum".field_names) |field_name| {
|
|
117
|
+
if (std.ascii.eqlIgnoreCase(ext, "." ++ field_name)) return true;
|
|
118
118
|
}
|
|
119
119
|
return false;
|
|
120
120
|
}
|
|
@@ -87,8 +87,9 @@ pub fn init(cwd_path: []const u8) error{ OpenFrameworkFailed, MissingCoreService
|
|
|
87
87
|
errdefer core_services.close();
|
|
88
88
|
|
|
89
89
|
var resolved_symbols: ResolvedSymbols = undefined;
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
const info = @typeInfo(ResolvedSymbols).@"struct";
|
|
91
|
+
inline for (info.field_names, info.field_types) |f_name, f_type| {
|
|
92
|
+
@field(resolved_symbols, f_name) = core_services.lookup(f_type, f_name) orelse return error.MissingCoreServicesSymbol;
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
return .{
|
|
@@ -89,9 +89,9 @@ pub fn requiredArgCount(attr: Tag) u32 {
|
|
|
89
89
|
inline else => |tag| {
|
|
90
90
|
comptime var needed = 0;
|
|
91
91
|
comptime {
|
|
92
|
-
const
|
|
93
|
-
for (
|
|
94
|
-
if (!mem.eql(u8,
|
|
92
|
+
const info = @typeInfo(@field(attributes, @tagName(tag))).@"struct";
|
|
93
|
+
for (info.field_names, info.field_types) |arg_field_name, arg_field_type| {
|
|
94
|
+
if (!mem.eql(u8, arg_field_name, "__name_tok") and @typeInfo(arg_field_type) != .optional) needed += 1;
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
return needed;
|
|
@@ -105,9 +105,9 @@ pub fn maxArgCount(attr: Tag) u32 {
|
|
|
105
105
|
inline else => |tag| {
|
|
106
106
|
comptime var max = 0;
|
|
107
107
|
comptime {
|
|
108
|
-
const
|
|
109
|
-
for (
|
|
110
|
-
if (!mem.eql(u8,
|
|
108
|
+
const field_names = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_names;
|
|
109
|
+
for (field_names) |arg_field_name| {
|
|
110
|
+
if (!mem.eql(u8, arg_field_name, "__name_tok")) max += 1;
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
return max;
|
|
@@ -130,10 +130,10 @@ pub const Formatting = struct {
|
|
|
130
130
|
switch (attr) {
|
|
131
131
|
.calling_convention => unreachable,
|
|
132
132
|
inline else => |tag| {
|
|
133
|
-
const
|
|
133
|
+
const field_types = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_types;
|
|
134
134
|
|
|
135
|
-
if (
|
|
136
|
-
const Unwrapped = UnwrapOptional(
|
|
135
|
+
if (field_types.len == 0) unreachable;
|
|
136
|
+
const Unwrapped = UnwrapOptional(field_types[0]);
|
|
137
137
|
if (@typeInfo(Unwrapped) != .@"enum") unreachable;
|
|
138
138
|
|
|
139
139
|
return if (Unwrapped.opts.enum_kind == .identifier) "'" else "\"";
|
|
@@ -147,18 +147,18 @@ pub const Formatting = struct {
|
|
|
147
147
|
switch (attr) {
|
|
148
148
|
.calling_convention => unreachable,
|
|
149
149
|
inline else => |tag| {
|
|
150
|
-
const
|
|
150
|
+
const field_types = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_types;
|
|
151
151
|
|
|
152
|
-
if (
|
|
153
|
-
const Unwrapped = UnwrapOptional(
|
|
152
|
+
if (field_types.len == 0) unreachable;
|
|
153
|
+
const Unwrapped = UnwrapOptional(field_types[0]);
|
|
154
154
|
if (@typeInfo(Unwrapped) != .@"enum") unreachable;
|
|
155
155
|
|
|
156
|
-
const
|
|
156
|
+
const enum_field_names = @typeInfo(Unwrapped).@"enum".field_names;
|
|
157
157
|
const quote = comptime quoteChar(@enumFromInt(@intFromEnum(tag)));
|
|
158
|
-
comptime var values: []const u8 = quote ++
|
|
159
|
-
inline for (
|
|
158
|
+
comptime var values: []const u8 = quote ++ enum_field_names[0] ++ quote;
|
|
159
|
+
inline for (enum_field_names[1..]) |enum_field_name| {
|
|
160
160
|
values = values ++ ", ";
|
|
161
|
-
values = values ++ quote ++
|
|
161
|
+
values = values ++ quote ++ enum_field_name ++ quote;
|
|
162
162
|
}
|
|
163
163
|
return values;
|
|
164
164
|
},
|
|
@@ -171,10 +171,10 @@ pub fn wantsIdentEnum(attr: Tag) bool {
|
|
|
171
171
|
switch (attr) {
|
|
172
172
|
.calling_convention => return false,
|
|
173
173
|
inline else => |tag| {
|
|
174
|
-
const
|
|
174
|
+
const field_types = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_types;
|
|
175
175
|
|
|
176
|
-
if (
|
|
177
|
-
const Unwrapped = UnwrapOptional(
|
|
176
|
+
if (field_types.len == 0) return false;
|
|
177
|
+
const Unwrapped = UnwrapOptional(field_types[0]);
|
|
178
178
|
if (@typeInfo(Unwrapped) != .@"enum") return false;
|
|
179
179
|
|
|
180
180
|
return Unwrapped.opts.enum_kind == .identifier;
|
|
@@ -185,12 +185,12 @@ pub fn wantsIdentEnum(attr: Tag) bool {
|
|
|
185
185
|
pub fn diagnoseIdent(attr: Tag, arguments: *Arguments, ident: TokenIndex, p: *Parser) !bool {
|
|
186
186
|
switch (attr) {
|
|
187
187
|
inline else => |tag| {
|
|
188
|
-
const
|
|
189
|
-
if (
|
|
190
|
-
const Unwrapped = UnwrapOptional(
|
|
188
|
+
const info = @typeInfo(@field(attributes, @tagName(tag))).@"struct";
|
|
189
|
+
if (info.field_names.len == 0) unreachable;
|
|
190
|
+
const Unwrapped = UnwrapOptional(info.field_types[0]);
|
|
191
191
|
if (@typeInfo(Unwrapped) != .@"enum") unreachable;
|
|
192
192
|
if (std.meta.stringToEnum(Unwrapped, normalize(p.tokSlice(ident)))) |enum_val| {
|
|
193
|
-
@field(@field(arguments, @tagName(tag)),
|
|
193
|
+
@field(@field(arguments, @tagName(tag)), info.field_names[0]) = enum_val;
|
|
194
194
|
return false;
|
|
195
195
|
}
|
|
196
196
|
|
|
@@ -203,11 +203,11 @@ pub fn diagnoseIdent(attr: Tag, arguments: *Arguments, ident: TokenIndex, p: *Pa
|
|
|
203
203
|
pub fn wantsAlignment(attr: Tag, idx: usize) bool {
|
|
204
204
|
switch (attr) {
|
|
205
205
|
inline else => |tag| {
|
|
206
|
-
const
|
|
207
|
-
if (
|
|
206
|
+
const field_types = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_types;
|
|
207
|
+
if (field_types.len == 0) return false;
|
|
208
208
|
|
|
209
209
|
return switch (idx) {
|
|
210
|
-
inline 0...
|
|
210
|
+
inline 0...field_types.len - 1 => |i| UnwrapOptional(field_types[i]) == Alignment,
|
|
211
211
|
else => false,
|
|
212
212
|
};
|
|
213
213
|
},
|
|
@@ -217,12 +217,12 @@ pub fn wantsAlignment(attr: Tag, idx: usize) bool {
|
|
|
217
217
|
pub fn diagnoseAlignment(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Parser.Result, arg_start: TokenIndex, p: *Parser) !bool {
|
|
218
218
|
switch (attr) {
|
|
219
219
|
inline else => |tag| {
|
|
220
|
-
const
|
|
221
|
-
if (
|
|
220
|
+
const arg_info = @typeInfo(@field(attributes, @tagName(tag))).@"struct";
|
|
221
|
+
if (arg_info.field_names.len == 0) unreachable;
|
|
222
222
|
|
|
223
223
|
switch (arg_idx) {
|
|
224
|
-
inline 0...
|
|
225
|
-
if (UnwrapOptional(
|
|
224
|
+
inline 0...arg_info.field_names.len - 1 => |arg_i| {
|
|
225
|
+
if (UnwrapOptional(arg_info.field_types[arg_i]) != Alignment) unreachable;
|
|
226
226
|
|
|
227
227
|
if (!res.val.is(.int, p.comp)) {
|
|
228
228
|
try p.err(arg_start, .alignas_unavailable, .{});
|
|
@@ -241,7 +241,7 @@ pub fn diagnoseAlignment(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Pa
|
|
|
241
241
|
return true;
|
|
242
242
|
}
|
|
243
243
|
|
|
244
|
-
@field(@field(arguments, @tagName(tag)),
|
|
244
|
+
@field(@field(arguments, @tagName(tag)), arg_info.field_names[arg_i]) = .{ .requested = requested };
|
|
245
245
|
return false;
|
|
246
246
|
},
|
|
247
247
|
else => unreachable,
|
|
@@ -251,8 +251,8 @@ pub fn diagnoseAlignment(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Pa
|
|
|
251
251
|
}
|
|
252
252
|
|
|
253
253
|
fn diagnoseField(
|
|
254
|
-
comptime
|
|
255
|
-
comptime
|
|
254
|
+
comptime decl_name: []const u8,
|
|
255
|
+
comptime field_name: []const u8,
|
|
256
256
|
comptime Wanted: type,
|
|
257
257
|
arguments: *Arguments,
|
|
258
258
|
res: Parser.Result,
|
|
@@ -283,7 +283,7 @@ fn diagnoseField(
|
|
|
283
283
|
|
|
284
284
|
if (res.val.opt_ref == .none) {
|
|
285
285
|
if (Wanted == Identifier and node == .decl_ref_expr) {
|
|
286
|
-
@field(@field(arguments,
|
|
286
|
+
@field(@field(arguments, decl_name), field_name) = .{ .tok = node.decl_ref_expr.name_tok };
|
|
287
287
|
return false;
|
|
288
288
|
}
|
|
289
289
|
|
|
@@ -294,7 +294,7 @@ fn diagnoseField(
|
|
|
294
294
|
switch (key) {
|
|
295
295
|
.int => {
|
|
296
296
|
if (@typeInfo(Wanted) == .int) {
|
|
297
|
-
@field(@field(arguments,
|
|
297
|
+
@field(@field(arguments, decl_name), field_name) = res.val.toInt(Wanted, p.comp) orelse {
|
|
298
298
|
try p.err(arg_start, .attribute_int_out_of_range, .{res});
|
|
299
299
|
return true;
|
|
300
300
|
};
|
|
@@ -310,20 +310,20 @@ fn diagnoseField(
|
|
|
310
310
|
.char, .uchar, .schar => {},
|
|
311
311
|
else => break :validate,
|
|
312
312
|
}
|
|
313
|
-
@field(@field(arguments,
|
|
313
|
+
@field(@field(arguments, decl_name), field_name) = try p.removeNull(res.val);
|
|
314
314
|
return false;
|
|
315
315
|
}
|
|
316
316
|
|
|
317
|
-
try p.err(arg_start, .attribute_requires_string, .{
|
|
317
|
+
try p.err(arg_start, .attribute_requires_string, .{decl_name});
|
|
318
318
|
return true;
|
|
319
319
|
} else if (@typeInfo(Wanted) == .@"enum" and @hasDecl(Wanted, "opts") and Wanted.opts.enum_kind == .string) {
|
|
320
320
|
const str = bytes[0 .. bytes.len - 1];
|
|
321
321
|
if (std.meta.stringToEnum(Wanted, str)) |enum_val| {
|
|
322
|
-
@field(@field(arguments,
|
|
322
|
+
@field(@field(arguments, decl_name), field_name) = enum_val;
|
|
323
323
|
return false;
|
|
324
324
|
}
|
|
325
325
|
|
|
326
|
-
try p.err(arg_start, .unknown_attr_enum, .{
|
|
326
|
+
try p.err(arg_start, .unknown_attr_enum, .{ decl_name, Formatting.choices(@field(Tag, decl_name)) });
|
|
327
327
|
return true;
|
|
328
328
|
}
|
|
329
329
|
},
|
|
@@ -344,17 +344,18 @@ fn diagnoseField(
|
|
|
344
344
|
pub fn diagnose(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Parser.Result, arg_start: TokenIndex, node: Tree.Node, p: *Parser) !bool {
|
|
345
345
|
switch (attr) {
|
|
346
346
|
inline else => |tag| {
|
|
347
|
-
const
|
|
347
|
+
const decl_name = @typeInfo(attributes).@"struct".decl_names[@intFromEnum(tag)];
|
|
348
348
|
const max_arg_count = comptime maxArgCount(tag);
|
|
349
349
|
if (arg_idx >= max_arg_count) {
|
|
350
350
|
try p.err(arg_start, .attribute_too_many_args, .{ @tagName(attr), max_arg_count });
|
|
351
351
|
return true;
|
|
352
352
|
}
|
|
353
353
|
|
|
354
|
-
const
|
|
354
|
+
const arg_field_names = @typeInfo(@field(attributes, decl_name)).@"struct".field_names;
|
|
355
|
+
const arg_field_types = @typeInfo(@field(attributes, decl_name)).@"struct".field_types;
|
|
355
356
|
switch (arg_idx) {
|
|
356
|
-
inline 0...
|
|
357
|
-
return diagnoseField(
|
|
357
|
+
inline 0...arg_field_names.len - 1 => |arg_i| {
|
|
358
|
+
return diagnoseField(decl_name, arg_field_names[arg_i], UnwrapOptional(arg_field_types[arg_i]), arguments, res, arg_start, node, p);
|
|
358
359
|
},
|
|
359
360
|
else => unreachable,
|
|
360
361
|
}
|
|
@@ -722,20 +723,20 @@ const attributes = struct {
|
|
|
722
723
|
pub const Tag = std.meta.DeclEnum(attributes);
|
|
723
724
|
|
|
724
725
|
pub const Arguments = blk: {
|
|
725
|
-
const
|
|
726
|
-
var names: [
|
|
727
|
-
var types: [
|
|
728
|
-
for (
|
|
729
|
-
name.* =
|
|
730
|
-
T.* = @field(attributes,
|
|
726
|
+
const decl_names = @typeInfo(attributes).@"struct".decl_names;
|
|
727
|
+
var names: [decl_names.len][]const u8 = undefined;
|
|
728
|
+
var types: [decl_names.len]type = undefined;
|
|
729
|
+
for (decl_names, &names, &types) |decl_name, *name, *T| {
|
|
730
|
+
name.* = decl_name;
|
|
731
|
+
T.* = @field(attributes, decl_name);
|
|
731
732
|
}
|
|
732
733
|
|
|
733
734
|
break :blk @Union(.auto, null, &names, &types, &@splat(.{}));
|
|
734
735
|
};
|
|
735
736
|
|
|
736
737
|
pub fn ArgumentsForTag(comptime tag: Tag) type {
|
|
737
|
-
const
|
|
738
|
-
return @field(attributes,
|
|
738
|
+
const decl_name = @typeInfo(attributes).@"struct".decl_names[@intFromEnum(tag)];
|
|
739
|
+
return @field(attributes, decl_name);
|
|
739
740
|
}
|
|
740
741
|
|
|
741
742
|
pub fn initArguments(tag: Tag, name_tok: TokenIndex) Arguments {
|
|
@@ -78,12 +78,12 @@ pub const Environment = struct {
|
|
|
78
78
|
pub fn loadAll(environ_map: *const std.process.Environ.Map) Environment {
|
|
79
79
|
var env: Environment = .{};
|
|
80
80
|
|
|
81
|
-
inline for (@typeInfo(@TypeOf(env)).@"struct".
|
|
82
|
-
std.debug.assert(@field(env,
|
|
81
|
+
inline for (@typeInfo(@TypeOf(env)).@"struct".field_names) |field_name| {
|
|
82
|
+
std.debug.assert(@field(env, field_name) == null);
|
|
83
83
|
|
|
84
|
-
var env_var_buf: [
|
|
85
|
-
const env_var_name = std.ascii.upperString(&env_var_buf,
|
|
86
|
-
@field(env,
|
|
84
|
+
var env_var_buf: [field_name.len]u8 = undefined;
|
|
85
|
+
const env_var_name = std.ascii.upperString(&env_var_buf, field_name);
|
|
86
|
+
@field(env, field_name) = environ_map.get(env_var_name);
|
|
87
87
|
}
|
|
88
88
|
return env;
|
|
89
89
|
}
|
|
@@ -333,8 +333,8 @@ pub fn deinit(d: *Diagnostics) void {
|
|
|
333
333
|
/// Used by the __has_warning builtin macro.
|
|
334
334
|
pub fn warningExists(name: []const u8) bool {
|
|
335
335
|
if (std.mem.eql(u8, name, "pedantic")) return true;
|
|
336
|
-
inline for (comptime std.meta.declarations(Option)) |
|
|
337
|
-
if (std.mem.eql(u8, name,
|
|
336
|
+
inline for (comptime std.meta.declarations(Option)) |group_name| {
|
|
337
|
+
if (std.mem.eql(u8, name, group_name)) return true;
|
|
338
338
|
}
|
|
339
339
|
return std.meta.stringToEnum(Option, name) != null;
|
|
340
340
|
}
|
|
@@ -349,9 +349,9 @@ pub fn set(d: *Diagnostics, name: []const u8, to: Message.Kind) Compilation.Erro
|
|
|
349
349
|
return;
|
|
350
350
|
}
|
|
351
351
|
|
|
352
|
-
inline for (comptime std.meta.declarations(Option)) |
|
|
353
|
-
if (std.mem.eql(u8, name,
|
|
354
|
-
for (@field(Option,
|
|
352
|
+
inline for (comptime std.meta.declarations(Option)) |group_name| {
|
|
353
|
+
if (std.mem.eql(u8, name, group_name)) {
|
|
354
|
+
for (@field(Option, group_name)) |option| {
|
|
355
355
|
d.state.options.put(option, to);
|
|
356
356
|
}
|
|
357
357
|
return;
|
|
@@ -494,8 +494,8 @@ pub fn addWithLocation(
|
|
|
494
494
|
|
|
495
495
|
pub fn formatArgs(w: *std.Io.Writer, fmt: []const u8, args: anytype) std.Io.Writer.Error!void {
|
|
496
496
|
var i: usize = 0;
|
|
497
|
-
inline for (std.meta.
|
|
498
|
-
const arg = @field(args,
|
|
497
|
+
inline for (comptime std.meta.fieldNames(@TypeOf(args))) |arg_name| {
|
|
498
|
+
const arg = @field(args, arg_name);
|
|
499
499
|
i += switch (@TypeOf(arg)) {
|
|
500
500
|
[]const u8 => try formatString(w, fmt[i..], arg),
|
|
501
501
|
else => switch (@typeInfo(@TypeOf(arg))) {
|
|
@@ -456,8 +456,8 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype)
|
|
|
456
456
|
|
|
457
457
|
fn formatArgs(p: *Parser, w: *std.Io.Writer, fmt: []const u8, args: anytype) !void {
|
|
458
458
|
var i: usize = 0;
|
|
459
|
-
inline for (std.meta.
|
|
460
|
-
const arg = @field(args,
|
|
459
|
+
inline for (comptime std.meta.fieldNames(@TypeOf(args))) |arg_name| {
|
|
460
|
+
const arg = @field(args, arg_name);
|
|
461
461
|
i += switch (@TypeOf(arg)) {
|
|
462
462
|
[]const u8 => try Diagnostics.formatString(w, fmt[i..], arg),
|
|
463
463
|
Tree.Token.Id => try formatTokenId(w, fmt[i..], arg),
|
|
@@ -3048,25 +3048,25 @@ fn dumpAttribute(tree: *const Tree, attr: Attribute, w: *std.Io.Writer) !void {
|
|
|
3048
3048
|
switch (attr.tag) {
|
|
3049
3049
|
inline else => |tag| {
|
|
3050
3050
|
const args = @field(attr.args, @tagName(tag));
|
|
3051
|
-
const
|
|
3052
|
-
if (
|
|
3051
|
+
const args_info = @typeInfo(@TypeOf(args)).@"struct";
|
|
3052
|
+
if (args_info.field_names.len == 0) {
|
|
3053
3053
|
try w.writeByte('\n');
|
|
3054
3054
|
return;
|
|
3055
3055
|
}
|
|
3056
3056
|
try w.writeByte(' ');
|
|
3057
|
-
inline for (
|
|
3058
|
-
if (comptime std.mem.eql(u8,
|
|
3057
|
+
inline for (args_info.field_names, args_info.field_types, 0..) |f_name, f_type, i| {
|
|
3058
|
+
if (comptime std.mem.eql(u8, f_name, "__name_tok")) continue;
|
|
3059
3059
|
if (i != 0) {
|
|
3060
3060
|
try w.writeAll(", ");
|
|
3061
3061
|
}
|
|
3062
|
-
try w.writeAll(
|
|
3062
|
+
try w.writeAll(f_name);
|
|
3063
3063
|
try w.writeAll(": ");
|
|
3064
|
-
switch (
|
|
3065
|
-
Interner.Ref => try w.print("\"{s}\"", .{tree.interner.get(@field(args,
|
|
3066
|
-
?Interner.Ref => try w.print("\"{?s}\"", .{if (@field(args,
|
|
3067
|
-
else => switch (@typeInfo(
|
|
3068
|
-
.@"enum" => try w.writeAll(@tagName(@field(args,
|
|
3069
|
-
else => try w.print("{any}", .{@field(args,
|
|
3064
|
+
switch (f_type) {
|
|
3065
|
+
Interner.Ref => try w.print("\"{s}\"", .{tree.interner.get(@field(args, f_name)).bytes}),
|
|
3066
|
+
?Interner.Ref => try w.print("\"{?s}\"", .{if (@field(args, f_name)) |str| tree.interner.get(str).bytes else null}),
|
|
3067
|
+
else => switch (@typeInfo(f_type)) {
|
|
3068
|
+
.@"enum" => try w.writeAll(@tagName(@field(args, f_name))),
|
|
3069
|
+
else => try w.print("{any}", .{@field(args, f_name)}),
|
|
3070
3070
|
},
|
|
3071
3071
|
}
|
|
3072
3072
|
}
|
|
@@ -46,8 +46,8 @@ pub fn hasFeature(comp: *Compilation, ext: []const u8) bool {
|
|
|
46
46
|
.c_thread_local = comp.langopts.standard.atLeast(.c11) and comp.target.isTlsSupported(),
|
|
47
47
|
.bounds_attributes = comp.langopts.bounds_safety == .clang,
|
|
48
48
|
};
|
|
49
|
-
inline for (@typeInfo(@TypeOf(list)).@"struct".
|
|
50
|
-
if (std.mem.eql(u8,
|
|
49
|
+
inline for (@typeInfo(@TypeOf(list)).@"struct".field_names) |f_name| {
|
|
50
|
+
if (std.mem.eql(u8, f_name, ext)) return @field(list, f_name);
|
|
51
51
|
}
|
|
52
52
|
return false;
|
|
53
53
|
}
|
|
@@ -70,8 +70,8 @@ pub fn hasExtension(comp: *Compilation, ext: []const u8) bool {
|
|
|
70
70
|
.matrix_types = false, // TODO
|
|
71
71
|
.matrix_types_scalar_division = false, // TODO
|
|
72
72
|
};
|
|
73
|
-
inline for (@typeInfo(@TypeOf(list)).@"struct".
|
|
74
|
-
if (std.mem.eql(u8,
|
|
73
|
+
inline for (@typeInfo(@TypeOf(list)).@"struct".field_names) |f_name| {
|
|
74
|
+
if (std.mem.eql(u8, f_name, ext)) return @field(list, f_name);
|
|
75
75
|
}
|
|
76
76
|
return false;
|
|
77
77
|
}
|
|
@@ -335,8 +335,8 @@ pub const Parser = struct {
|
|
|
335
335
|
|
|
336
336
|
fn formatArgs(w: *std.Io.Writer, fmt: []const u8, args: anytype) !void {
|
|
337
337
|
var i: usize = 0;
|
|
338
|
-
inline for (std.meta.
|
|
339
|
-
const arg = @field(args,
|
|
338
|
+
inline for (comptime std.meta.fieldNames(@TypeOf(args))) |arg_name| {
|
|
339
|
+
const arg = @field(args, arg_name);
|
|
340
340
|
i += switch (@TypeOf(arg)) {
|
|
341
341
|
[]const u8 => try Diagnostics.formatString(w, fmt[i..], arg),
|
|
342
342
|
Ascii => try arg.format(w, fmt[i..]),
|
|
@@ -733,7 +733,7 @@ pub fn put(i: *Interner, gpa: Allocator, key: Key) !Ref {
|
|
|
733
733
|
});
|
|
734
734
|
},
|
|
735
735
|
.record_ty => |elems| {
|
|
736
|
-
try i.extra.ensureUnusedCapacity(gpa, @typeInfo(Tag.Record).@"struct".
|
|
736
|
+
try i.extra.ensureUnusedCapacity(gpa, @typeInfo(Tag.Record).@"struct".field_names.len +
|
|
737
737
|
elems.len);
|
|
738
738
|
i.items.appendAssumeCapacity(.{
|
|
739
739
|
.tag = .record_ty,
|
|
@@ -755,18 +755,19 @@ pub fn put(i: *Interner, gpa: Allocator, key: Key) !Ref {
|
|
|
755
755
|
}
|
|
756
756
|
|
|
757
757
|
fn addExtra(i: *Interner, gpa: Allocator, extra: anytype) Allocator.Error!u32 {
|
|
758
|
-
const
|
|
759
|
-
try i.extra.ensureUnusedCapacity(gpa,
|
|
758
|
+
const field_count = @typeInfo(@TypeOf(extra)).@"struct".field_names.len;
|
|
759
|
+
try i.extra.ensureUnusedCapacity(gpa, field_count);
|
|
760
760
|
return i.addExtraAssumeCapacity(extra);
|
|
761
761
|
}
|
|
762
762
|
|
|
763
763
|
fn addExtraAssumeCapacity(i: *Interner, extra: anytype) u32 {
|
|
764
764
|
const result = @as(u32, @intCast(i.extra.items.len));
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
765
|
+
const info = @typeInfo(@TypeOf(extra)).@"struct";
|
|
766
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
767
|
+
i.extra.appendAssumeCapacity(switch (field_type) {
|
|
768
|
+
Ref => @intFromEnum(@field(extra, field_name)),
|
|
769
|
+
u32 => @field(extra, field_name),
|
|
770
|
+
else => @compileError("bad field type: " ++ @typeName(field_type)),
|
|
770
771
|
});
|
|
771
772
|
}
|
|
772
773
|
return result;
|
|
@@ -891,17 +892,17 @@ fn extraData(i: *const Interner, comptime T: type, index: usize) T {
|
|
|
891
892
|
|
|
892
893
|
fn extraDataTrail(i: *const Interner, comptime T: type, index: usize) struct { data: T, end: u32 } {
|
|
893
894
|
var result: T = undefined;
|
|
894
|
-
const
|
|
895
|
-
inline for (
|
|
895
|
+
const info = @typeInfo(T).@"struct";
|
|
896
|
+
inline for (info.field_names, info.field_types, 0..) |field_name, field_type, field_i| {
|
|
896
897
|
const int32 = i.extra.items[field_i + index];
|
|
897
|
-
@field(result,
|
|
898
|
+
@field(result, field_name) = switch (field_type) {
|
|
898
899
|
Ref => @enumFromInt(int32),
|
|
899
900
|
u32 => int32,
|
|
900
|
-
else => @compileError("bad field type: " ++ @typeName(
|
|
901
|
+
else => @compileError("bad field type: " ++ @typeName(field_type)),
|
|
901
902
|
};
|
|
902
903
|
}
|
|
903
904
|
return .{
|
|
904
905
|
.data = result,
|
|
905
|
-
.end = @intCast(index +
|
|
906
|
+
.end = @intCast(index + info.field_names.len),
|
|
906
907
|
};
|
|
907
908
|
}
|
package/compiler/configurer.zig
CHANGED
|
@@ -601,8 +601,8 @@ const Serialize = struct {
|
|
|
601
601
|
dest_module.* = try addModule(s, src_module);
|
|
602
602
|
}
|
|
603
603
|
|
|
604
|
-
comptime assert(std.mem.eql(u8, @typeInfo(Configuration.Module).@"struct".
|
|
605
|
-
comptime assert(@typeInfo(Configuration.Module).@"struct".
|
|
604
|
+
comptime assert(std.mem.eql(u8, @typeInfo(Configuration.Module).@"struct".field_names[2], "import_table"));
|
|
605
|
+
comptime assert(@typeInfo(Configuration.Module).@"struct".field_types[2] == Configuration.ImportTable.Index);
|
|
606
606
|
assert(wc.extra.items[@intFromEnum(module_index) + 2] == @intFromEnum(Configuration.ImportTable.Index.invalid));
|
|
607
607
|
const import_table_index = try wc.addDeduped(Configuration.ImportTable, .{
|
|
608
608
|
.imports = .{ .mal = imports },
|
|
@@ -241,8 +241,9 @@ pub const Compression = enum(u32) {
|
|
|
241
241
|
};
|
|
242
242
|
|
|
243
243
|
fn structFieldsLittleToNative(comptime T: type, x: *T) void {
|
|
244
|
-
|
|
245
|
-
|
|
244
|
+
const info = @typeInfo(T).@"struct";
|
|
245
|
+
inline for (info.field_names, info.field_types) |field_name, field_type| {
|
|
246
|
+
@field(x, field_name) = std.mem.littleToNative(field_type, @field(x, field_name));
|
|
246
247
|
}
|
|
247
248
|
}
|
|
248
249
|
|
|
@@ -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
|
}
|