From de5909ae8cbe9348e26560199dfa03afd73601a2 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Thu, 8 Oct 2020 14:31:26 +0200 Subject: [PATCH] Handle messages with no args --- scanner.zig | 79 +++++++++++++++++++++++++-------------------- src/client_core.zig | 6 ++-- src/common_core.zig | 2 +- 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/scanner.zig b/scanner.zig index 80ea7ce..8bfbc4a 100644 --- a/scanner.zig +++ b/scanner.zig @@ -192,17 +192,23 @@ const Message = struct { fn emitMessage(message: Message, writer: anytype) !void { try writer.print(".{{ .name = \"{}\", .signature = \"", .{message.name}); for (message.args.items) |arg| try arg.emitSignature(writer); - try writer.writeAll("\", .types = &[_]?*const common.Interface{"); - for (message.args.items) |arg| { - switch (arg.kind) { - .object, .new_id => |interface| if (interface) |i| - try writer.print("&common.{}.{}.interface,", .{ prefix(i), trimPrefix(i) }) - else - try writer.writeAll("null,"), - else => try writer.writeAll("null,"), + try writer.writeAll("\", .types = "); + if (message.args.items.len > 0) { + try writer.writeAll("&[_]?*const common.Interface{"); + for (message.args.items) |arg| { + switch (arg.kind) { + .object, .new_id => |interface| if (interface) |i| + try writer.print("&common.{}.{}.interface,", .{ prefix(i), trimPrefix(i) }) + else + try writer.writeAll("null,"), + else => try writer.writeAll("null,"), + } } + try writer.writeAll("},"); + } else { + try writer.writeAll("null,"); } - try writer.writeAll("}, },"); + try writer.writeAll("},"); } fn emitField(message: Message, target: Target, writer: anytype) !void { @@ -278,39 +284,42 @@ const Message = struct { try writer.writeAll("const proxy = @ptrCast(*client.Proxy,"); try printIdentifier(writer, trimPrefix(interface.name)); try writer.writeAll(");"); - try writer.writeAll("var args = [_]common.Argument{"); - for (message.args.items) |arg| { - switch (arg.kind) { - .int, .uint, .fixed, .string, .object, .array, .fd => { - try writer.writeAll(".{ ."); - try arg.emitSignature(writer); - try writer.writeAll(" = "); - try printIdentifier(writer, arg.name); - try writer.writeAll("},"); - }, - .new_id => |new_iface| { - if (target == .server) { - try writer.writeAll(".{ .o = "); + if (message.args.items.len > 0) { + try writer.writeAll("var args = [_]common.Argument{"); + for (message.args.items) |arg| { + switch (arg.kind) { + .int, .uint, .fixed, .string, .object, .array, .fd => { + try writer.writeAll(".{ ."); + try arg.emitSignature(writer); + try writer.writeAll(" = "); try printIdentifier(writer, arg.name); - try writer.writeAll(" },"); - } else { - if (new_iface == null) { - try writer.writeAll( - \\.{ .s = T.interface.name }, - \\.{ .u = version }, - ); + try writer.writeAll("},"); + }, + .new_id => |new_iface| { + if (target == .server) { + try writer.writeAll(".{ .o = "); + try printIdentifier(writer, arg.name); + try writer.writeAll(" },"); + } else { + if (new_iface == null) { + try writer.writeAll( + \\.{ .s = T.interface.name }, + \\.{ .u = version }, + ); + } + try writer.writeAll(".{ .o = null },"); } - try writer.writeAll(".{ .o = null },"); - } - }, + }, + } } + try writer.writeAll("};\n"); } - try writer.writeAll("};\n"); + const args = if (message.args.items.len > 0) "&args" else "null"; if (target == .server) { - try writer.print("resource.postEvent({}, &args);", .{opcode}); + try writer.print("resource.postEvent({}, {});", .{ opcode, args }); } else switch (message.kind) { .normal, .destructor => { - try writer.print("proxy.marshal({}, &args);", .{opcode}); + try writer.print("proxy.marshal({}, {});", .{ opcode, args }); if (message.kind == .destructor) try writer.writeAll("proxy.destroy();"); }, .constructor => |new_iface| { diff --git a/src/client_core.zig b/src/client_core.zig index 0203760..a2d3af0 100644 --- a/src/client_core.zig +++ b/src/client_core.zig @@ -12,10 +12,8 @@ pub const Proxy = opaque { wl_proxy_destroy(proxy); } - extern fn wl_proxy_marshal_array(proxy: *Proxy, opcode: u32, args: [*]common.Argument) void; - pub fn marshal(proxy: *Proxy, opcode: u32, args: [*]common.Argument) void { - wl_proxy_marshal_array(proxy, opcode, args); - } + extern fn wl_proxy_marshal_array(proxy: *Proxy, opcode: u32, args: ?[*]common.Argument) void; + pub const marshal = wl_proxy_marshal_array; extern fn wl_proxy_marshal_array_constructor( proxy: *Proxy, diff --git a/src/common_core.zig b/src/common_core.zig index d53f1c9..6bb0676 100644 --- a/src/common_core.zig +++ b/src/common_core.zig @@ -6,7 +6,7 @@ pub const Object = opaque {}; pub const Message = extern struct { name: [*:0]const u8, signature: [*:0]const u8, - types: [*]const ?*const Interface, + types: ?[*]const ?*const Interface, }; pub const Interface = extern struct {