Fix weird bug

This commit is contained in:
Robin Voetter
2020-06-30 20:32:46 +02:00
parent f9d87cc226
commit 023b46751a

View File

@@ -177,17 +177,11 @@ fn parseContainer(allocator: *Allocator, ty: *xml.Element, is_union: bool) !regi
} }
members = allocator.shrink(members, i); members = allocator.shrink(members, i);
const decl_type = registry.DeclarationType{
.container = .{
.fields = members,
.is_union = is_union,
}
};
it = ty.findChildrenByTag("member"); it = ty.findChildrenByTag("member");
for (members) |*member| { for (members) |*member| {
const member_elem = it.next().?; const member_elem = it.next().?;
try parsePointerMeta(decl_type, &member.field_type, member_elem); try parsePointerMeta(.{.container = members}, &member.field_type, member_elem);
// pNext isn't properly marked as optional, so just manually override it, // pNext isn't properly marked as optional, so just manually override it,
if (mem.eql(u8, member.name, "pNext")) { if (mem.eql(u8, member.name, "pNext")) {
@@ -197,7 +191,12 @@ fn parseContainer(allocator: *Allocator, ty: *xml.Element, is_union: bool) !regi
return registry.Declaration { return registry.Declaration {
.name = name, .name = name,
.decl_type = decl_type, .decl_type = .{
.container = .{
.fields = members,
.is_union = is_union,
}
}
}; };
} }
@@ -206,25 +205,32 @@ fn parseFuncPointer(allocator: *Allocator, ty: *xml.Element) !registry.Declarati
return try cparse.parseTypedef(allocator, &xctok); return try cparse.parseTypedef(allocator, &xctok);
} }
fn lenToPointerSize(decl_type: registry.DeclarationType, len: []const u8) registry.Pointer.PointerSize { // For some reason, the DeclarationType cannot be passed to lenToPointerSize, as
switch (decl_type) { // that causes the Zig compiler to generate invalid code for the function. Using a
.command => |command| { // dedicated enum fixes the issue...
for (command.params) |*param| { const Fields = union(enum) {
command: []registry.Command.Param,
container: []registry.Container.Field,
};
fn lenToPointerSize(fields: Fields, len: []const u8) registry.Pointer.PointerSize {
switch (fields) {
.command => |params| {
for (params) |*param| {
if (mem.eql(u8, param.name, len)) { if (mem.eql(u8, param.name, len)) {
param.is_buffer_len = true; param.is_buffer_len = true;
return .{.other_field = param.name}; return .{.other_field = param.name};
} }
} }
}, },
.container => |container| { .container => |members| {
for (container.fields) |*field| { for (members) |*member| {
if (mem.eql(u8, field.name, len)) { if (mem.eql(u8, member.name, len)) {
field.is_buffer_len = true; member.is_buffer_len = true;
return .{.other_field = field.name}; return .{.other_field = member.name};
} }
} }
}, },
else => {},
} }
if (mem.eql(u8, len, "null-terminated")) { if (mem.eql(u8, len, "null-terminated")) {
@@ -234,13 +240,13 @@ fn lenToPointerSize(decl_type: registry.DeclarationType, len: []const u8) regist
} }
} }
fn parsePointerMeta(decl_type: registry.DeclarationType, type_info: *registry.TypeInfo, elem: *xml.Element) !void { fn parsePointerMeta(fields: Fields, type_info: *registry.TypeInfo, elem: *xml.Element) !void {
if (elem.getAttribute("len")) |lens| { if (elem.getAttribute("len")) |lens| {
var it = mem.split(lens, ","); var it = mem.split(lens, ",");
var current_type_info = type_info; var current_type_info = type_info;
while (current_type_info.* == .pointer) { while (current_type_info.* == .pointer) {
// TODO: Check altlen // TODO: Check altlen
const size = if (it.next()) |len_str| lenToPointerSize(decl_type, len_str) else .one; const size = if (it.next()) |len_str| lenToPointerSize(fields, len_str) else .one;
current_type_info.pointer.size = size; current_type_info.pointer.size = size;
current_type_info = current_type_info.pointer.child; current_type_info = current_type_info.pointer.child;
} }
@@ -428,24 +434,23 @@ fn parseCommand(allocator: *Allocator, elem: *xml.Element) !registry.Declaration
&[_][]const u8{}; &[_][]const u8{};
params = allocator.shrink(params, i); params = allocator.shrink(params, i);
var decl_type = registry.DeclarationType{
it = elem.findChildrenByTag("param");
for (params) |*param| {
const param_elem = it.next().?;
try parsePointerMeta(.{.command = params}, &param.param_type, param_elem);
}
return registry.Declaration {
.name = command_decl.name,
.decl_type = .{
.command = .{ .command = .{
.params = params, .params = params,
.return_type = return_type, .return_type = return_type,
.success_codes = success_codes, .success_codes = success_codes,
.error_codes = error_codes, .error_codes = error_codes,
} }
};
it = elem.findChildrenByTag("param");
for (params) |*param| {
const param_elem = it.next().?;
try parsePointerMeta(decl_type, &param.param_type, param_elem);
} }
return registry.Declaration{
.name = command_decl.name,
.decl_type = decl_type,
}; };
} }