authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-21 21:20:30-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-22 11:33:34-07:00
logddd8d5918890177e0d6e5477c1be3701d5973908
tree24ff6209bb77c61275364d32f52103f65e7ce3bd
parent46af8bd2ba723e4dbcff07e457d2786cd7c74440

tools/gen_spirv_spec: fix wrong use of BoundedArray

It incorrectly, was returning an error, when it actually wanted to assert that the array bounds were not exceeded. Fixed by using ArrayList instead.

1 files changed, 11 insertions(+), 12 deletions(-)

tools/gen_spirv_spec.zig+11-12
......@@ -601,9 +601,8 @@ fn renderFieldName(writer: anytype, operands: []const g.Operand, field_index: us
601601 const operand = operands[field_index];
602602
603603 // Should be enough for all names - adjust as needed.
604 var name_buffer = std.BoundedArray(u8, 64){
605 .buffer = undefined,
606 };
604 var name_backing_buffer: [64]u8 = undefined;
605 var name_buffer = std.ArrayListUnmanaged(u8).initBuffer(&name_backing_buffer);
607606
608607 derive_from_kind: {
609608 // Operand names are often in the json encoded as "'Name'" (with two sets of quotes).
......@@ -617,33 +616,33 @@ fn renderFieldName(writer: anytype, operands: []const g.Operand, field_index: us
617616 // Use the same loop to transform to snake-case.
618617 for (name) |c| {
619618 switch (c) {
620 'a'...'z', '0'...'9' => try name_buffer.append(c),
621 'A'...'Z' => try name_buffer.append(std.ascii.toLower(c)),
622 ' ', '~' => try name_buffer.append('_'),
619 'a'...'z', '0'...'9' => name_buffer.appendAssumeCapacity(c),
620 'A'...'Z' => name_buffer.appendAssumeCapacity(std.ascii.toLower(c)),
621 ' ', '~' => name_buffer.appendAssumeCapacity('_'),
623622 else => break :derive_from_kind,
624623 }
625624 }
626625
627626 // Assume there are no duplicate 'name' fields.
628 try writer.print("{}", .{std.zig.fmtId(name_buffer.slice())});
627 try writer.print("{}", .{std.zig.fmtId(name_buffer.items)});
629628 return;
630629 }
631630
632631 // Translate to snake case.
633 name_buffer.len = 0;
632 name_buffer.items.len = 0;
634633 for (operand.kind, 0..) |c, i| {
635634 switch (c) {
636 'a'...'z', '0'...'9' => try name_buffer.append(c),
635 'a'...'z', '0'...'9' => name_buffer.appendAssumeCapacity(c),
637636 'A'...'Z' => if (i > 0 and std.ascii.isLower(operand.kind[i - 1])) {
638 try name_buffer.appendSlice(&[_]u8{ '_', std.ascii.toLower(c) });
637 name_buffer.appendSliceAssumeCapacity(&[_]u8{ '_', std.ascii.toLower(c) });
639638 } else {
640 try name_buffer.append(std.ascii.toLower(c));
639 name_buffer.appendAssumeCapacity(std.ascii.toLower(c));
641640 },
642641 else => unreachable, // Assume that the name is valid C-syntax (and contains no underscores).
643642 }
644643 }
645644
646 try writer.print("{}", .{std.zig.fmtId(name_buffer.slice())});
645 try writer.print("{}", .{std.zig.fmtId(name_buffer.items)});
647646
648647 // For fields derived from type name, there could be any amount.
649648 // Simply check against all other fields, and if another similar one exists, add a number.