From 4f16553410315a834e292adbb12b3b2de1f38690 Mon Sep 17 00:00:00 2001 From: Emil Lerch Date: Thu, 20 Mar 2025 08:18:37 -0700 Subject: [PATCH] update to zig 0.14.0 --- .envrc | 2 +- .github/workflows/build.yaml | 9 ++--- .github/workflows/zig-mach.yaml | 4 +- .github/workflows/zig-nightly.yaml | 2 +- .github/workflows/zig-previous.yaml | 20 ++++++++++ build.zig.zon | 7 ++-- codegen/src/main.zig | 2 +- src/aws.zig | 60 +++++++++++++++-------------- src/aws_signing.zig | 11 +++--- src/json.zig | 24 ++++++------ src/servicemodel.zig | 2 +- src/url.zig | 9 +++-- src/xml.zig | 5 ++- src/xml_shaper.zig | 8 ++-- 14 files changed, 97 insertions(+), 68 deletions(-) create mode 100644 .github/workflows/zig-previous.yaml diff --git a/.envrc b/.envrc index 7296f66..0a1a003 100644 --- a/.envrc +++ b/.envrc @@ -5,4 +5,4 @@ if ! has zvm_direnv_version || ! zvm_direnv_version 1.0.0; then source_url "https://git.lerch.org/lobo/zvm-direnv/raw/tag/1.0.0/direnvrc" "sha256-Gtddvcr6aJsrjKd53uChxA1reQmJgEBpmPUWmMdtDIQ=" fi -use zig 2024.11.0-mach +use zig 0.14.0 diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2ae3b87..313e87b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,11 +1,10 @@ -name: AWS-Zig Build +name: Current zig version build on: push: branches: - - '*' - - '!zig-develop*' + - 'master' jobs: - build-zig-0-12-0-amd64: + build-amd64: runs-on: ubuntu-latest if: ${{ github.env.GITEA_ACTIONS != 'true' }} steps: @@ -14,7 +13,7 @@ jobs: - name: Setup Zig uses: mlugg/setup-zig@v1.2.1 with: - version: 0.13.0 + version: 0.14.0 - name: Run tests run: zig build test -Dbroken-windows --verbose # Github runners try to run the windows tests despite disabling foreign checks - name: Build example diff --git a/.github/workflows/zig-mach.yaml b/.github/workflows/zig-mach.yaml index 0a950eb..0d7e65e 100644 --- a/.github/workflows/zig-mach.yaml +++ b/.github/workflows/zig-mach.yaml @@ -1,8 +1,8 @@ -name: aws-zig mach nominated build +name: Latest mach nominated zig version build on: push: branches: - - 'zig-develop*' + - 'zig-mach*' jobs: build-zig-mach-latest: runs-on: ubuntu-latest diff --git a/.github/workflows/zig-nightly.yaml b/.github/workflows/zig-nightly.yaml index b636bc1..772f6b4 100644 --- a/.github/workflows/zig-nightly.yaml +++ b/.github/workflows/zig-nightly.yaml @@ -1,4 +1,4 @@ -name: aws-zig nightly build +name: Nightly zig version Build on: push: branches: diff --git a/.github/workflows/zig-previous.yaml b/.github/workflows/zig-previous.yaml new file mode 100644 index 0000000..e6f8096 --- /dev/null +++ b/.github/workflows/zig-previous.yaml @@ -0,0 +1,20 @@ +name: Previous zig version Build +on: + push: + branches: + - 'zig-0.13' +jobs: + build-amd64: + runs-on: ubuntu-latest + if: ${{ github.env.GITEA_ACTIONS != 'true' }} + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Setup Zig + uses: mlugg/setup-zig@v1.2.1 + with: + version: 0.13.0 + - name: Run tests + run: zig build test -Dbroken-windows --verbose # Github runners try to run the windows tests despite disabling foreign checks + - name: Build example + run: ( cd example && zig build ) # Make sure example builds diff --git a/build.zig.zon b/build.zig.zon index f678894..288e690 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,6 +1,7 @@ .{ - .name = "aws", + .name = .aws, .version = "0.0.1", + .fingerprint = 0x1f26b7b27005bb49, .paths = .{ "build.zig", "build.zig.zon", @@ -11,8 +12,8 @@ .dependencies = .{ .smithy = .{ - .url = "https://git.lerch.org/lobo/smithy/archive/3ed98751bc414e005af6ad185feb213d4366c0db.tar.gz", - .hash = "12204a784751a4ad5ed6c8955ba91fcbc4a3cad6c5a7da38f39abf074ef801d13172", + .url = "https://git.lerch.org/lobo/smithy/archive/a4c6ec6dfe552c57bab601c7d99e8de02bbab1fe.tar.gz", + .hash = "smithy-1.0.0-uAyBgS_MAgC4qgc9QaEy5Y5Nf7kv32buQZBYugqNQsAn", }, .models = .{ .url = "https://github.com/aws/aws-sdk-go-v2/archive/58cf6509525a12d64fd826da883bfdbacbd2f00e.tar.gz", diff --git a/codegen/src/main.zig b/codegen/src/main.zig index 36f12af..f9b034a 100644 --- a/codegen/src/main.zig +++ b/codegen/src/main.zig @@ -435,7 +435,7 @@ fn generateServices(allocator: std.mem.Allocator, comptime _: []const u8, file: fn generateAdditionalTypes(allocator: std.mem.Allocator, file_state: FileGenerationState, writer: anytype) !void { // More types may be added during processing - while (file_state.additional_types_to_generate.popOrNull()) |t| { + while (file_state.additional_types_to_generate.pop()) |t| { if (file_state.additional_types_generated.getEntry(t.name) != null) continue; // std.log.info("\t\t{s}", .{t.name}); var type_stack = std.ArrayList(*const smithy.ShapeInfo).init(allocator); diff --git a/src/aws.zig b/src/aws.zig index 2f07896..424e7b2 100644 --- a/src/aws.zig +++ b/src/aws.zig @@ -263,9 +263,9 @@ pub fn Request(comptime request_action: anytype) type { fn callJson(request: ActionRequest, options: Options) !FullResponseType { const target = try std.fmt.allocPrint(options.client.allocator, "{s}.{s}", .{ - Self.service_meta.name, - action.action_name, - }); + Self.service_meta.name, + action.action_name, + }); defer options.client.allocator.free(target); var buffer = std.ArrayList(u8).init(options.client.allocator); @@ -326,11 +326,11 @@ pub fn Request(comptime request_action: anytype) type { // originally? const body = try std.fmt.allocPrint(options.client.allocator, "Action={s}&Version={s}{s}{s}", .{ - action.action_name, - Self.service_meta.version, - continuation, - buffer.items, - }); + action.action_name, + Self.service_meta.version, + continuation, + buffer.items, + }); defer options.client.allocator.free(body); return try Self.callAws(.{ .query = query, @@ -739,20 +739,20 @@ pub fn Request(comptime request_action: anytype) type { errdefer options.client.allocator.destroy(ptr); @field(ptr.*, std.meta.fields(action.Response)[0].name) = json.parse(response_types.RawResponse, &stream, parser_options) catch |e| { - log.err( - \\Call successful, but unexpected response from service. - \\This could be the result of a bug or a stale set of code generated - \\service models. - \\ - \\Model Type: {} - \\ - \\Response from server: - \\ - \\{s} - \\ - , .{ action.Response, data }); - return e; - }; + log.err( + \\Call successful, but unexpected response from service. + \\This could be the result of a bug or a stale set of code generated + \\service models. + \\ + \\Model Type: {} + \\ + \\Response from server: + \\ + \\{s} + \\ + , .{ action.Response, data }); + return e; + }; break :blk ptr; }; return ParsedJsonData(response_types.NormalResponse){ @@ -777,8 +777,12 @@ fn coerceFromString(comptime T: type, val: []const u8) anyerror!T { // TODO: This is terrible...fix it switch (T) { bool => return std.ascii.eqlIgnoreCase(val, "true"), - i64 => return parseInt(T, val) catch |e| { - log.err("Invalid string representing i64: {s}", .{val}); + i64, i128 => return parseInt(T, val) catch |e| { + log.err("Invalid string representing {s}: {s}", .{ @typeName(T), val }); + return e; + }, + f64, f128 => return std.fmt.parseFloat(T, val) catch |e| { + log.err("Invalid string representing {s}: {s}", .{ @typeName(T), val }); return e; }, else => return val, @@ -932,14 +936,14 @@ fn ServerResponse(comptime action: anytype) type { .{ .name = action.action_name ++ "Result", .type = T, - .default_value = null, + .default_value_ptr = null, .is_comptime = false, .alignment = 0, }, .{ .name = "ResponseMetadata", .type = ResponseMetadata, - .default_value = null, + .default_value_ptr = null, .is_comptime = false, .alignment = 0, }, @@ -955,7 +959,7 @@ fn ServerResponse(comptime action: anytype) type { .{ .name = action.action_name ++ "Response", .type = Result, - .default_value = null, + .default_value_ptr = null, .is_comptime = false, .alignment = 0, }, @@ -1143,7 +1147,7 @@ fn addQueryArg(comptime ValueType: type, prefix: []const u8, key: []const u8, va }, // if this is a pointer, we want to make sure it is more than just a string .pointer => |ptr| { - if (ptr.child == u8 or ptr.size != .Slice) { + if (ptr.child == u8 or ptr.size != .slice) { // This is just a string return try addBasicQueryArg(prefix, key, value, writer); } diff --git a/src/aws_signing.zig b/src/aws_signing.zig index 4d3ffa7..f504357 100644 --- a/src/aws_signing.zig +++ b/src/aws_signing.zig @@ -662,12 +662,12 @@ fn canonicalUri(allocator: std.mem.Allocator, path: []const u8, double_encode: b } defer allocator.free(encoded_once); var encoded_twice = try encodeUri(allocator, encoded_once); + defer allocator.free(encoded_twice); log.debug("encoded path (2): {s}", .{encoded_twice}); if (std.mem.lastIndexOf(u8, encoded_twice, "?")) |i| { - _ = allocator.resize(encoded_twice, i); - return encoded_twice[0..i]; + return try allocator.dupe(u8, encoded_twice[0..i]); } - return encoded_twice; + return try allocator.dupe(u8, encoded_twice); } fn encodeParamPart(allocator: std.mem.Allocator, path: []const u8) ![]const u8 { @@ -936,6 +936,7 @@ fn canonicalHeaderValue(allocator: std.mem.Allocator, value: []const u8) ![]cons const in_quote = false; var start: usize = 0; const rc = try allocator.alloc(u8, value.len); + defer allocator.free(rc); var rc_inx: usize = 0; for (value, 0..) |c, i| { if (!started and !std.ascii.isWhitespace(c)) { @@ -953,8 +954,7 @@ fn canonicalHeaderValue(allocator: std.mem.Allocator, value: []const u8) ![]cons // Trim end while (std.ascii.isWhitespace(rc[rc_inx - 1])) rc_inx -= 1; - _ = allocator.resize(rc, rc_inx); - return rc[0..rc_inx]; + return try allocator.dupe(u8, rc[0..rc_inx]); } fn lessThan(context: void, lhs: std.http.Header, rhs: std.http.Header) bool { _ = context; @@ -986,6 +986,7 @@ test "canonical uri" { const path = "/documents and settings/?foo=bar"; const expected = "/documents%2520and%2520settings/"; const actual = try canonicalUri(allocator, path, true); + defer allocator.free(actual); try std.testing.expectEqualStrings(expected, actual); diff --git a/src/json.zig b/src/json.zig index 637beef..08cceb3 100644 --- a/src/json.zig +++ b/src/json.zig @@ -1723,7 +1723,7 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options: } inline for (structInfo.fields, 0..) |field, i| { if (!fields_seen[i]) { - if (field.default_value) |default_value_ptr| { + if (field.default_value_ptr) |default_value_ptr| { if (!field.is_comptime) { const default_value = @as(*align(1) const field.type, @ptrCast(default_value_ptr)).*; @field(r, field.name) = default_value; @@ -1773,18 +1773,18 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options: .pointer => |ptrInfo| { const allocator = options.allocator orelse return error.AllocatorRequired; switch (ptrInfo.size) { - .One => { + .one => { const r: T = try allocator.create(ptrInfo.child); errdefer allocator.destroy(r); r.* = try parseInternal(ptrInfo.child, token, tokens, options); return r; }, - .Slice => { + .slice => { switch (token) { .ArrayBegin => { var arraylist = std.ArrayList(ptrInfo.child).init(allocator); errdefer { - while (arraylist.popOrNull()) |v| { + while (arraylist.pop()) |v| { parseFree(ptrInfo.child, v, options); } arraylist.deinit(); @@ -1829,7 +1829,7 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options: if (value_type == null) return error.UnexpectedToken; var arraylist = std.ArrayList(ptrInfo.child).init(allocator); errdefer { - while (arraylist.popOrNull()) |v| { + while (arraylist.pop()) |v| { parseFree(ptrInfo.child, v, options); } arraylist.deinit(); @@ -1879,7 +1879,7 @@ fn isMapPattern(comptime T: type) bool { // Let's just double check before proceeding const ti = @typeInfo(T); if (ti != .pointer) return false; - if (ti.pointer.size != .Slice) return false; + if (ti.pointer.size != .slice) return false; const ti_child = @typeInfo(ti.pointer.child); if (ti_child != .@"struct") return false; if (ti_child.@"struct".fields.len != 2) return false; @@ -1935,11 +1935,11 @@ pub fn parseFree(comptime T: type, value: T, options: ParseOptions) void { .pointer => |ptrInfo| { const allocator = options.allocator orelse unreachable; switch (ptrInfo.size) { - .One => { + .one => { parseFree(ptrInfo.child, value.*, options); allocator.destroy(value); }, - .Slice => { + .slice => { for (value) |v| { parseFree(ptrInfo.child, v, options); } @@ -2284,7 +2284,7 @@ pub const Parser = struct { return; } - var value = p.stack.pop(); + var value = p.stack.pop().?; try p.pushToParent(&value); }, .String => |s| { @@ -2350,7 +2350,7 @@ pub const Parser = struct { return; } - var value = p.stack.pop(); + var value = p.stack.pop().?; try p.pushToParent(&value); }, .ObjectBegin => { @@ -2922,7 +2922,7 @@ pub fn stringify( }, .error_set => return stringify(@as([]const u8, @errorName(value)), options, out_stream), .pointer => |ptr_info| switch (ptr_info.size) { - .One => switch (@typeInfo(ptr_info.child)) { + .one => switch (@typeInfo(ptr_info.child)) { .array => { const Slice = []const std.meta.Elem(ptr_info.child); return stringify(@as(Slice, value), options, out_stream); @@ -2933,7 +2933,7 @@ pub fn stringify( }, }, // TODO: .Many when there is a sentinel (waiting for https://github.com/ziglang/zig/pull/3972) - .Slice => { + .slice => { if (ptr_info.child == u8 and options.string == .String and std.unicode.utf8ValidateSlice(value)) { try out_stream.writeByte('\"'); var i: usize = 0; diff --git a/src/servicemodel.zig b/src/servicemodel.zig index 93cf6db..4f31eda 100644 --- a/src/servicemodel.zig +++ b/src/servicemodel.zig @@ -12,7 +12,7 @@ pub fn Services(comptime service_imports: anytype) type { item.* = .{ .name = @tagName(service_imports[i]), .type = @TypeOf(import_field), - .default_value = &import_field, + .default_value_ptr = &import_field, .is_comptime = false, .alignment = 0, }; diff --git a/src/url.zig b/src/url.zig index ed8e61e..523df1d 100644 --- a/src/url.zig +++ b/src/url.zig @@ -24,10 +24,11 @@ fn encodeStruct( comptime options: EncodingOptions, ) !bool { var rc = first; + var arena = std.heap.ArenaAllocator.init(allocator); + defer arena.deinit(); + const arena_alloc = arena.allocator(); inline for (@typeInfo(@TypeOf(obj)).@"struct".fields) |field| { - const field_name = try options.field_name_transformer(allocator, field.name); - defer if (options.field_name_transformer.* != defaultTransformer) - allocator.free(field_name); + const field_name = try options.field_name_transformer(arena_alloc, field.name); // @compileLog(@typeInfo(field.field_type).Pointer); rc = try encodeInternal(allocator, parent, field_name, rc, @field(obj, field.name), writer, options); } @@ -50,7 +51,7 @@ pub fn encodeInternal( .optional => if (obj) |o| { rc = try encodeInternal(allocator, parent, field_name, first, o, writer, options); }, - .pointer => |ti| if (ti.size == .One) { + .pointer => |ti| if (ti.size == .one) { rc = try encodeInternal(allocator, parent, field_name, first, obj.*, writer, options); } else { if (!first) _ = try writer.write("&"); diff --git a/src/xml.zig b/src/xml.zig index ca6fda4..471f8a3 100644 --- a/src/xml.zig +++ b/src/xml.zig @@ -653,7 +653,10 @@ fn dupeAndUnescape(alloc: Allocator, text: []const u8) ![]const u8 { // This error is not strictly true, but we need to match one of the items // from the error set provided by the other stdlib calls at the calling site - if (!alloc.resize(str, j)) return error.OutOfMemory; + if (!alloc.resize(str, j)) { + defer alloc.free(str); + return alloc.dupe(u8, str[0..j]) catch return error.OutOfMemory; + } return str[0..j]; } diff --git a/src/xml_shaper.zig b/src/xml_shaper.zig index 4a6c29d..fb1b9f6 100644 --- a/src/xml_shaper.zig +++ b/src/xml_shaper.zig @@ -313,13 +313,13 @@ fn parseInternal(comptime T: type, element: *xml.Element, options: ParseOptions) .pointer => |ptr_info| { const allocator = options.allocator orelse return error.AllocatorRequired; switch (ptr_info.size) { - .One => { + .one => { const r: T = try allocator.create(ptr_info.child); errdefer allocator.free(r); r.* = try parseInternal(ptr_info.child, element, options); return r; }, - .Slice => { + .slice => { // TODO: Detect and deal with arrays. This will require two // passes through the element children - one to // determine if it is an array, one to parse the elements @@ -348,10 +348,10 @@ fn parseInternal(comptime T: type, element: *xml.Element, options: ParseOptions) } return try allocator.dupe(u8, element.children.items[0].CharData); }, - .Many => { + .many => { return error.ManyPointerSizeNotImplemented; }, - .C => { + .c => { return error.CPointerSizeNotImplemented; }, }