authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-07-05 22:44:46+00:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-07-05 22:44:46+00:00
log682fccaaf0413f4daba43b6990494866bd7b9afd
tree141ddbb1f0fb0ceb928a78a002eccdc7fc2e535c
parent27c1e0b453d50f8c242fd1153290a00b74dff018
parent86ef3202dd5f4198411b39abdbea293832ebaad9

Merge branch 'emekoi-windowsver-fix'

closes #5011

3 files changed, 38 insertions(+), 23 deletions(-)

lib/std/target.zig+32
......@@ -101,6 +101,38 @@ pub const Target = struct {
101101 return @enumToInt(ver) >= @enumToInt(self.min) and @enumToInt(ver) <= @enumToInt(self.max);
102102 }
103103 };
104
105 /// This function is defined to serialize a Zig source code representation of this
106 /// type, that, when parsed, will deserialize into the same data.
107 pub fn format(
108 self: WindowsVersion,
109 comptime fmt: []const u8,
110 options: std.fmt.FormatOptions,
111 out_stream: var,
112 ) !void {
113 if (fmt.len > 0 and fmt[0] == 's') {
114 if (
115 @enumToInt(self) >= @enumToInt(WindowsVersion.nt4) and @enumToInt(self) <= @enumToInt(WindowsVersion.win10_19h1)
116 ) {
117 try std.fmt.format(out_stream, ".{}", .{@tagName(self)});
118 } else {
119 try std.fmt.format(out_stream,
120 "@intToEnum(Target.Os.WindowsVersion, {})",
121 .{ @enumToInt(self) }
122 );
123 }
124 } else {
125 if (
126 @enumToInt(self) >= @enumToInt(WindowsVersion.nt4) and @enumToInt(self) <= @enumToInt(WindowsVersion.win10_19h1)
127 ) {
128 try std.fmt.format(out_stream, "WindowsVersion.{}", .{@tagName(self)});
129 } else {
130 try std.fmt.format(out_stream, "WindowsVersion(", .{@typeName(@This())});
131 try std.fmt.format(out_stream, "{}", .{@enumToInt(self)});
132 try out_stream.writeAll(")");
133 }
134 }
135 }
104136 };
105137
106138 pub const LinuxVersionRange = struct {
lib/std/zig/cross_target.zig+2-2
......@@ -514,14 +514,14 @@ pub const CrossTarget = struct {
514514 switch (self.getOsVersionMin()) {
515515 .none => {},
516516 .semver => |v| try result.outStream().print(".{}", .{v}),
517 .windows => |v| try result.outStream().print(".{}", .{@tagName(v)}),
517 .windows => |v| try result.outStream().print("{s}", .{v}),
518518 }
519519 }
520520 if (self.os_version_max) |max| {
521521 switch (max) {
522522 .none => {},
523523 .semver => |v| try result.outStream().print("...{}", .{v}),
524 .windows => |v| try result.outStream().print("...{}", .{@tagName(v)}),
524 .windows => |v| try result.outStream().print("..{s}", .{v}),
525525 }
526526 }
527527
src-self-hosted/stage2.zig+4-21
......@@ -653,23 +653,6 @@ export fn stage2_libc_render(stage1_libc: *Stage2LibCInstallation, output_file:
653653 return .None;
654654}
655655
656fn enumToString(value: var, type_name: []const u8) ![]const u8 {
657 switch (@typeInfo(@TypeOf(value))) {
658 .Enum => |e| {
659 if (e.is_exhaustive) {
660 return std.fmt.allocPrint(std.heap.c_allocator, ".{}", .{@tagName(value)});
661 } else {
662 return std.fmt.allocPrint(
663 std.heap.c_allocator,
664 "@intToEnum({}, {})",
665 .{ type_name, @enumToInt(value) },
666 );
667 }
668 },
669 else => unreachable,
670 }
671}
672
673656// ABI warning
674657const Stage2Target = extern struct {
675658 arch: c_int,
......@@ -887,13 +870,13 @@ const Stage2Target = extern struct {
887870
888871 .windows => try os_builtin_str_buffer.outStream().print(
889872 \\ .windows = .{{
890 \\ .min = {},
891 \\ .max = {},
873 \\ .min = {s},
874 \\ .max = {s},
892875 \\ }}}},
893876 \\
894877 , .{
895 try enumToString(target.os.version_range.windows.min, "Target.Os.WindowsVersion"),
896 try enumToString(target.os.version_range.windows.max, "Target.Os.WindowsVersion"),
878 target.os.version_range.windows.min,
879 target.os.version_range.windows.max,
897880 }),
898881 }
899882 try os_builtin_str_buffer.appendSlice("};\n");