@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
package/std/zon/Serializer.zig
CHANGED
|
@@ -165,7 +165,7 @@ pub fn valueArbitraryDepth(self: *Serializer, val: anytype, options: ValueOption
|
|
|
165
165
|
},
|
|
166
166
|
.@"struct" => |@"struct"| if (@"struct".is_tuple) {
|
|
167
167
|
var container = try self.beginTuple(
|
|
168
|
-
.{ .whitespace_style = .{ .fields = @"struct".
|
|
168
|
+
.{ .whitespace_style = .{ .fields = @"struct".field_names.len } },
|
|
169
169
|
);
|
|
170
170
|
inline for (val) |field_value| {
|
|
171
171
|
try container.fieldArbitraryDepth(field_value, options);
|
|
@@ -173,15 +173,20 @@ pub fn valueArbitraryDepth(self: *Serializer, val: anytype, options: ValueOption
|
|
|
173
173
|
try container.end();
|
|
174
174
|
} else {
|
|
175
175
|
// Decide which fields to emit
|
|
176
|
-
const fields, const skipped: [@"struct".
|
|
177
|
-
break :b .{ @"struct".
|
|
176
|
+
const fields, const skipped: [@"struct".field_names.len]bool = if (options.emit_default_optional_fields) b: {
|
|
177
|
+
break :b .{ @"struct".field_names.len, @splat(false) };
|
|
178
178
|
} else b: {
|
|
179
|
-
var fields = @"struct".
|
|
180
|
-
var skipped: [@"struct".
|
|
181
|
-
inline for (
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
179
|
+
var fields = @"struct".field_names.len;
|
|
180
|
+
var skipped: [@"struct".field_names.len]bool = @splat(false);
|
|
181
|
+
inline for (
|
|
182
|
+
@"struct".field_names,
|
|
183
|
+
@"struct".field_types,
|
|
184
|
+
@"struct".field_attrs,
|
|
185
|
+
&skipped,
|
|
186
|
+
) |field_name, field_type, field_attrs, *skip| {
|
|
187
|
+
if (field_attrs.default_value_ptr) |ptr| {
|
|
188
|
+
const default: *const field_type = @ptrCast(@alignCast(ptr));
|
|
189
|
+
const field_value = @field(val, field_name);
|
|
185
190
|
if (std.meta.eql(field_value, default.*)) {
|
|
186
191
|
skip.* = true;
|
|
187
192
|
fields -= 1;
|
|
@@ -195,11 +200,11 @@ pub fn valueArbitraryDepth(self: *Serializer, val: anytype, options: ValueOption
|
|
|
195
200
|
var container = try self.beginStruct(
|
|
196
201
|
.{ .whitespace_style = .{ .fields = fields } },
|
|
197
202
|
);
|
|
198
|
-
inline for (@"struct".
|
|
203
|
+
inline for (@"struct".field_names, skipped) |field_name, skip| {
|
|
199
204
|
if (!skip) {
|
|
200
205
|
try container.fieldArbitraryDepth(
|
|
201
|
-
|
|
202
|
-
@field(val,
|
|
206
|
+
field_name,
|
|
207
|
+
@field(val, field_name),
|
|
203
208
|
options,
|
|
204
209
|
);
|
|
205
210
|
}
|
|
@@ -713,11 +718,11 @@ fn typeIsRecursiveInner(comptime T: type, comptime prev_visited: []const type) b
|
|
|
713
718
|
.optional => |optional| typeIsRecursiveInner(optional.child, visited),
|
|
714
719
|
.array => |array| typeIsRecursiveInner(array.child, visited),
|
|
715
720
|
.vector => |vector| typeIsRecursiveInner(vector.child, visited),
|
|
716
|
-
.@"struct" => |@"struct"| for (@"struct".
|
|
717
|
-
if (typeIsRecursiveInner(
|
|
721
|
+
.@"struct" => |@"struct"| for (@"struct".field_types) |field_type| {
|
|
722
|
+
if (typeIsRecursiveInner(field_type, visited)) break true;
|
|
718
723
|
} else false,
|
|
719
|
-
.@"union" => |@"union"| inline for (@"union".
|
|
720
|
-
if (typeIsRecursiveInner(
|
|
724
|
+
.@"union" => |@"union"| inline for (@"union".field_types) |field_type| {
|
|
725
|
+
if (typeIsRecursiveInner(field_type, visited)) break true;
|
|
721
726
|
} else false,
|
|
722
727
|
else => false,
|
|
723
728
|
};
|
|
@@ -761,8 +766,8 @@ fn checkValueDepth(val: anytype, depth: usize) error{ExceededMaxDepth}!void {
|
|
|
761
766
|
.array => for (val) |item| {
|
|
762
767
|
try checkValueDepth(item, child_depth);
|
|
763
768
|
},
|
|
764
|
-
.@"struct" => |@"struct"| inline for (@"struct".
|
|
765
|
-
try checkValueDepth(@field(val,
|
|
769
|
+
.@"struct" => |@"struct"| inline for (@"struct".field_names) |field_name| {
|
|
770
|
+
try checkValueDepth(@field(val, field_name), child_depth);
|
|
766
771
|
},
|
|
767
772
|
.@"union" => |@"union"| if (@"union".tag_type == null) {
|
|
768
773
|
return;
|
|
@@ -851,7 +856,7 @@ fn canSerializeTypeInner(
|
|
|
851
856
|
.@"opaque",
|
|
852
857
|
=> false,
|
|
853
858
|
|
|
854
|
-
.@"enum" => |@"enum"| @"enum".
|
|
859
|
+
.@"enum" => |@"enum"| @"enum".mode == .exhaustive,
|
|
855
860
|
|
|
856
861
|
.pointer => |pointer| switch (pointer.size) {
|
|
857
862
|
.one => canSerializeTypeInner(pointer.child, visited, parent_is_optional),
|
|
@@ -870,8 +875,8 @@ fn canSerializeTypeInner(
|
|
|
870
875
|
.@"struct" => |@"struct"| {
|
|
871
876
|
for (visited) |V| if (T == V) return true;
|
|
872
877
|
const new_visited = visited ++ .{T};
|
|
873
|
-
for (@"struct".
|
|
874
|
-
if (!canSerializeTypeInner(
|
|
878
|
+
for (@"struct".field_types) |field_type| {
|
|
879
|
+
if (!canSerializeTypeInner(field_type, new_visited, false)) return false;
|
|
875
880
|
}
|
|
876
881
|
return true;
|
|
877
882
|
},
|
|
@@ -879,8 +884,8 @@ fn canSerializeTypeInner(
|
|
|
879
884
|
for (visited) |V| if (T == V) return true;
|
|
880
885
|
const new_visited = visited ++ .{T};
|
|
881
886
|
if (@"union".tag_type == null) return false;
|
|
882
|
-
for (@"union".
|
|
883
|
-
if (
|
|
887
|
+
for (@"union".field_types) |field_type| {
|
|
888
|
+
if (field_type != void and !canSerializeTypeInner(field_type, new_visited, false)) {
|
|
884
889
|
return false;
|
|
885
890
|
}
|
|
886
891
|
}
|
package/std/zon/parse.zig
CHANGED
|
@@ -437,8 +437,8 @@ pub fn free(gpa: Allocator, value: anytype) void {
|
|
|
437
437
|
const array: [vector.len]vector.child = value;
|
|
438
438
|
freeArray(gpa, @TypeOf(array), &array);
|
|
439
439
|
},
|
|
440
|
-
.@"struct" => |@"struct"| inline for (@"struct".
|
|
441
|
-
free(gpa, @field(value,
|
|
440
|
+
.@"struct" => |@"struct"| inline for (@"struct".field_names) |field_name| {
|
|
441
|
+
free(gpa, @field(value, field_name));
|
|
442
442
|
},
|
|
443
443
|
.@"union" => |@"union"| if (@"union".tag_type == null) {
|
|
444
444
|
if (comptime requiresAllocator(Value)) unreachable;
|
|
@@ -464,13 +464,13 @@ fn requiresAllocator(T: type) bool {
|
|
|
464
464
|
return switch (@typeInfo(T)) {
|
|
465
465
|
.pointer => true,
|
|
466
466
|
.array => |array| return array.len > 0 and requiresAllocator(array.child),
|
|
467
|
-
.@"struct" => |@"struct"| inline for (@"struct".
|
|
468
|
-
if (requiresAllocator(
|
|
467
|
+
.@"struct" => |@"struct"| inline for (@"struct".field_types) |field_type| {
|
|
468
|
+
if (requiresAllocator(field_type)) {
|
|
469
469
|
break true;
|
|
470
470
|
}
|
|
471
471
|
} else false,
|
|
472
|
-
.@"union" => |@"union"| inline for (@"union".
|
|
473
|
-
if (requiresAllocator(
|
|
472
|
+
.@"union" => |@"union"| inline for (@"union".field_types) |field_type| {
|
|
473
|
+
if (requiresAllocator(field_type)) {
|
|
474
474
|
break true;
|
|
475
475
|
}
|
|
476
476
|
} else false,
|
|
@@ -589,9 +589,9 @@ const Parser = struct {
|
|
|
589
589
|
.one => return self.failExpectedTypeInner(pointer.child, opt, node),
|
|
590
590
|
.slice => {
|
|
591
591
|
if (pointer.child == u8 and
|
|
592
|
-
pointer.
|
|
592
|
+
pointer.attrs.@"const" and
|
|
593
593
|
(pointer.sentinel() == null or pointer.sentinel() == 0) and
|
|
594
|
-
(pointer.
|
|
594
|
+
(pointer.attrs.@"align" == null or pointer.attrs.@"align" == 1))
|
|
595
595
|
{
|
|
596
596
|
if (opt) {
|
|
597
597
|
return self.failNode(node, "expected optional string");
|
|
@@ -669,10 +669,10 @@ const Parser = struct {
|
|
|
669
669
|
switch (node.get(self.zoir)) {
|
|
670
670
|
.enum_literal => |field_name| {
|
|
671
671
|
// Create a comptime string map for the enum fields
|
|
672
|
-
const
|
|
673
|
-
comptime var kvs_list: [
|
|
674
|
-
inline for (
|
|
675
|
-
kvs_list[i] = .{
|
|
672
|
+
const enum_info = @typeInfo(T).@"enum";
|
|
673
|
+
comptime var kvs_list: [enum_info.field_names.len]struct { []const u8, T } = undefined;
|
|
674
|
+
inline for (enum_info.field_names, enum_info.field_values, 0..) |enum_field_name, enum_field_value, i| {
|
|
675
|
+
kvs_list[i] = .{ enum_field_name, @enumFromInt(enum_field_value) };
|
|
676
676
|
}
|
|
677
677
|
const enum_tags = std.StaticStringMap(T).initComptime(kvs_list);
|
|
678
678
|
|
|
@@ -715,9 +715,9 @@ const Parser = struct {
|
|
|
715
715
|
|
|
716
716
|
if (pointer.child != u8 or
|
|
717
717
|
pointer.size != .slice or
|
|
718
|
-
!pointer.
|
|
718
|
+
!pointer.attrs.@"const" or
|
|
719
719
|
(pointer.sentinel() != null and pointer.sentinel() != 0) or
|
|
720
|
-
(pointer.
|
|
720
|
+
(pointer.attrs.@"align" != null and pointer.attrs.@"align" != 1))
|
|
721
721
|
{
|
|
722
722
|
return error.WrongType;
|
|
723
723
|
}
|
|
@@ -742,7 +742,7 @@ const Parser = struct {
|
|
|
742
742
|
const slice = try self.gpa.allocWithOptions(
|
|
743
743
|
pointer.child,
|
|
744
744
|
nodes.len,
|
|
745
|
-
.fromByteUnitsOptional(pointer.
|
|
745
|
+
.fromByteUnitsOptional(pointer.attrs.@"align"),
|
|
746
746
|
pointer.sentinel(),
|
|
747
747
|
);
|
|
748
748
|
errdefer self.gpa.free(slice);
|
|
@@ -808,30 +808,30 @@ const Parser = struct {
|
|
|
808
808
|
else => return error.WrongType,
|
|
809
809
|
};
|
|
810
810
|
|
|
811
|
-
const
|
|
811
|
+
const info = @typeInfo(T).@"struct";
|
|
812
812
|
|
|
813
813
|
// Build a map from field name to index.
|
|
814
814
|
// The special value `comptime_field` indicates that this is actually a comptime field.
|
|
815
815
|
const comptime_field = std.math.maxInt(usize);
|
|
816
816
|
const field_indices: std.StaticStringMap(usize) = comptime b: {
|
|
817
|
-
var kvs_list: [
|
|
818
|
-
for (&kvs_list,
|
|
819
|
-
kv.* = .{
|
|
817
|
+
var kvs_list: [info.field_names.len]struct { []const u8, usize } = undefined;
|
|
818
|
+
for (&kvs_list, info.field_names, info.field_attrs, 0..) |*kv, field_name, field_attrs, i| {
|
|
819
|
+
kv.* = .{ field_name, if (field_attrs.@"comptime") comptime_field else i };
|
|
820
820
|
}
|
|
821
821
|
break :b .initComptime(kvs_list);
|
|
822
822
|
};
|
|
823
823
|
|
|
824
824
|
// Parse the struct
|
|
825
825
|
var result: T = undefined;
|
|
826
|
-
var field_found: [
|
|
826
|
+
var field_found: [info.field_names.len]bool = @splat(false);
|
|
827
827
|
|
|
828
828
|
// If we fail partway through, free all already initialized fields
|
|
829
829
|
var initialized: usize = 0;
|
|
830
|
-
errdefer if (self.options.free_on_error and
|
|
830
|
+
errdefer if (self.options.free_on_error and info.field_names.len > 0) {
|
|
831
831
|
for (fields.names[0..initialized]) |name_runtime| {
|
|
832
832
|
switch (field_indices.get(name_runtime.get(self.zoir)) orelse continue) {
|
|
833
|
-
inline 0...(
|
|
834
|
-
const name =
|
|
833
|
+
inline 0...(info.field_names.len - 1) => |name_index| {
|
|
834
|
+
const name = info.field_names[name_index];
|
|
835
835
|
free(self.gpa, @field(result, name));
|
|
836
836
|
},
|
|
837
837
|
else => unreachable, // Can't be out of bounds
|
|
@@ -856,11 +856,11 @@ const Parser = struct {
|
|
|
856
856
|
field_found[field_index] = true;
|
|
857
857
|
|
|
858
858
|
switch (field_index) {
|
|
859
|
-
inline 0...(
|
|
860
|
-
if (
|
|
859
|
+
inline 0...(info.field_names.len - 1) => |j| {
|
|
860
|
+
if (info.field_attrs[j].@"comptime") unreachable;
|
|
861
861
|
|
|
862
|
-
@field(result,
|
|
863
|
-
|
|
862
|
+
@field(result, info.field_names[j]) = try self.parseExpr(
|
|
863
|
+
info.field_types[j],
|
|
864
864
|
fields.vals.at(@intCast(i)),
|
|
865
865
|
);
|
|
866
866
|
},
|
|
@@ -873,15 +873,14 @@ const Parser = struct {
|
|
|
873
873
|
// Fill in any missing default fields
|
|
874
874
|
inline for (field_found, 0..) |found, i| {
|
|
875
875
|
if (!found) {
|
|
876
|
-
const
|
|
877
|
-
if (
|
|
878
|
-
|
|
879
|
-
@field(result, field_info.name) = typed.*;
|
|
876
|
+
const field_attrs = info.field_attrs[i];
|
|
877
|
+
if (field_attrs.defaultValue(info.field_types[i])) |default| {
|
|
878
|
+
@field(result, info.field_names[i]) = default;
|
|
880
879
|
} else {
|
|
881
880
|
return self.failNodeFmt(
|
|
882
881
|
node,
|
|
883
882
|
"missing required field {s}",
|
|
884
|
-
.{
|
|
883
|
+
.{info.field_names[i]},
|
|
885
884
|
);
|
|
886
885
|
}
|
|
887
886
|
}
|
|
@@ -898,22 +897,21 @@ const Parser = struct {
|
|
|
898
897
|
};
|
|
899
898
|
|
|
900
899
|
var result: T = undefined;
|
|
901
|
-
const
|
|
900
|
+
const info = @typeInfo(T).@"struct";
|
|
902
901
|
|
|
903
|
-
if (nodes.len >
|
|
902
|
+
if (nodes.len > info.field_names.len) {
|
|
904
903
|
return self.failNodeFmt(
|
|
905
|
-
nodes.at(
|
|
904
|
+
nodes.at(info.field_names.len),
|
|
906
905
|
"index {} outside of tuple length {}",
|
|
907
|
-
.{
|
|
906
|
+
.{ info.field_names.len, info.field_names.len },
|
|
908
907
|
);
|
|
909
908
|
}
|
|
910
909
|
|
|
911
|
-
inline for (0..
|
|
910
|
+
inline for (0..info.field_names.len) |i| {
|
|
912
911
|
// Check if we're out of bounds
|
|
913
912
|
if (i >= nodes.len) {
|
|
914
|
-
if (
|
|
915
|
-
|
|
916
|
-
@field(result, field_infos[i].name) = typed.*;
|
|
913
|
+
if (info.field_attrs[i].defaultValue(info.field_types[i])) |default| {
|
|
914
|
+
@field(result, info.field_names[i]) = default;
|
|
917
915
|
} else {
|
|
918
916
|
return self.failNodeFmt(node, "missing tuple field with index {}", .{i});
|
|
919
917
|
}
|
|
@@ -926,10 +924,10 @@ const Parser = struct {
|
|
|
926
924
|
}
|
|
927
925
|
};
|
|
928
926
|
|
|
929
|
-
if (
|
|
927
|
+
if (info.field_attrs[i].@"comptime") {
|
|
930
928
|
return self.failComptimeField(node, i);
|
|
931
929
|
} else {
|
|
932
|
-
result[i] = try self.parseExpr(
|
|
930
|
+
result[i] = try self.parseExpr(info.field_types[i], nodes.at(i));
|
|
933
931
|
}
|
|
934
932
|
}
|
|
935
933
|
}
|
|
@@ -939,15 +937,14 @@ const Parser = struct {
|
|
|
939
937
|
|
|
940
938
|
fn parseUnion(self: *@This(), T: type, node: Zoir.Node.Index) !T {
|
|
941
939
|
const @"union" = @typeInfo(T).@"union";
|
|
942
|
-
const field_infos = @"union".fields;
|
|
943
940
|
|
|
944
|
-
if (
|
|
941
|
+
if (@"union".field_names.len == 0) comptime unreachable;
|
|
945
942
|
|
|
946
943
|
// Gather info on the fields
|
|
947
944
|
const field_indices = b: {
|
|
948
|
-
comptime var kvs_list: [
|
|
949
|
-
inline for (
|
|
950
|
-
kvs_list[i] = .{
|
|
945
|
+
comptime var kvs_list: [@"union".field_names.len]struct { []const u8, usize } = undefined;
|
|
946
|
+
inline for (@"union".field_names, 0..) |field_name, i| {
|
|
947
|
+
kvs_list[i] = .{ field_name, i };
|
|
951
948
|
}
|
|
952
949
|
break :b std.StaticStringMap(usize).initComptime(kvs_list);
|
|
953
950
|
};
|
|
@@ -970,13 +967,13 @@ const Parser = struct {
|
|
|
970
967
|
|
|
971
968
|
// Initialize the union from the given field.
|
|
972
969
|
switch (field_index) {
|
|
973
|
-
inline 0
|
|
970
|
+
inline 0...@"union".field_names.len - 1 => |i| {
|
|
974
971
|
// Fail if the field is not void
|
|
975
|
-
if (
|
|
972
|
+
if (@"union".field_types[i] != void)
|
|
976
973
|
return self.failNode(node, "expected union");
|
|
977
974
|
|
|
978
975
|
// Instantiate the union
|
|
979
|
-
return @unionInit(T,
|
|
976
|
+
return @unionInit(T, @"union".field_names[i], {});
|
|
980
977
|
},
|
|
981
978
|
else => unreachable, // Can't be out of bounds
|
|
982
979
|
}
|
|
@@ -994,12 +991,12 @@ const Parser = struct {
|
|
|
994
991
|
return self.failUnexpected(T, "field", node, 0, field_name_str);
|
|
995
992
|
|
|
996
993
|
switch (field_index) {
|
|
997
|
-
inline 0
|
|
998
|
-
if (
|
|
994
|
+
inline 0...@"union".field_names.len - 1 => |i| {
|
|
995
|
+
if (@"union".field_types[i] == void) {
|
|
999
996
|
return self.failNode(field_val, "expected type 'void'");
|
|
1000
997
|
} else {
|
|
1001
|
-
const value = try self.parseExpr(
|
|
1002
|
-
return @unionInit(T,
|
|
998
|
+
const value = try self.parseExpr(@"union".field_types[i], field_val);
|
|
999
|
+
return @unionInit(T, @"union".field_names[i], value);
|
|
1003
1000
|
}
|
|
1004
1001
|
},
|
|
1005
1002
|
else => unreachable, // Can't be out of bounds
|
|
@@ -1106,7 +1103,7 @@ const Parser = struct {
|
|
|
1106
1103
|
} else self.ast.nodeMainToken(node.getAstNode(self.zoir));
|
|
1107
1104
|
switch (@typeInfo(T)) {
|
|
1108
1105
|
inline .@"struct", .@"union", .@"enum" => |info| {
|
|
1109
|
-
const note: Error.TypeCheckFailure.Note = if (info.
|
|
1106
|
+
const note: Error.TypeCheckFailure.Note = if (info.field_names.len == 0) b: {
|
|
1110
1107
|
break :b .{
|
|
1111
1108
|
.token = token,
|
|
1112
1109
|
.offset = 0,
|
|
@@ -1118,9 +1115,9 @@ const Parser = struct {
|
|
|
1118
1115
|
var buf: std.ArrayList(u8) = try .initCapacity(gpa, 64);
|
|
1119
1116
|
defer buf.deinit(gpa);
|
|
1120
1117
|
try buf.appendSlice(gpa, msg);
|
|
1121
|
-
inline for (info.
|
|
1118
|
+
inline for (info.field_names, 0..) |field_name, i| {
|
|
1122
1119
|
if (i != 0) try buf.appendSlice(gpa, ", ");
|
|
1123
|
-
try buf.print(gpa, "'{f}'", .{std.zig.fmtIdFlags(
|
|
1120
|
+
try buf.print(gpa, "'{f}'", .{std.zig.fmtIdFlags(field_name, .{
|
|
1124
1121
|
.allow_primitive = true,
|
|
1125
1122
|
.allow_underscore = true,
|
|
1126
1123
|
})});
|
|
@@ -1236,8 +1233,8 @@ fn canParseTypeInner(
|
|
|
1236
1233
|
.@"struct" => |@"struct"| {
|
|
1237
1234
|
for (visited) |V| if (T == V) return true;
|
|
1238
1235
|
const new_visited = visited ++ .{T};
|
|
1239
|
-
for (@"struct".
|
|
1240
|
-
if (!
|
|
1236
|
+
for (@"struct".field_types, @"struct".field_attrs) |field_type, field_attrs| {
|
|
1237
|
+
if (!field_attrs.@"comptime" and !canParseTypeInner(field_type, new_visited, false)) {
|
|
1241
1238
|
return false;
|
|
1242
1239
|
}
|
|
1243
1240
|
}
|
|
@@ -1246,8 +1243,8 @@ fn canParseTypeInner(
|
|
|
1246
1243
|
.@"union" => |@"union"| {
|
|
1247
1244
|
for (visited) |V| if (T == V) return true;
|
|
1248
1245
|
const new_visited = visited ++ .{T};
|
|
1249
|
-
for (@"union".
|
|
1250
|
-
if (
|
|
1246
|
+
for (@"union".field_types) |field_type| {
|
|
1247
|
+
if (field_type != void and !canParseTypeInner(field_type, new_visited, false)) {
|
|
1251
1248
|
return false;
|
|
1252
1249
|
}
|
|
1253
1250
|
}
|