diff --git a/build.zig b/build.zig index 7781e79..881bd20 100644 --- a/build.zig +++ b/build.zig @@ -34,11 +34,14 @@ pub fn build(b: *std.Build) void { module.addLibraryPath(dep.path("lib")); } - const generator_exe = b.addExecutable(.{ - .name = "generator", + const generator_module = b.createModule(.{ .root_source_file = b.path("generator.zig"), .target = target, .optimize = optimize, }); + const generator_exe = b.addExecutable(.{ + .name = "generator", + .root_module = generator_module, + }); b.installArtifact(generator_exe); } diff --git a/build.zig.zon b/build.zig.zon index 11eae62..27fa2e5 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,5 +1,6 @@ .{ - .name = "mach-objc", + .fingerprint = 0xd0611af9392648d4, + .name = .mach_objc, .version = "0.0.0", .paths = .{ "src", diff --git a/generator.zig b/generator.zig index b55671d..5e35563 100644 --- a/generator.zig +++ b/generator.zig @@ -1384,7 +1384,7 @@ fn Generator(comptime WriterType: type) type { try self.writer.writeAll(", "); try self.generateType(param_ty); } - try self.writer.writeAll(") callconv(.C) "); + try self.writer.writeAll(") callconv(.c) "); try self.generateType(f.return_type.*); }, .generic => |g| { diff --git a/src/foundation.zig b/src/foundation.zig index e4d18b3..79c71c0 100644 --- a/src/foundation.zig +++ b/src/foundation.zig @@ -731,10 +731,10 @@ pub const ProcessInfo = opaque { return objc.msgSend(self_, "endActivity:", void, .{activity_}); } // pub fn performActivityWithOptions_reason_usingBlock(self_: *@This(), options_: ActivityOptions, reason_: *String, block_: void) void { - // return @as(*const fn (*@This(), *c.objc_selector, ActivityOptions, *String, void) callconv(.C) void, @ptrCast(&c.objc_msgSend))(self_, "performActivityWithOptions:reason:usingBlock:", options_, reason_, block_); + // return @as(*const fn (*@This(), *c.objc_selector, ActivityOptions, *String, void) callconv(.c) void, @ptrCast(&c.objc_msgSend))(self_, "performActivityWithOptions:reason:usingBlock:", options_, reason_, block_); // } // pub fn performExpiringActivityWithReason_usingBlock(self_: *@This(), reason_: *String, block_: void) void { - // return @as(*const fn (*@This(), *c.objc_selector, *String, void) callconv(.C) void, @ptrCast(&c.objc_msgSend))(self_, "performExpiringActivityWithReason:usingBlock:", reason_, block_); + // return @as(*const fn (*@This(), *c.objc_selector, *String, void) callconv(.c) void, @ptrCast(&c.objc_msgSend))(self_, "performExpiringActivityWithReason:usingBlock:", reason_, block_); // } pub fn thermalState(self_: *@This()) ProcessInfoThermalState { return objc.msgSend(self_, "thermalState", ProcessInfoThermalState, .{}); @@ -836,16 +836,16 @@ pub const String = opaque { return objc.msgSend(self_, "rangeOfString:options:range:", Range, .{ searchString_, mask_, rangeOfReceiverToSearch_ }); } // pub fn rangeOfString_options_range_locale(self_: *@This(), searchString_: *String, mask_: StringCompareOptions, rangeOfReceiverToSearch_: Range, locale_: ?*Locale) Range { - // return @as(*const fn (*@This(), *c.objc_selector, *String, StringCompareOptions, Range, ?*Locale) callconv(.C) Range, @ptrCast(&c.objc_msgSend))(self_, "rangeOfString:options:range:locale:", searchString_, mask_, rangeOfReceiverToSearch_, locale_); + // return @as(*const fn (*@This(), *c.objc_selector, *String, StringCompareOptions, Range, ?*Locale) callconv(.c) Range, @ptrCast(&c.objc_msgSend))(self_, "rangeOfString:options:range:locale:", searchString_, mask_, rangeOfReceiverToSearch_, locale_); // } // pub fn rangeOfCharacterFromSet(self_: *@This(), searchSet_: *CharacterSet) Range { - // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet) callconv(.C) Range, @ptrCast(&c.objc_msgSend))(self_, "rangeOfCharacterFromSet:", searchSet_); + // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet) callconv(.c) Range, @ptrCast(&c.objc_msgSend))(self_, "rangeOfCharacterFromSet:", searchSet_); // } // pub fn rangeOfCharacterFromSet_options(self_: *@This(), searchSet_: *CharacterSet, mask_: StringCompareOptions) Range { - // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet, StringCompareOptions) callconv(.C) Range, @ptrCast(&c.objc_msgSend))(self_, "rangeOfCharacterFromSet:options:", searchSet_, mask_); + // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet, StringCompareOptions) callconv(.c) Range, @ptrCast(&c.objc_msgSend))(self_, "rangeOfCharacterFromSet:options:", searchSet_, mask_); // } // pub fn rangeOfCharacterFromSet_options_range(self_: *@This(), searchSet_: *CharacterSet, mask_: StringCompareOptions, rangeOfReceiverToSearch_: Range) Range { - // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet, StringCompareOptions, Range) callconv(.C) Range, @ptrCast(&c.objc_msgSend))(self_, "rangeOfCharacterFromSet:options:range:", searchSet_, mask_, rangeOfReceiverToSearch_); + // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet, StringCompareOptions, Range) callconv(.c) Range, @ptrCast(&c.objc_msgSend))(self_, "rangeOfCharacterFromSet:options:range:", searchSet_, mask_, rangeOfReceiverToSearch_); // } pub fn rangeOfComposedCharacterSequenceAtIndex(self_: *@This(), index_: UInteger) Range { return objc.msgSend(self_, "rangeOfComposedCharacterSequenceAtIndex:", Range, .{index_}); @@ -860,13 +860,13 @@ pub const String = opaque { return objc.msgSend(self_, "stringByAppendingFormat:", *String, .{format_}); } // pub fn uppercaseStringWithLocale(self_: *@This(), locale_: ?*Locale) *String { - // return @as(*const fn (*@This(), *c.objc_selector, ?*Locale) callconv(.C) *String, @ptrCast(&c.objc_msgSend))(self_, "uppercaseStringWithLocale:", locale_); + // return @as(*const fn (*@This(), *c.objc_selector, ?*Locale) callconv(.c) *String, @ptrCast(&c.objc_msgSend))(self_, "uppercaseStringWithLocale:", locale_); // } // pub fn lowercaseStringWithLocale(self_: *@This(), locale_: ?*Locale) *String { - // return @as(*const fn (*@This(), *c.objc_selector, ?*Locale) callconv(.C) *String, @ptrCast(&c.objc_msgSend))(self_, "lowercaseStringWithLocale:", locale_); + // return @as(*const fn (*@This(), *c.objc_selector, ?*Locale) callconv(.c) *String, @ptrCast(&c.objc_msgSend))(self_, "lowercaseStringWithLocale:", locale_); // } // pub fn capitalizedStringWithLocale(self_: *@This(), locale_: ?*Locale) *String { - // return @as(*const fn (*@This(), *c.objc_selector, ?*Locale) callconv(.C) *String, @ptrCast(&c.objc_msgSend))(self_, "capitalizedStringWithLocale:", locale_); + // return @as(*const fn (*@This(), *c.objc_selector, ?*Locale) callconv(.c) *String, @ptrCast(&c.objc_msgSend))(self_, "capitalizedStringWithLocale:", locale_); // } pub fn getLineStart_end_contentsEnd_forRange(self_: *@This(), startPtr_: ?*UInteger, lineEndPtr_: ?*UInteger, contentsEndPtr_: ?*UInteger, range_: Range) void { return objc.msgSend(self_, "getLineStart:end:contentsEnd:forRange:", void, .{ startPtr_, lineEndPtr_, contentsEndPtr_, range_ }); @@ -883,13 +883,13 @@ pub const String = opaque { // pub fn enumerateSubstringsInRange_options_usingBlock(self_: *@This(), range_: Range, opts_: StringEnumerationOptions, context: anytype, comptime block_: fn (ctx: @TypeOf(context), _: ?*String, _: Range, _: Range, _: *bool) void) void { // const Literal = BlockLiteral(@TypeOf(context)); // const Helper = struct { - // pub fn cCallback(literal: *Literal, a0: ?*String, a1: Range, a2: Range, a3: *bool) callconv(.C) void { + // pub fn cCallback(literal: *Literal, a0: ?*String, a1: Range, a2: Range, a3: *bool) callconv(.c) void { // block_(literal.context, a0, a1, a2, a3); // } // }; // const descriptor = BlockDescriptor{ .reserved = 0, .size = @sizeOf(Literal) }; // const block = Literal{ .isa = _NSConcreteStackBlock, .flags = 0, .reserved = 0, .invoke = @ptrCast(&Helper.cCallback), .descriptor = &descriptor, .context = context }; - // return @as(*const fn (*@This(), *c.objc_selector, Range, StringEnumerationOptions, *const anyopaque) callconv(.C) void, @ptrCast(&c.objc_msgSend))(self_, "enumerateSubstringsInRange:options:usingBlock:", range_, opts_, @ptrCast(&block)); + // return @as(*const fn (*@This(), *c.objc_selector, Range, StringEnumerationOptions, *const anyopaque) callconv(.c) void, @ptrCast(&c.objc_msgSend))(self_, "enumerateSubstringsInRange:options:usingBlock:", range_, opts_, @ptrCast(&block)); // } pub fn enumerateLinesUsingBlock(self_: *@This(), block_: *Block(fn (*String, bool) void)) void { return objc.msgSend(self_, "enumerateLinesUsingBlock:", void, .{block_}); @@ -910,7 +910,7 @@ pub const String = opaque { return objc.msgSend(self_, "getCString:maxLength:encoding:", bool, .{ buffer_, maxBufferCount_, encoding_ }); } // pub fn getBytes_maxLength_usedLength_encoding_options_range_remainingRange(self_: *@This(), buffer_: ?*anyopaque, maxBufferCount_: UInteger, usedBufferCount_: ?*UInteger, encoding_: StringEncoding, options_: StringEncodingConversionOptions, range_: Range, leftover_: RangePointer) bool { - // return @as(*const fn (*@This(), *c.objc_selector, ?*anyopaque, UInteger, ?*UInteger, StringEncoding, StringEncodingConversionOptions, Range, RangePointer) callconv(.C) bool, @ptrCast(&c.objc_msgSend))(self_, "getBytes:maxLength:usedLength:encoding:options:range:remainingRange:", buffer_, maxBufferCount_, usedBufferCount_, encoding_, options_, range_, leftover_); + // return @as(*const fn (*@This(), *c.objc_selector, ?*anyopaque, UInteger, ?*UInteger, StringEncoding, StringEncodingConversionOptions, Range, RangePointer) callconv(.c) bool, @ptrCast(&c.objc_msgSend))(self_, "getBytes:maxLength:usedLength:encoding:options:range:remainingRange:", buffer_, maxBufferCount_, usedBufferCount_, encoding_, options_, range_, leftover_); // } pub fn maximumLengthOfBytesUsingEncoding(self_: *@This(), enc_: StringEncoding) UInteger { return objc.msgSend(self_, "maximumLengthOfBytesUsingEncoding:", UInteger, .{enc_}); @@ -925,16 +925,16 @@ pub const String = opaque { return objc.msgSend(self_, "componentsSeparatedByString:", *Array(*String), .{separator_}); } // pub fn componentsSeparatedByCharactersInSet(self_: *@This(), separator_: *CharacterSet) *Array(*String) { - // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet) callconv(.C) *Array(*String), @ptrCast(&c.objc_msgSend))(self_, "componentsSeparatedByCharactersInSet:", separator_); + // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet) callconv(.c) *Array(*String), @ptrCast(&c.objc_msgSend))(self_, "componentsSeparatedByCharactersInSet:", separator_); // } // pub fn stringByTrimmingCharactersInSet(self_: *@This(), set_: *CharacterSet) *String { - // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet) callconv(.C) *String, @ptrCast(&c.objc_msgSend))(self_, "stringByTrimmingCharactersInSet:", set_); + // return @as(*const fn (*@This(), *c.objc_selector, *CharacterSet) callconv(.c) *String, @ptrCast(&c.objc_msgSend))(self_, "stringByTrimmingCharactersInSet:", set_); // } pub fn stringByPaddingToLength_withString_startingAtIndex(self_: *@This(), newLength_: UInteger, padString_: *String, padIndex_: UInteger) *String { return objc.msgSend(self_, "stringByPaddingToLength:withString:startingAtIndex:", *String, .{ newLength_, padString_, padIndex_ }); } // pub fn stringByFoldingWithOptions_locale(self_: *@This(), options_: StringCompareOptions, locale_: ?*Locale) *String { - // return @as(*const fn (*@This(), *c.objc_selector, StringCompareOptions, ?*Locale) callconv(.C) *String, @ptrCast(&c.objc_msgSend))(self_, "stringByFoldingWithOptions:locale:", options_, locale_); + // return @as(*const fn (*@This(), *c.objc_selector, StringCompareOptions, ?*Locale) callconv(.c) *String, @ptrCast(&c.objc_msgSend))(self_, "stringByFoldingWithOptions:locale:", options_, locale_); // } pub fn stringByReplacingOccurrencesOfString_withString_options_range(self_: *@This(), target_: *String, replacement_: *String, options_: StringCompareOptions, searchRange_: Range) *String { return objc.msgSend(self_, "stringByReplacingOccurrencesOfString:withString:options:range:", *String, .{ target_, replacement_, options_, searchRange_ }); @@ -946,7 +946,7 @@ pub const String = opaque { return objc.msgSend(self_, "stringByReplacingCharactersInRange:withString:", *String, .{ range_, replacement_ }); } // pub fn stringByApplyingTransform_reverse(self_: *@This(), transform_: StringTransform, reverse_: bool) ?*String { - // return @as(*const fn (*@This(), *c.objc_selector, StringTransform, bool) callconv(.C) ?*String, @ptrCast(&c.objc_msgSend))(self_, "stringByApplyingTransform:reverse:", transform_, reverse_); + // return @as(*const fn (*@This(), *c.objc_selector, StringTransform, bool) callconv(.c) ?*String, @ptrCast(&c.objc_msgSend))(self_, "stringByApplyingTransform:reverse:", transform_, reverse_); // } pub fn writeToURL_atomically_encoding_error(self_: *@This(), url_: *URL, useAuxiliaryFile_: bool, enc_: StringEncoding, error_: ?*?*Error) bool { return objc.msgSend(self_, "writeToURL:atomically:encoding:error:", bool, .{ url_, useAuxiliaryFile_, enc_, error_ }); @@ -973,13 +973,13 @@ pub const String = opaque { return objc.msgSend(self_, "initWithFormat:", *@This(), .{format_}); } // pub fn initWithFormat_arguments(self_: *@This(), format_: *String, argList_: va_list) *@This() { - // return @as(*const fn (*@This(), *c.objc_selector, *String, va_list) callconv(.C) *@This(), @ptrCast(&c.objc_msgSend))(self_, "initWithFormat:arguments:", format_, argList_); + // return @as(*const fn (*@This(), *c.objc_selector, *String, va_list) callconv(.c) *@This(), @ptrCast(&c.objc_msgSend))(self_, "initWithFormat:arguments:", format_, argList_); // } pub fn initWithFormat_locale(self_: *@This(), format_: *String, locale_: ?*objc.Id) *@This() { return objc.msgSend(self_, "initWithFormat:locale:", *@This(), .{ format_, locale_ }); } // pub fn initWithFormat_locale_arguments(self_: *@This(), format_: *String, locale_: ?*objc.Id, argList_: va_list) *@This() { - // return @as(*const fn (*@This(), *c.objc_selector, *String, ?*objc.Id, va_list) callconv(.C) *@This(), @ptrCast(&c.objc_msgSend))(self_, "initWithFormat:locale:arguments:", format_, locale_, argList_); + // return @as(*const fn (*@This(), *c.objc_selector, *String, ?*objc.Id, va_list) callconv(.c) *@This(), @ptrCast(&c.objc_msgSend))(self_, "initWithFormat:locale:arguments:", format_, locale_, argList_); // } pub fn initWithValidatedFormat_validFormatSpecifiers_error(self_: *@This(), format_: *String, validFormatSpecifiers_: *String, error_: ?*?*Error) *@This() { return objc.msgSend(self_, "initWithValidatedFormat:validFormatSpecifiers:error:", *@This(), .{ format_, validFormatSpecifiers_, error_ }); @@ -988,10 +988,10 @@ pub const String = opaque { return objc.msgSend(self_, "initWithValidatedFormat:validFormatSpecifiers:locale:error:", *@This(), .{ format_, validFormatSpecifiers_, locale_, error_ }); } // pub fn initWithValidatedFormat_validFormatSpecifiers_arguments_error(self_: *@This(), format_: *String, validFormatSpecifiers_: *String, argList_: va_list, error_: ?*?*Error) *@This() { - // return @as(*const fn (*@This(), *c.objc_selector, *String, *String, va_list, ?*?*Error) callconv(.C) *@This(), @ptrCast(&c.objc_msgSend))(self_, "initWithValidatedFormat:validFormatSpecifiers:arguments:error:", format_, validFormatSpecifiers_, argList_, error_); + // return @as(*const fn (*@This(), *c.objc_selector, *String, *String, va_list, ?*?*Error) callconv(.c) *@This(), @ptrCast(&c.objc_msgSend))(self_, "initWithValidatedFormat:validFormatSpecifiers:arguments:error:", format_, validFormatSpecifiers_, argList_, error_); // } // pub fn initWithValidatedFormat_validFormatSpecifiers_locale_arguments_error(self_: *@This(), format_: *String, validFormatSpecifiers_: *String, locale_: ?*objc.Id, argList_: va_list, error_: ?*?*Error) *@This() { - // return @as(*const fn (*@This(), *c.objc_selector, *String, *String, ?*objc.Id, va_list, ?*?*Error) callconv(.C) *@This(), @ptrCast(&c.objc_msgSend))(self_, "initWithValidatedFormat:validFormatSpecifiers:locale:arguments:error:", format_, validFormatSpecifiers_, locale_, argList_, error_); + // return @as(*const fn (*@This(), *c.objc_selector, *String, *String, ?*objc.Id, va_list, ?*?*Error) callconv(.c) *@This(), @ptrCast(&c.objc_msgSend))(self_, "initWithValidatedFormat:validFormatSpecifiers:locale:arguments:error:", format_, validFormatSpecifiers_, locale_, argList_, error_); // } pub fn initWithData_encoding(self_: *@This(), data_: *Data, encoding_: StringEncoding) *@This() { return objc.msgSend(self_, "initWithData:encoding:", *@This(), .{ data_, encoding_ }); @@ -1123,13 +1123,13 @@ pub const String = opaque { return objc.msgSend(self_, "precomposedStringWithCompatibilityMapping", *String, .{}); } // pub fn stringEncodingForData_encodingOptions_convertedString_usedLossyConversion(data_: *Data, opts_: ?*Dictionary(StringEncodingDetectionOptionsKey, *objc.Id), string_: ?*?*String, usedLossyConversion_: ?*bool) StringEncoding { - // return @as(*const fn (*c.objc_class, *c.objc_selector, *Data, ?*Dictionary(StringEncodingDetectionOptionsKey, *objc.Id), ?*?*String, ?*bool) callconv(.C) StringEncoding, @ptrCast(&c.objc_msgSend))(@This().InternalInfo.class(), "stringEncodingForData:encodingOptions:convertedString:usedLossyConversion:", data_, opts_, string_, usedLossyConversion_); + // return @as(*const fn (*c.objc_class, *c.objc_selector, *Data, ?*Dictionary(StringEncodingDetectionOptionsKey, *objc.Id), ?*?*String, ?*bool) callconv(.c) StringEncoding, @ptrCast(&c.objc_msgSend))(@This().InternalInfo.class(), "stringEncodingForData:encodingOptions:convertedString:usedLossyConversion:", data_, opts_, string_, usedLossyConversion_); // } pub fn propertyList(self_: *@This()) *objc.Id { return objc.msgSend(self_, "propertyList", *objc.Id, .{}); } // pub fn propertyListFromStringsFileFormat(self_: *@This()) ?*Dictionary { - // return @as(*const fn (*@This(), *c.objc_selector) callconv(.C) ?*Dictionary, @ptrCast(&c.objc_msgSend))(self_, "propertyListFromStringsFileFormat);" + // return @as(*const fn (*@This(), *c.objc_selector) callconv(.c) ?*Dictionary, @ptrCast(&c.objc_msgSend))(self_, "propertyListFromStringsFileFormat);" // } pub fn cString(self_: *@This()) ?*const u8 { return objc.msgSend(self_, "cString", ?*const u8, .{}); @@ -1147,7 +1147,7 @@ pub const String = opaque { return objc.msgSend(self_, "getCString:maxLength:", void, .{ bytes_, maxLength_ }); } // pub fn getCString_maxLength_range_remainingRange(self_: *@This(), bytes_: *u8, maxLength_: UInteger, aRange_: Range, leftoverRange_: RangePointer) void { - // return @as(*const fn (*@This(), *c.objc_selector, *u8, UInteger, Range, RangePointer) callconv(.C) void, @ptrCast(&c.objc_msgSend))(self_, "getCString:maxLength:range:remainingRange:", bytes_, maxLength_, aRange_, leftoverRange_); + // return @as(*const fn (*@This(), *c.objc_selector, *u8, UInteger, Range, RangePointer) callconv(.c) void, @ptrCast(&c.objc_msgSend))(self_, "getCString:maxLength:range:remainingRange:", bytes_, maxLength_, aRange_, leftoverRange_); // } pub fn writeToFile_atomically(self_: *@This(), path_: *String, useAuxiliaryFile_: bool) bool { return objc.msgSend(self_, "writeToFile:atomically:", bool, .{ path_, useAuxiliaryFile_ }); diff --git a/src/main.zig b/src/main.zig index 1ad4173..348e74f 100644 --- a/src/main.zig +++ b/src/main.zig @@ -24,7 +24,7 @@ pub const mach = struct { method(self, block); } const method = @extern( - *const fn (*AppDelegate, *foundation.Block(fn () void)) callconv(.C) void, + *const fn (*AppDelegate, *foundation.Block(fn () void)) callconv(.c) void, .{ .name = "\x01-[MACHAppDelegate setRunBlock:]" }, ); }; @@ -43,7 +43,7 @@ pub const mach = struct { method_windowDidResize(self, block); } const method_windowDidResize = @extern( - *const fn (*WindowDelegate, *foundation.Block(fn () void)) callconv(.C) void, + *const fn (*WindowDelegate, *foundation.Block(fn () void)) callconv(.c) void, .{ .name = "\x01-[MACHWindowDelegate setBlock_windowDidResize:]" }, ); @@ -51,7 +51,7 @@ pub const mach = struct { method_windowShouldClose(self, block); } const method_windowShouldClose = @extern( - *const fn (*WindowDelegate, *foundation.Block(fn () bool)) callconv(.C) void, + *const fn (*WindowDelegate, *foundation.Block(fn () bool)) callconv(.c) void, .{ .name = "\x01-[MACHWindowDelegate setBlock_windowShouldClose:]" }, ); }; @@ -85,7 +85,7 @@ pub const mach = struct { method_keyDown(self, block); } const method_keyDown = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_keyDown:]" }, ); @@ -93,7 +93,7 @@ pub const mach = struct { method_insertText(self, block); } const method_insertText = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event, u32) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event, u32) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_insertText:]" }, ); @@ -101,7 +101,7 @@ pub const mach = struct { method_keyUp(self, block); } const method_keyUp = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_keyUp:]" }, ); @@ -109,7 +109,7 @@ pub const mach = struct { method_flagsChanged(self, block); } const method_flagsChanged = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_flagsChanged:]" }, ); @@ -117,7 +117,7 @@ pub const mach = struct { method_magnify(self, block); } const method_magnify = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_magnify:]" }, ); @@ -125,7 +125,7 @@ pub const mach = struct { method_mouseMoved(self, block); } const method_mouseMoved = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_mouseMoved:]" }, ); @@ -133,7 +133,7 @@ pub const mach = struct { method_mouseDown(self, block); } const method_mouseDown = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_mouseDown:]" }, ); @@ -141,7 +141,7 @@ pub const mach = struct { method_mouseUp(self, block); } const method_mouseUp = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_mouseUp:]" }, ); @@ -149,7 +149,7 @@ pub const mach = struct { method_scrollWheel(self, block); } const method_scrollWheel = @extern( - *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.C) void, + *const fn (*View, *foundation.Block(fn (*app_kit.Event) void)) callconv(.c) void, .{ .name = "\x01-[MACHView setBlock_scrollWheel:]" }, ); }; diff --git a/src/objc.zig b/src/objc.zig index ce3bb23..1cfa0a6 100644 --- a/src/objc.zig +++ b/src/objc.zig @@ -68,41 +68,29 @@ pub fn msgSend(receiver: anytype, comptime selector: []const u8, return_type: ty // validate it against `receiver` and `args`. const fn_type = comptime init: { - var params: []const std.builtin.Type.Fn.Param = &.{ - .{ - .is_generic = false, - .is_noalias = false, - .type = @TypeOf(receiver), - }, - .{ - .is_generic = false, - .is_noalias = false, - .type = [*:0]c_char, - }, - }; - for (@typeInfo(@TypeOf(args)).@"struct".fields) |field| { - params = params ++ - [_]std.builtin.Type.Fn.Param{.{ - .is_generic = false, - .is_noalias = false, - .type = field.type, - }}; - } - break :init std.builtin.Type{ - .@"fn" = .{ - .calling_convention = std.builtin.CallingConvention.c, - .is_generic = false, - .is_var_args = false, - .return_type = return_type, - .params = params, - }, - }; + const ParamAttrs = std.builtin.Type.Fn.Param.Attributes; + const args_fields = @typeInfo(@TypeOf(args)).@"struct".fields; + const param_len = args_fields.len + 2; + var param_types: [param_len]type = undefined; + var param_attrs: [param_len]ParamAttrs = undefined; + + param_types[0] = @TypeOf(receiver); + param_attrs[0] = .{}; + param_types[1] = [*:0]c_char; + param_attrs[1] = .{}; + + for (args_fields, 0..) |field, i| { + param_types[i + 2] = field.type; + param_attrs[i + 2] = .{}; + } + + break :init @Fn(¶m_types, ¶m_attrs, return_type, .{ .@"callconv" = .c }); }; const needs_fpret = comptime builtin.target.cpu.arch == .x86 and (return_type == f32 or return_type == f64); const needs_stret = comptime builtin.target.cpu.arch == .x86 and @sizeOf(return_type) > 16; const msg_send_fn_name = comptime if (needs_stret) "objc_msgSend_stret" else if (needs_fpret) "objc_msgSend_fpret" else "objc_msgSend"; - const msg_send_fn = @extern(*const @Type(fn_type), .{ .name = msg_send_fn_name ++ "$" ++ selector }); + const msg_send_fn = @extern(*const fn_type, .{ .name = msg_send_fn_name ++ "$" ++ selector }); return @call(.auto, msg_send_fn, .{ receiver, undefined } ++ args); } diff --git a/src/system.zig b/src/system.zig index b368d3a..e857b99 100644 --- a/src/system.zig +++ b/src/system.zig @@ -2,7 +2,7 @@ const builtin = @import("builtin"); const std = @import("std"); pub extern "System" fn dispatch_async(queue: *anyopaque, work: *const Block(fn (*BlockLiteral(void)) void)) void; -pub extern "System" fn dispatch_async_f(queue: *anyopaque, context: ?*anyopaque, work: *const fn (context: ?*anyopaque) callconv(.C) void) void; +pub extern "System" fn dispatch_async_f(queue: *anyopaque, context: ?*anyopaque, work: *const fn (context: ?*anyopaque) callconv(.c) void) void; pub extern "System" fn @"dispatch_assert_queue$V2"(queue: *anyopaque) void; pub extern "System" var _dispatch_main_q: anyopaque; @@ -13,20 +13,28 @@ pub fn Block(comptime Signature: type) type { const signature_fn_info = @typeInfo(Signature).@"fn"; return opaque { pub fn invoke(self: *@This(), args: std.meta.ArgsTuple(Signature)) signature_fn_info.return_type.? { - const self_param = std.builtin.Type.Fn.Param{ - .is_generic = false, - .is_noalias = false, - .type = *@This(), - }; - const SignatureForInvoke = @Type(.{ - .@"fn" = .{ - .calling_convention = std.builtin.CallingConvention.c, - .is_generic = signature_fn_info.is_generic, - .is_var_args = signature_fn_info.is_var_args, - .return_type = signature_fn_info.return_type, - .params = .{self_param} ++ signature_fn_info.params, - }, - }); + if (signature_fn_info.is_generic) { + @compileError("Block signatures must be non-generic"); + } + + const ParamAttrs = std.builtin.Type.Fn.Param.Attributes; + const param_len = signature_fn_info.params.len + 1; + var param_types: [param_len]type = undefined; + var param_attrs: [param_len]ParamAttrs = undefined; + + param_types[0] = *@This(); + param_attrs[0] = .{}; + inline for (signature_fn_info.params, 0..) |param, i| { + param_types[i + 1] = param.type orelse @compileError("Block signatures must be concrete"); + param_attrs[i + 1] = .{ .@"noalias" = param.is_noalias }; + } + + const SignatureForInvoke = @Fn( + ¶m_types, + ¶m_attrs, + signature_fn_info.return_type orelse @compileError("Block signatures must return a concrete type"), + .{ .@"callconv" = .c, .varargs = signature_fn_info.is_var_args }, + ); const offset = @offsetOf(BlockLiteral(void), "invoke"); const invoke_ptr: *const SignatureForInvoke = @ptrCast(self + offset); @@ -100,8 +108,8 @@ fn CopyDisposeBlockDescriptor(comptime Context: type) type { copy: *const CopyFn, dispose: *const DisposeFn, - pub const CopyFn = fn (dst: *BlockLiteral(Context), src: *const BlockLiteral(Context)) callconv(.C) void; - pub const DisposeFn = fn (block: *const BlockLiteral(Context)) callconv(.C) void; + pub const CopyFn = fn (dst: *BlockLiteral(Context), src: *const BlockLiteral(Context)) callconv(.c) void; + pub const DisposeFn = fn (block: *const BlockLiteral(Context)) callconv(.c) void; fn static(comptime size: c_ulong, comptime copy: CopyFn, comptime dispose: DisposeFn) *const CopyDisposeBlockDescriptor { const Static = struct { @@ -120,7 +128,21 @@ fn SignatureWithoutBlockLiteral(comptime Signature: type) type { var type_info = @typeInfo(Signature); type_info.@"fn".calling_convention = .auto; type_info.@"fn".params = type_info.@"fn".params[1..]; - return @Type(type_info); + const ParamAttrs = std.builtin.Type.Fn.Param.Attributes; + const params = type_info.@"fn".params; + const param_len = params.len; + var param_types: [param_len]type = undefined; + var param_attrs: [param_len]ParamAttrs = undefined; + inline for (params, 0..) |param, i| { + param_types[i] = param.type orelse @compileError("Block signatures must be concrete"); + param_attrs[i] = .{ .@"noalias" = param.is_noalias }; + } + return @Fn( + ¶m_types, + ¶m_attrs, + type_info.@"fn".return_type orelse @compileError("Block signatures must return a concrete type"), + .{ .@"callconv" = .auto, .varargs = type_info.@"fn".is_var_args }, + ); } fn validateBlockSignature(comptime Invoke: type, comptime ExpectedLiteralType: type) void { @@ -143,8 +165,8 @@ fn validateBlockSignature(comptime Invoke: type, comptime ExpectedLiteralType: t pub fn stackBlockLiteral( invoke: anytype, context: anytype, - comptime copy: ?fn (dst: *BlockLiteral(@TypeOf(context)), src: *const BlockLiteral(@TypeOf(context))) callconv(.C) void, - comptime dispose: ?fn (block: *const BlockLiteral(@TypeOf(context))) callconv(.C) void, + comptime copy: ?fn (dst: *BlockLiteral(@TypeOf(context)), src: *const BlockLiteral(@TypeOf(context))) callconv(.c) void, + comptime dispose: ?fn (block: *const BlockLiteral(@TypeOf(context))) callconv(.c) void, ) BlockLiteralWithSignature(@TypeOf(context), SignatureWithoutBlockLiteral(@TypeOf(invoke))) { const Context = @TypeOf(context); const Literal = BlockLiteral(Context);