From 69402977bc605bc9a0b438799577d7fb1f2d5374 Mon Sep 17 00:00:00 2001 From: Peter Lef Date: Mon, 24 Jul 2023 00:18:16 -0400 Subject: [PATCH] Fix overwriting of pointer optionality --- generator/vulkan/parse.zig | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/generator/vulkan/parse.zig b/generator/vulkan/parse.zig index ddff9eb..4d4fc57 100644 --- a/generator/vulkan/parse.zig +++ b/generator/vulkan/parse.zig @@ -300,6 +300,9 @@ fn lenToPointer(fields: Fields, len: []const u8) std.meta.Tuple(&.{ registry.Poi } fn parsePointerMeta(fields: Fields, type_info: *registry.TypeInfo, elem: *xml.Element) !void { + + var len_attribute_depth: usize = 0; + if (elem.getAttribute("len")) |lens| { var it = mem.split(u8, lens, ","); var current_type_info = type_info; @@ -311,7 +314,9 @@ fn parsePointerMeta(fields: Fields, type_info: *registry.TypeInfo, elem: *xml.El break :blk size_optional[0]; } else .many; current_type_info.pointer.size = size; + current_type_info = current_type_info.pointer.child; + len_attribute_depth += 1; } if (it.next()) |_| { @@ -322,18 +327,30 @@ fn parsePointerMeta(fields: Fields, type_info: *registry.TypeInfo, elem: *xml.El } } + + var current_depth: usize = 0; + if (elem.getAttribute("optional")) |optionals| { var it = mem.split(u8, optionals, ","); var current_type_info = type_info; while (current_type_info.* == .pointer) { if (it.next()) |current_optional| { - current_type_info.pointer.is_optional = mem.eql(u8, current_optional, "true"); + + // The pointer may have already been marked as optional due to its `len` attribute. + var is_already_optional = false; + if (current_depth < len_attribute_depth) + is_already_optional = current_type_info.pointer.is_optional; + + current_type_info.pointer.is_optional = + is_already_optional or mem.eql(u8, current_optional, "true"); + } else { // There is no information for this pointer, probably incorrect. return error.InvalidRegistry; } current_type_info = current_type_info.pointer.child; + current_depth += 1; } } }