diff --git a/docs/objective-c-protocols.md b/docs/objective-c-protocols.md new file mode 100644 index 000000000000..3e4618295443 --- /dev/null +++ b/docs/objective-c-protocols.md @@ -0,0 +1,131 @@ +# Objective-C protocols + +This document describes how we bind Objective-C protocols in C#, and in +particular improvements we've done in .NET 9. + +## Can Objective-C protocols be modeled as C# interfaces? + +Objective-C protocols are quite similar to C# interfaces, except when they're +not, and that makes binding them somewhat complicated. + +### Optional/required members + +Objective-C protocols can have both optional and required members. It's always +been possible to represent required members in a C# interface (any interface +member would be required), but optional members were not possible until C# +added support for default interface members in C# 8. + +We represent optional members in two ways: + +* As an extension method on the interface (useful when calling the optional member). +* As an IDE feature that would show any optional members from an interface by + typing 'override ...' in the text editor (useful when implementing an optional member). + +This has a few drawbacks: + +* There are no extension properties, so optional properties would have to be + bound as a pair of GetProperty/SetProperty methods. + +* The IDE feature was obscure, few people knew about it, it broke on pretty + much every major release of Visual Studio for Mac, and it was never + implemented for Visual Studio on Windows. This made it quite hard to + implement optional members in a managed class extending an Objective-C + protocol, since developers would have to figure out the correct Export + attribute as well as the signature (which is quite complicated for more + complex signatures, especially if blocks are involved). + +### Changing requiredness + +It's entirely possible to change a member from being required to being optional +in Objective-C. Technically it's also a breaking change to do the opposite (make +an optional member required), but Apple does it all the time. + +We've handled this by just not updating the binding until we're able to do +breaking changes (which happens very rarely). + +### Static members + +Objective-C protocols can have static members. C# didn't allow for static +members in interfaces until C# 11, so until recently there hasn't been any +good way to bind static protocol members on a protocol. + +Our workaround is to manually inline every static member in all classes that +implemented a given protocol. + +### Initializers + +Objective-C protocols can have initializers (constructors). C# still doesn't +allow for constructors in interfaces. + +In the past we haven't bound any protocol initializer at all, we've completely +ignored them. + +## Binding in C# + +### Initializers + +Given the following API definition: + +```cs +[Protocol] +public interface Protocol { + [Abstract] + [Export ("init")] + IntPtr Constructor (); + + [Export ("initWithValue:")] + IntPtr Constructor (IntPtr value); + + [Bind ("Create")] + [Export ("initWithPlanet:")] + IntPtr Constructor (); +} +``` + +we're binding it like this: + +```cs +[Protocol ("Protocol")] +public interface IProtocol : INativeObject { + [Export ("init")] + public static T CreateInstance () where T: NSObject, IProtocol { /* default implementation */ } + + [Export ("initWithValue:")] + public static T CreateInstance () where T: NSObject, IProtocol { /* default implementation */ } + + [Export ("initWithPlanet:")] + public static T Create () where T: NSObject, IProtocol { /* default implementation */ } +} +``` + +In other words: we bind initializers as a static C# factory method that takes +a generic type argument specifying the type to instantiate. + +Notes: + +1. Constructors are currently not inlined in any implementing classes, like + other members are. This is something we could look into if there's enough + interest. +2. If a managed class implements a protocol with a constructor, the class has + to implement the constructor manually using the `[Export]` attribute in + order to conform to the protocol: + +```cs +[Protocol] +interface IMyProtocol { + [Export ("initWithValue:")] + IntPtr Constructor (string value); +} +``` + +```cs +class MyClass : NSObject, IMyProtocol { + public string Value { get; private set; } + + [Export ("initWithValue:")] + public MyClass (string value) + { + this.Value = value; + } +} +``` diff --git a/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj b/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj index 520df2c14bd4..4700701bfdce 100644 --- a/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj +++ b/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj @@ -39,6 +39,9 @@ $(MonoMSBuildBinPath)/Microsoft.Build.Utilities.Core.dll + + Versions.g.cs + diff --git a/msbuild/Xamarin.Localization.MSBuild/Properties/AssemblyInfo.cs b/msbuild/Xamarin.Localization.MSBuild/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..df2253be9ec7 --- /dev/null +++ b/msbuild/Xamarin.Localization.MSBuild/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyCompanyAttribute ("Microsoft Corp.")] +[assembly: AssemblyFileVersionAttribute (VersionConstants.XamarinIOSVersion)] +[assembly: AssemblyInformationalVersionAttribute (VersionConstants.XamarinIOSVersion + "." + VersionConstants.NuGetPrereleaseIdentifier + "+" + VersionConstants.NuGetBuildMetadata)] +[assembly: AssemblyProductAttribute ("Xamarin.Localization.MSBuild")] +[assembly: AssemblyTitleAttribute ("Xamarin.Localization.MSBuild")] +[assembly: AssemblyVersionAttribute (VersionConstants.XamarinIOSVersion)] diff --git a/msbuild/Xamarin.Localization.MSBuild/Xamarin.Localization.MSBuild.csproj b/msbuild/Xamarin.Localization.MSBuild/Xamarin.Localization.MSBuild.csproj index da216930eeff..83d29ddc2f79 100644 --- a/msbuild/Xamarin.Localization.MSBuild/Xamarin.Localization.MSBuild.csproj +++ b/msbuild/Xamarin.Localization.MSBuild/Xamarin.Localization.MSBuild.csproj @@ -7,6 +7,7 @@ enable latest Nullable + false false @@ -27,6 +28,9 @@ + + Versions.g.cs + MSBStrings.cs.resx Xamarin.Localization.MSBuild.MSBStrings.cs diff --git a/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj b/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj index af8616984e15..608e795242bd 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj +++ b/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj @@ -85,9 +85,6 @@ external\NullableAttributes.cs - - Versions.g.cs - external\SdkVersions.cs diff --git a/msbuild/Xamarin.Shared/Xamarin.Mac.Common.props b/msbuild/Xamarin.Shared/Xamarin.Mac.Common.props index 45b6defc68b5..63cc2636c9a3 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Mac.Common.props +++ b/msbuild/Xamarin.Shared/Xamarin.Mac.Common.props @@ -1,4 +1,4 @@ - - + $([System.String]::Copy('$(AssemblySearchPaths)').Replace('{GAC}','')) $(AssemblySearchPaths.Split(';')) diff --git a/msbuild/Xamarin.Shared/Xamarin.Mac.Common.targets b/msbuild/Xamarin.Shared/Xamarin.Mac.Common.targets index 86bdc40fefd7..a372789f94b5 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Mac.Common.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Mac.Common.targets @@ -99,7 +99,7 @@ Copyright (C) 2014 Xamarin. All rights reserved. HttpClientHandler="$(HttpClientHandler)" I18n="$(I18n)" Profiling="$(Profiling)" - ExtraArgs="$(_BundlerArguments)" + ExtraArgs="$(AppBundleExtraOptions)" NativeReferences="@(_FrameworkNativeReference);@(_FileNativeReference)" References="@(ReferencePath);@(_BundlerReferencePath)" Registrar="$(Registrar)" diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.props b/msbuild/Xamarin.Shared/Xamarin.Shared.props index 5ba9b007e9a6..5cc684fbbd1e 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.props +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.props @@ -231,8 +231,8 @@ Copyright (C) 2020 Microsoft. All rights reserved. <_BundlerDebug Condition="'$(_BundlerDebug)' == ''">false - <_BundlerArguments Condition="'$(_PlatformName)' == 'macOS'">$(MonoBundlingExtraArgs) - <_BundlerArguments Condition="'$(_PlatformName)' != 'macOS'">$(MtouchExtraArgs) + $(AppBundleExtraOptions) $(MonoBundlingExtraArgs) + $(AppBundleExtraOptions) $(MtouchExtraArgs) diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index 30befd9fc218..b887469b32e0 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -2015,7 +2015,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. (ref averageCPULoad)); + } } public AUGraphError GetMaxCPULoad (out float maxCPULoad) { - return AUGraphGetMaxCPULoad (Handle, out maxCPULoad); + maxCPULoad = default; + unsafe { + return AUGraphGetMaxCPULoad (Handle, (float*) Unsafe.AsPointer (ref maxCPULoad)); + } } public AUGraphError GetNode (uint index, out int node) { - return AUGraphGetIndNode (Handle, index, out node); + node = default; + unsafe { + return AUGraphGetIndNode (Handle, index, (int*) Unsafe.AsPointer (ref node)); + } } public AUGraphError GetNodeCount (out int count) { - return AUGraphGetNodeCount (Handle, out count); + count = default; + unsafe { + return AUGraphGetNodeCount (Handle, (int*) Unsafe.AsPointer (ref count)); + } } public AudioUnit GetNodeInfo (int node) @@ -287,7 +313,10 @@ public AudioUnit GetNodeInfo (int node) public AudioUnit? GetNodeInfo (int node, out AUGraphError error) { - error = AUGraphNodeInfo (GetCheckedHandle (), node, IntPtr.Zero, out var ptr); + IntPtr ptr; + unsafe { + error = AUGraphNodeInfo (GetCheckedHandle (), node, null, &ptr); + } if (error != AUGraphError.OK || ptr == IntPtr.Zero) return null; @@ -299,7 +328,11 @@ public AudioUnit GetNodeInfo (int node) // Following current Api behaviour of returning an AudioUnit instead of an error public AudioUnit? GetNodeInfo (int node, out AudioComponentDescription cd, out AUGraphError error) { - error = AUGraphNodeInfo (GetCheckedHandle (), node, out cd, out var ptr); + IntPtr ptr; + cd = default; + unsafe { + error = AUGraphNodeInfo (GetCheckedHandle (), node, (AudioComponentDescription*) Unsafe.AsPointer (ref cd), &ptr); + } if (error != AUGraphError.OK || ptr == IntPtr.Zero) return null; @@ -309,12 +342,18 @@ public AudioUnit GetNodeInfo (int node) public AUGraphError GetNumberOfInteractions (out uint interactionsCount) { - return AUGraphGetNumberOfInteractions (Handle, out interactionsCount); + interactionsCount = default; + unsafe { + return AUGraphGetNumberOfInteractions (Handle, (uint*) Unsafe.AsPointer (ref interactionsCount)); + } } public AUGraphError GetNumberOfInteractions (int node, out uint interactionsCount) { - return AUGraphCountNodeInteractions (Handle, node, out interactionsCount); + interactionsCount = default; + unsafe { + return AUGraphCountNodeInteractions (Handle, node, (uint*) Unsafe.AsPointer (ref interactionsCount)); + } } /* @@ -357,15 +396,15 @@ public AUGraphError SetNodeInputCallback (int destNode, uint destInputNumber, Re nodesCallbacks [destInputNumber] = renderDelegate; var cb = new AURenderCallbackStruct (); -#if NET unsafe { +#if NET cb.Proc = &RenderCallbackImpl; - } #else - cb.Proc = Marshal.GetFunctionPointerForDelegate (CreateRenderCallback); + cb.Proc = Marshal.GetFunctionPointerForDelegate (CreateRenderCallback); #endif - cb.ProcRefCon = GCHandle.ToIntPtr (gcHandle); - return AUGraphSetNodeInputCallback (Handle, destNode, destInputNumber, ref cb); + cb.ProcRefCon = GCHandle.ToIntPtr (gcHandle); + return AUGraphSetNodeInputCallback (Handle, destNode, destInputNumber, &cb); + } } #if NET [UnmanagedCallersOnly] @@ -415,7 +454,10 @@ public AUGraphError Initialize () public bool Update () { - return AUGraphUpdate (Handle, out var isUpdated) == AUGraphError.OK && isUpdated; + byte isUpdated; + unsafe { + return AUGraphUpdate (Handle, &isUpdated) == AUGraphError.OK && isUpdated != 0; + } } // Quote from Learning CoreAudio Book: @@ -447,22 +489,19 @@ protected override void Dispose (bool disposing) static extern int /* OSStatus */ AUGraphOpen (IntPtr inGraph); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphAddNode (IntPtr inGraph, ref AudioComponentDescription inDescription, out int /* AUNode = SInt32* */ outNode); + unsafe static extern AUGraphError AUGraphAddNode (IntPtr inGraph, AudioComponentDescription* inDescription, int* /* AUNode = SInt32* */ outNode); [DllImport (Constants.AudioToolboxLibrary)] static extern AUGraphError AUGraphRemoveNode (IntPtr inGraph, int /* AUNode = SInt32 */ inNode); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphGetNodeCount (IntPtr inGraph, out int /* UInt32* */ outNumberOfNodes); - - [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphGetIndNode (IntPtr inGraph, uint /* UInt32 */ inIndex, out int /* AUNode = SInt32* */ outNode); + unsafe static extern AUGraphError AUGraphGetNodeCount (IntPtr inGraph, int* /* UInt32* */ outNumberOfNodes); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphNodeInfo (IntPtr inGraph, int /* AUNode = SInt32 */ inNode, IntPtr outDescription, out IntPtr outAudioUnit); + unsafe static extern AUGraphError AUGraphGetIndNode (IntPtr inGraph, uint /* UInt32 */ inIndex, int* /* AUNode = SInt32* */ outNode); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphNodeInfo (IntPtr inGraph, int /* AUNode = SInt32 */ inNode, out AudioComponentDescription outDescription, out IntPtr outAudioUnit); + unsafe static extern AUGraphError AUGraphNodeInfo (IntPtr inGraph, int /* AUNode = SInt32 */ inNode, AudioComponentDescription* outDescription, IntPtr* outAudioUnit); [DllImport (Constants.AudioToolboxLibrary)] static extern AUGraphError AUGraphClearConnections (IntPtr inGraph); @@ -474,10 +513,10 @@ protected override void Dispose (bool disposing) static extern AUGraphError AUGraphDisconnectNodeInput (IntPtr inGraph, int /* AUNode = SInt32 */ inDestNode, uint /* UInt32 */ inDestInputNumber); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphGetNumberOfInteractions (IntPtr inGraph, out uint /* UInt32* */ outNumInteractions); + unsafe static extern AUGraphError AUGraphGetNumberOfInteractions (IntPtr inGraph, uint* /* UInt32* */ outNumInteractions); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphCountNodeInteractions (IntPtr inGraph, int /* AUNode = SInt32 */ inNode, out uint /* UInt32* */ outNumInteractions); + unsafe static extern AUGraphError AUGraphCountNodeInteractions (IntPtr inGraph, int /* AUNode = SInt32 */ inNode, uint* /* UInt32* */ outNumInteractions); [DllImport (Constants.AudioToolboxLibrary)] static extern AUGraphError AUGraphInitialize (IntPtr inGraph); @@ -513,25 +552,25 @@ protected override void Dispose (bool disposing) static extern int /* OSStatus */ DisposeAUGraph (IntPtr inGraph); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphIsOpen (IntPtr inGraph, [MarshalAs (UnmanagedType.I1)] out bool outIsOpen); + unsafe static extern AUGraphError AUGraphIsOpen (IntPtr inGraph, byte* outIsOpen); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphIsInitialized (IntPtr inGraph, [MarshalAs (UnmanagedType.I1)] out bool outIsInitialized); + unsafe static extern AUGraphError AUGraphIsInitialized (IntPtr inGraph, byte* outIsInitialized); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphIsRunning (IntPtr inGraph, [MarshalAs (UnmanagedType.I1)] out bool outIsRunning); + unsafe static extern AUGraphError AUGraphIsRunning (IntPtr inGraph, byte* outIsRunning); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphGetCPULoad (IntPtr inGraph, out float /* Float32* */ outAverageCPULoad); + unsafe static extern AUGraphError AUGraphGetCPULoad (IntPtr inGraph, float* /* Float32* */ outAverageCPULoad); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphGetMaxCPULoad (IntPtr inGraph, out float /* Float32* */ outMaxLoad); + unsafe static extern AUGraphError AUGraphGetMaxCPULoad (IntPtr inGraph, float* /* Float32* */ outMaxLoad); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphSetNodeInputCallback (IntPtr inGraph, int /* AUNode = SInt32 */ inDestNode, uint /* UInt32 */ inDestInputNumber, ref AURenderCallbackStruct inInputCallback); + unsafe static extern AUGraphError AUGraphSetNodeInputCallback (IntPtr inGraph, int /* AUNode = SInt32 */ inDestNode, uint /* UInt32 */ inDestInputNumber, AURenderCallbackStruct* inInputCallback); [DllImport (Constants.AudioToolboxLibrary)] - static extern AUGraphError AUGraphUpdate (IntPtr inGraph, [MarshalAs (UnmanagedType.I1)] out bool outIsUpdated); + unsafe static extern AUGraphError AUGraphUpdate (IntPtr inGraph, byte* outIsUpdated); [DllImport (Constants.AudioToolboxLibrary)] static extern void CAShow (IntPtr handle); diff --git a/src/GameController/GCMouse.cs b/src/GameController/GCMouse.cs new file mode 100644 index 000000000000..4148c09766c9 --- /dev/null +++ b/src/GameController/GCMouse.cs @@ -0,0 +1,53 @@ +#nullable enable + +using System; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; + +using ObjCRuntime; +using Foundation; + +namespace GameController { + +#if !XAMCORE_5_0 + // The GCMouse doesn't conform to NSCoding/NSSecureCoding, but it probably did in an early beta, which is why we declared it as such. + public partial class GCMouse : INSCoding, INSSecureCoding { + [BindingImpl (BindingImplOptions.Optimizable)] + [EditorBrowsable (EditorBrowsableState.Never)] + public GCMouse (NSCoder coder) : base (NSObjectFlag.Empty) + { + if (IsDirectBinding) { + InitializeHandle (global::ObjCRuntime.Messaging.IntPtr_objc_msgSend_IntPtr (this.Handle, Selector.GetHandle ("initWithCoder:"), coder.Handle), "initWithCoder:"); + } else { + InitializeHandle (global::ObjCRuntime.Messaging.IntPtr_objc_msgSendSuper_IntPtr (this.SuperHandle, Selector.GetHandle ("initWithCoder:"), coder.Handle), "initWithCoder:"); + } + } + +#if NET + [SupportedOSPlatform ("ios14.0")] + [SupportedOSPlatform ("macos")] + [SupportedOSPlatform ("tvos14.0")] + [SupportedOSPlatform ("maccatalyst")] +#endif + [BindingImpl (BindingImplOptions.Optimizable)] + [EditorBrowsable (EditorBrowsableState.Never)] + public virtual void EncodeTo (NSCoder encoder) + { + var encoder__handle__ = encoder!.GetNonNullHandle (nameof (encoder)); +#if NET + if (IsDirectBinding) { + global::ObjCRuntime.Messaging.void_objc_msgSend_NativeHandle (this.Handle, Selector.GetHandle ("encodeWithCoder:"), encoder__handle__); + } else { + global::ObjCRuntime.Messaging.void_objc_msgSendSuper_NativeHandle (this.SuperHandle, Selector.GetHandle ("encodeWithCoder:"), encoder__handle__); + } +#else + if (IsDirectBinding) { + global::ObjCRuntime.Messaging.void_objc_msgSend_IntPtr (this.Handle, Selector.GetHandle ("encodeWithCoder:"), encoder__handle__); + } else { + global::ObjCRuntime.Messaging.void_objc_msgSendSuper_IntPtr (this.SuperHandle, Selector.GetHandle ("encodeWithCoder:"), encoder__handle__); + } +#endif + } + } +#endif // !XAMCORE_5_0 +} diff --git a/src/MediaToolbox/MTAudioProcessingTap.cs b/src/MediaToolbox/MTAudioProcessingTap.cs index c42e7c20c09e..1cf58dad97b6 100644 --- a/src/MediaToolbox/MTAudioProcessingTap.cs +++ b/src/MediaToolbox/MTAudioProcessingTap.cs @@ -35,6 +35,7 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Collections.Generic; using Foundation; @@ -64,11 +65,11 @@ unsafe struct Callbacks public /* MTAudioProcessingTapUnprepareCallback */ delegate* unmanaged unprepare; public /* MTAudioProcessingTapProcessCallback */ delegate* unmanaged process; #else - public /* MTAudioProcessingTapInitCallback */ MTAudioProcessingTapInitCallbackProxy init; - public /* MTAudioProcessingTapFinalizeCallback */ Action_IntPtr finalize; - public /* MTAudioProcessingTapPrepareCallback */ MTAudioProcessingTapPrepareCallbackProxy prepare; - public /* MTAudioProcessingTapUnprepareCallback */ Action_IntPtr unprepare; - public /* MTAudioProcessingTapProcessCallback */ MTAudioProcessingTapProcessCallbackProxy process; + public /* MTAudioProcessingTapInitCallback */ IntPtr init; + public /* MTAudioProcessingTapFinalizeCallback */ IntPtr finalize; + public /* MTAudioProcessingTapPrepareCallback */ IntPtr prepare; + public /* MTAudioProcessingTapUnprepareCallback */ IntPtr unprepare; + public /* MTAudioProcessingTapProcessCallback */ IntPtr process; #endif #pragma warning restore 169 } @@ -96,11 +97,11 @@ delegate void MTAudioProcessingTapProcessCallbackProxy (/* MTAudioProcessingTapR } [DllImport (Constants.MediaToolboxLibrary)] - extern static /* OSStatus */ MTAudioProcessingTapError MTAudioProcessingTapCreate ( + unsafe extern static /* OSStatus */ MTAudioProcessingTapError MTAudioProcessingTapCreate ( /* CFAllocatorRef*/ IntPtr allocator, - /* const MTAudioProcessingTapCallbacks* */ ref Callbacks callbacks, + /* const MTAudioProcessingTapCallbacks* */ Callbacks* callbacks, MTAudioProcessingTapCreationFlags flags, - /* MTAudioProcessingTapRef* */ out IntPtr tapOut); + /* MTAudioProcessingTapRef* */ IntPtr* tapOut); public MTAudioProcessingTap (MTAudioProcessingTapCallbacks callbacks, MTAudioProcessingTapCreationFlags flags) { @@ -127,14 +128,14 @@ public MTAudioProcessingTap (MTAudioProcessingTapCallbacks callbacks, MTAudioPro c.process = &ProcessProxy; #else if (callbacks.Initialize is not null) - c.init = InitializeProxy; + c.init = Marshal.GetFunctionPointerForDelegate (InitializeProxyCallback); if (callbacks.Finalize is not null) - c.finalize = FinalizeProxy; + c.finalize = Marshal.GetFunctionPointerForDelegate (FinalizeProxyCallback); if (callbacks.Prepare is not null) - c.prepare = PrepareProxy; + c.prepare = Marshal.GetFunctionPointerForDelegate (PrepareProxyCallback); if (callbacks.Unprepare is not null) - c.unprepare = UnprepareProxy; - c.process = ProcessProxy; + c.unprepare = Marshal.GetFunctionPointerForDelegate (UnprepareProxyCallback); + c.process = Marshal.GetFunctionPointerForDelegate (ProcessProxyCallback); #endif } @@ -145,7 +146,11 @@ public MTAudioProcessingTap (MTAudioProcessingTapCallbacks callbacks, MTAudioPro var gch = GCHandle.Alloc (this); c.clientInfo = (IntPtr)gch; - var res = MTAudioProcessingTapCreate (IntPtr.Zero, ref c, flags, out var handle); + IntPtr handle; + MTAudioProcessingTapError res; + unsafe { + res = MTAudioProcessingTapCreate (IntPtr.Zero, &c, flags, &handle); + } // we won't need the GCHandle after the Create call gch.Free (); @@ -177,10 +182,10 @@ protected override void Dispose (bool disposing) } [DllImport (Constants.MediaToolboxLibrary)] - extern static /* OSStatus */ MTAudioProcessingTapError MTAudioProcessingTapGetSourceAudio ( + unsafe extern static /* OSStatus */ MTAudioProcessingTapError MTAudioProcessingTapGetSourceAudio ( /* MTAudioProcessingTapRef */ IntPtr tap, IntPtr numberFrames, /* AudioBufferList* */ IntPtr bufferListInOut, - out MTAudioProcessingTapFlags flagsOut, out CMTimeRange timeRangeOut, out IntPtr numberFramesOut); + MTAudioProcessingTapFlags* flagsOut, CMTimeRange* timeRangeOut, IntPtr* numberFramesOut); public MTAudioProcessingTapError GetSourceAudio (nint frames, AudioBuffers bufferList, out MTAudioProcessingTapFlags flags, out CMTimeRange timeRange, out nint framesProvided) { @@ -188,7 +193,17 @@ public MTAudioProcessingTapError GetSourceAudio (nint frames, AudioBuffers buffe ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (bufferList)); IntPtr result; - var r = MTAudioProcessingTapGetSourceAudio (Handle, (IntPtr) frames, (IntPtr) bufferList, out flags, out timeRange, out result); + MTAudioProcessingTapError r; + flags = default; + timeRange = default; + unsafe { + r = MTAudioProcessingTapGetSourceAudio (Handle, + (IntPtr) frames, + (IntPtr) bufferList, + (MTAudioProcessingTapFlags *) Unsafe.AsPointer (ref flags), + (CMTimeRange *) Unsafe.AsPointer (ref timeRange), + &result); + } framesProvided = (nint) result; return r; } @@ -201,6 +216,7 @@ public MTAudioProcessingTapError GetSourceAudio (nint frames, AudioBuffers buffe [UnmanagedCallersOnly] unsafe static void InitializeProxy (IntPtr tap, IntPtr /*void**/ clientInfo, void** tapStorage) #else + unsafe static MTAudioProcessingTapInitCallbackProxy InitializeProxyCallback = InitializeProxy; [MonoPInvokeCallback (typeof (MTAudioProcessingTapInitCallbackProxy))] unsafe static void InitializeProxy (IntPtr tap, IntPtr /*void**/ clientInfo, out void* tapStorage) #endif @@ -229,6 +245,7 @@ unsafe static void InitializeProxy (IntPtr tap, IntPtr /*void**/ clientInfo, out static unsafe void ProcessProxy (IntPtr tap, IntPtr numberFrames, MTAudioProcessingTapFlags flags, IntPtr bufferList, IntPtr* numberFramesOut, MTAudioProcessingTapFlags* flagsOut) #else + static MTAudioProcessingTapProcessCallbackProxy ProcessProxyCallback = ProcessProxy; [MonoPInvokeCallback (typeof (MTAudioProcessingTapProcessCallbackProxy))] static void ProcessProxy (IntPtr tap, IntPtr numberFrames, MTAudioProcessingTapFlags flags, IntPtr bufferList, out IntPtr numberFramesOut, out MTAudioProcessingTapFlags flagsOut) @@ -261,6 +278,7 @@ static void ProcessProxy (IntPtr tap, IntPtr numberFrames, MTAudioProcessingTapF #if NET [UnmanagedCallersOnly] #else + static Action_IntPtr FinalizeProxyCallback = FinalizeProxy; [MonoPInvokeCallback (typeof (Action_IntPtr))] #endif static void FinalizeProxy (IntPtr tap) @@ -275,6 +293,7 @@ static void FinalizeProxy (IntPtr tap) [UnmanagedCallersOnly] static unsafe void PrepareProxy (IntPtr tap, IntPtr maxFrames, AudioStreamBasicDescription* processingFormat) #else + static MTAudioProcessingTapPrepareCallbackProxy PrepareProxyCallback = PrepareProxy; [MonoPInvokeCallback (typeof (MTAudioProcessingTapPrepareCallbackProxy))] static void PrepareProxy (IntPtr tap, IntPtr maxFrames, ref AudioStreamBasicDescription processingFormat) #endif @@ -293,6 +312,7 @@ static void PrepareProxy (IntPtr tap, IntPtr maxFrames, ref AudioStreamBasicDesc #if NET [UnmanagedCallersOnly] #else + static Action_IntPtr UnprepareProxyCallback = UnprepareProxy; [MonoPInvokeCallback (typeof (Action_IntPtr))] #endif static void UnprepareProxy (IntPtr tap) diff --git a/src/Network/NWProtocolDefinition.cs b/src/Network/NWProtocolDefinition.cs index f8c86497e4f4..97a2be27c113 100644 --- a/src/Network/NWProtocolDefinition.cs +++ b/src/Network/NWProtocolDefinition.cs @@ -43,8 +43,7 @@ public NWProtocolDefinition (NativeHandle handle, bool owns) : base (handle, own #endif [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - static extern bool nw_protocol_definition_is_equal (OS_nw_protocol_definition definition1, OS_nw_protocol_definition definition2); + static extern byte nw_protocol_definition_is_equal (OS_nw_protocol_definition definition1, OS_nw_protocol_definition definition2); public bool Equals (object other) { @@ -52,7 +51,7 @@ public bool Equals (object other) return false; if (!(other is NWProtocolDefinition otherDefinition)) return false; - return nw_protocol_definition_is_equal (GetCheckedHandle (), otherDefinition.Handle); + return nw_protocol_definition_is_equal (GetCheckedHandle (), otherDefinition.Handle) != 0; } [DllImport (Constants.NetworkLibrary)] diff --git a/src/Network/NWProtocolIPOptions.cs b/src/Network/NWProtocolIPOptions.cs index 19c75f889349..d8b0f0baddea 100644 --- a/src/Network/NWProtocolIPOptions.cs +++ b/src/Network/NWProtocolIPOptions.cs @@ -47,13 +47,13 @@ public void SetHopLimit (nuint hopLimit) => nw_ip_options_set_hop_limit (GetCheckedHandle (), (byte) hopLimit); public void SetUseMinimumMtu (bool useMinimumMtu) - => nw_ip_options_set_use_minimum_mtu (GetCheckedHandle (), useMinimumMtu); + => nw_ip_options_set_use_minimum_mtu (GetCheckedHandle (), useMinimumMtu.AsByte ()); public void SetDisableFragmentation (bool disableFragmentation) - => nw_ip_options_set_disable_fragmentation (GetCheckedHandle (), disableFragmentation); + => nw_ip_options_set_disable_fragmentation (GetCheckedHandle (), disableFragmentation.AsByte ()); public void SetCalculateReceiveTime (bool shouldCalculateReceiveTime) - => nw_ip_options_set_calculate_receive_time (GetCheckedHandle (), shouldCalculateReceiveTime); + => nw_ip_options_set_calculate_receive_time (GetCheckedHandle (), shouldCalculateReceiveTime.AsByte ()); public void SetIPLocalAddressPreference (NWIPLocalAddressPreference localAddressPreference) => nw_ip_options_set_local_address_preference (GetCheckedHandle (), localAddressPreference); @@ -71,7 +71,7 @@ public void SetIPLocalAddressPreference (NWIPLocalAddressPreference localAddress [MacCatalyst (15, 0)] #endif [DllImport (Constants.NetworkLibrary)] - static extern void nw_ip_options_set_disable_multicast_loopback (OS_nw_protocol_options options, [MarshalAs (UnmanagedType.I1)] bool disableMulticastLoopback); + static extern void nw_ip_options_set_disable_multicast_loopback (OS_nw_protocol_options options, byte disableMulticastLoopback); #if NET [SupportedOSPlatform ("tvos15.0")] @@ -86,6 +86,6 @@ public void SetIPLocalAddressPreference (NWIPLocalAddressPreference localAddress [MacCatalyst (15, 0)] #endif public void DisableMulticastLoopback (bool disable) - => nw_ip_options_set_disable_multicast_loopback (GetCheckedHandle (), disable); + => nw_ip_options_set_disable_multicast_loopback (GetCheckedHandle (), disable.AsByte ()); } } diff --git a/src/Network/NWProtocolMetadata.cs b/src/Network/NWProtocolMetadata.cs index 61e4db896eee..9c4a9922445f 100644 --- a/src/Network/NWProtocolMetadata.cs +++ b/src/Network/NWProtocolMetadata.cs @@ -73,28 +73,24 @@ public NWProtocolMetadata (NativeHandle handle, bool owns) : base (handle, owns) public NWProtocolDefinition ProtocolDefinition => new NWProtocolDefinition (nw_protocol_metadata_copy_definition (GetCheckedHandle ()), owns: true); [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - internal static extern bool nw_protocol_metadata_is_ip (OS_nw_protocol_metadata metadata); + internal static extern byte nw_protocol_metadata_is_ip (OS_nw_protocol_metadata metadata); - public bool IsIP => nw_protocol_metadata_is_ip (GetCheckedHandle ()); + public bool IsIP => nw_protocol_metadata_is_ip (GetCheckedHandle ()) != 0; [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - internal static extern bool nw_protocol_metadata_is_udp (OS_nw_protocol_metadata metadata); + internal static extern byte nw_protocol_metadata_is_udp (OS_nw_protocol_metadata metadata); - public bool IsUdp => nw_protocol_metadata_is_udp (GetCheckedHandle ()); + public bool IsUdp => nw_protocol_metadata_is_udp (GetCheckedHandle ()) != 0; [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - internal static extern bool nw_protocol_metadata_is_tls (OS_nw_protocol_metadata metadata); + internal static extern byte nw_protocol_metadata_is_tls (OS_nw_protocol_metadata metadata); - public bool IsTls => nw_protocol_metadata_is_tls (GetCheckedHandle ()); + public bool IsTls => nw_protocol_metadata_is_tls (GetCheckedHandle ()) != 0; [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - internal static extern bool nw_protocol_metadata_is_tcp (OS_nw_protocol_metadata metadata); + internal static extern byte nw_protocol_metadata_is_tcp (OS_nw_protocol_metadata metadata); - public bool IsTcp => nw_protocol_metadata_is_tcp (GetCheckedHandle ()); + public bool IsTcp => nw_protocol_metadata_is_tcp (GetCheckedHandle ()) != 0; #if NET [SupportedOSPlatform ("tvos15.0")] @@ -109,8 +105,7 @@ public NWProtocolMetadata (NativeHandle handle, bool owns) : base (handle, owns) [MacCatalyst (15, 0)] #endif [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - static extern bool nw_protocol_metadata_is_quic (OS_nw_protocol_metadata metadata); + static extern byte nw_protocol_metadata_is_quic (OS_nw_protocol_metadata metadata); #if NET [SupportedOSPlatform ("tvos15.0")] @@ -124,7 +119,7 @@ public NWProtocolMetadata (NativeHandle handle, bool owns) : base (handle, owns) [iOS (15, 0)] [MacCatalyst (15, 0)] #endif - public bool IsQuic => nw_protocol_metadata_is_quic (GetCheckedHandle ()); + public bool IsQuic => nw_protocol_metadata_is_quic (GetCheckedHandle ()) != 0; [DllImport (Constants.NetworkLibrary)] internal static extern IntPtr nw_tls_copy_sec_protocol_metadata (IntPtr handle); @@ -253,8 +248,7 @@ public uint TcpGetAvailableSendBuffer () [iOS (13, 0)] #endif [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - internal static extern bool nw_protocol_metadata_is_framer_message (OS_nw_protocol_metadata metadata); + internal static extern byte nw_protocol_metadata_is_framer_message (OS_nw_protocol_metadata metadata); #if NET [SupportedOSPlatform ("tvos13.0")] @@ -265,7 +259,7 @@ public uint TcpGetAvailableSendBuffer () [TV (13, 0)] [iOS (13, 0)] #endif - public bool IsFramerMessage => nw_protocol_metadata_is_framer_message (GetCheckedHandle ()); + public bool IsFramerMessage => nw_protocol_metadata_is_framer_message (GetCheckedHandle ()) != 0; #if NET [SupportedOSPlatform ("tvos13.0")] @@ -277,8 +271,7 @@ public uint TcpGetAvailableSendBuffer () [iOS (13, 0)] #endif [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - internal static extern bool nw_protocol_metadata_is_ws (OS_nw_protocol_metadata metadata); + internal static extern byte nw_protocol_metadata_is_ws (OS_nw_protocol_metadata metadata); #if NET [SupportedOSPlatform ("tvos13.0")] @@ -289,6 +282,6 @@ public uint TcpGetAvailableSendBuffer () [TV (13, 0)] [iOS (13, 0)] #endif - public bool IsWebSocket => nw_protocol_metadata_is_ws (GetCheckedHandle ()); + public bool IsWebSocket => nw_protocol_metadata_is_ws (GetCheckedHandle ()) != 0; } } diff --git a/src/Network/NWProtocolOptions.cs b/src/Network/NWProtocolOptions.cs index e4df34d1081c..f63562f583d2 100644 --- a/src/Network/NWProtocolOptions.cs +++ b/src/Network/NWProtocolOptions.cs @@ -132,35 +132,35 @@ public void IPSetHopLimit (byte hopLimit) #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal static extern void nw_ip_options_set_use_minimum_mtu (IntPtr options, [MarshalAs (UnmanagedType.I1)] bool use_minimum_mtu); + internal static extern void nw_ip_options_set_use_minimum_mtu (IntPtr options, byte use_minimum_mtu); #if !NET [Obsolete ("Use the 'NWProtocolIPOptions' class instead.")] public void IPSetUseMinimumMtu (bool useMinimumMtu) { - nw_ip_options_set_use_minimum_mtu (GetCheckedHandle (), useMinimumMtu); + nw_ip_options_set_use_minimum_mtu (GetCheckedHandle (), useMinimumMtu.AsByte ()); } #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal static extern void nw_ip_options_set_disable_fragmentation (IntPtr options, [MarshalAs (UnmanagedType.I1)] bool disable_fragmentation); + internal static extern void nw_ip_options_set_disable_fragmentation (IntPtr options, byte disable_fragmentation); #if !NET [Obsolete ("Use the 'NWProtocolIPOptions' class instead.")] public void IPSetDisableFragmentation (bool disableFragmentation) { - nw_ip_options_set_disable_fragmentation (GetCheckedHandle (), disableFragmentation); + nw_ip_options_set_disable_fragmentation (GetCheckedHandle (), disableFragmentation.AsByte ()); } #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal static extern void nw_ip_options_set_calculate_receive_time (IntPtr options, [MarshalAs (UnmanagedType.I1)] bool calculateReceiveTime); + internal static extern void nw_ip_options_set_calculate_receive_time (IntPtr options, byte calculateReceiveTime); #if !NET [Obsolete ("Use the 'NWProtocolIPOptions' class instead.")] public void IPSetCalculateReceiveTime (bool calculateReceiveTime) { - nw_ip_options_set_calculate_receive_time (GetCheckedHandle (), calculateReceiveTime); + nw_ip_options_set_calculate_receive_time (GetCheckedHandle (), calculateReceiveTime.AsByte ()); } #endif // !NET @@ -190,35 +190,35 @@ public NWIPLocalAddressPreference IPLocalAddressPreference { // [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_tcp_options_set_no_delay (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool noDelay); + internal extern static void nw_tcp_options_set_no_delay (IntPtr handle, byte noDelay); #if !NET [Obsolete ("Use the 'NWProtocolTcpOptions' class instead.")] - public void TcpSetNoDelay (bool noDelay) => nw_tcp_options_set_no_delay (GetCheckedHandle (), noDelay); + public void TcpSetNoDelay (bool noDelay) => nw_tcp_options_set_no_delay (GetCheckedHandle (), noDelay.AsByte ()); #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_tcp_options_set_no_push (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool noPush); + internal extern static void nw_tcp_options_set_no_push (IntPtr handle, byte noPush); #if !NET [Obsolete ("Use the 'NWProtocolTcpOptions' class instead.")] - public void TcpSetNoPush (bool noPush) => nw_tcp_options_set_no_push (GetCheckedHandle (), noPush); + public void TcpSetNoPush (bool noPush) => nw_tcp_options_set_no_push (GetCheckedHandle (), noPush.AsByte ()); #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_tcp_options_set_no_options (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool noOptions); + internal extern static void nw_tcp_options_set_no_options (IntPtr handle, byte noOptions); #if !NET [Obsolete ("Use the 'NWProtocolTcpOptions' class instead.")] - public void TcpSetNoOptions (bool noOptions) => nw_tcp_options_set_no_options (GetCheckedHandle (), noOptions); + public void TcpSetNoOptions (bool noOptions) => nw_tcp_options_set_no_options (GetCheckedHandle (), noOptions.AsByte ()); #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_tcp_options_set_enable_keepalive (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool enableKeepAlive); + internal extern static void nw_tcp_options_set_enable_keepalive (IntPtr handle, byte enableKeepAlive); #if !NET [Obsolete ("Use the 'NWProtocolTcpOptions' class instead.")] - public void TcpSetEnableKeepAlive (bool enableKeepAlive) => nw_tcp_options_set_enable_keepalive (GetCheckedHandle (), enableKeepAlive); + public void TcpSetEnableKeepAlive (bool enableKeepAlive) => nw_tcp_options_set_enable_keepalive (GetCheckedHandle (), enableKeepAlive.AsByte ()); #endif // !NET [DllImport (Constants.NetworkLibrary)] @@ -278,46 +278,46 @@ public NWIPLocalAddressPreference IPLocalAddressPreference { #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_tcp_options_set_retransmit_fin_drop (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool retransmitFinDrop); + internal extern static void nw_tcp_options_set_retransmit_fin_drop (IntPtr handle, byte retransmitFinDrop); #if !NET [Obsolete ("Use the 'NWProtocolTcpOptions' class instead.")] - public void TcpSetRetransmitFinDrop (bool retransmitFinDrop) => nw_tcp_options_set_retransmit_fin_drop (GetCheckedHandle (), retransmitFinDrop); + public void TcpSetRetransmitFinDrop (bool retransmitFinDrop) => nw_tcp_options_set_retransmit_fin_drop (GetCheckedHandle (), retransmitFinDrop.AsByte ()); #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_tcp_options_set_disable_ack_stretching (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool disableAckStretching); + internal extern static void nw_tcp_options_set_disable_ack_stretching (IntPtr handle, byte disableAckStretching); #if !NET [Obsolete ("Use the 'NWProtocolTcpOptions' class instead.")] - public void TcpSetDisableAckStretching (bool disableAckStretching) => nw_tcp_options_set_disable_ack_stretching (GetCheckedHandle (), disableAckStretching); + public void TcpSetDisableAckStretching (bool disableAckStretching) => nw_tcp_options_set_disable_ack_stretching (GetCheckedHandle (), disableAckStretching.AsByte ()); #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_tcp_options_set_enable_fast_open (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool enableFastOpen); + internal extern static void nw_tcp_options_set_enable_fast_open (IntPtr handle, byte enableFastOpen); #if !NET [Obsolete ("Use the 'NWProtocolTcpOptions' class instead.")] - public void TcpSetEnableFastOpen (bool enableFastOpen) => nw_tcp_options_set_enable_fast_open (GetCheckedHandle (), enableFastOpen); + public void TcpSetEnableFastOpen (bool enableFastOpen) => nw_tcp_options_set_enable_fast_open (GetCheckedHandle (), enableFastOpen.AsByte ()); #endif // !NET [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_tcp_options_set_disable_ecn (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool disableEcn); + internal extern static void nw_tcp_options_set_disable_ecn (IntPtr handle, byte disableEcn); #if !NET [Obsolete ("Use the 'NWProtocolTcpOptions' class instead.")] - public void TcpSetDisableEcn (bool disableEcn) => nw_tcp_options_set_disable_ecn (GetCheckedHandle (), disableEcn); + public void TcpSetDisableEcn (bool disableEcn) => nw_tcp_options_set_disable_ecn (GetCheckedHandle (), disableEcn.AsByte ()); #endif // !NET // // UDP Options // [DllImport (Constants.NetworkLibrary)] - internal extern static void nw_udp_options_set_prefer_no_checksum (IntPtr handle, [MarshalAs (UnmanagedType.U1)] bool preferNoChecksums); + internal extern static void nw_udp_options_set_prefer_no_checksum (IntPtr handle, byte preferNoChecksums); #if !NET [Obsolete ("Use the 'NWProtocolUdpOptions' class instead.")] - public void UdpSetPreferNoChecksum (bool preferNoChecksums) => nw_udp_options_set_prefer_no_checksum (GetCheckedHandle (), preferNoChecksums); + public void UdpSetPreferNoChecksum (bool preferNoChecksums) => nw_udp_options_set_prefer_no_checksum (GetCheckedHandle (), preferNoChecksums.AsByte ()); #endif // !NET // @@ -345,9 +345,8 @@ public NWIPLocalAddressPreference IPLocalAddressPreference { [MacCatalyst (15, 0)] #endif [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - static extern bool nw_protocol_options_is_quic (IntPtr options); + static extern byte nw_protocol_options_is_quic (IntPtr options); - public bool IsQuic => nw_protocol_options_is_quic (GetCheckedHandle ()); + public bool IsQuic => nw_protocol_options_is_quic (GetCheckedHandle ()) != 0; } } diff --git a/src/Network/NWProtocolQuicOptions.cs b/src/Network/NWProtocolQuicOptions.cs index f45fda98721b..53d91c881860 100644 --- a/src/Network/NWProtocolQuicOptions.cs +++ b/src/Network/NWProtocolQuicOptions.cs @@ -54,15 +54,14 @@ public SecProtocolOptions SecProtocolOptions => new SecProtocolOptions (nw_quic_copy_sec_protocol_options (GetCheckedHandle ()), true); [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - static extern bool nw_quic_get_stream_is_unidirectional (OS_nw_protocol_options options); + static extern byte nw_quic_get_stream_is_unidirectional (OS_nw_protocol_options options); [DllImport (Constants.NetworkLibrary)] - static extern void nw_quic_set_stream_is_unidirectional (OS_nw_protocol_options options, [MarshalAs (UnmanagedType.I1)] bool isUnidirectional); + static extern void nw_quic_set_stream_is_unidirectional (OS_nw_protocol_options options, byte isUnidirectional); public bool StreamIsUnidirectional { - get => nw_quic_get_stream_is_unidirectional (GetCheckedHandle ()); - set => nw_quic_set_stream_is_unidirectional (GetCheckedHandle (), value); + get => nw_quic_get_stream_is_unidirectional (GetCheckedHandle ()) != 0; + set => nw_quic_set_stream_is_unidirectional (GetCheckedHandle (), value.AsByte ()); } [DllImport (Constants.NetworkLibrary)] @@ -209,8 +208,7 @@ public ushort DatagramFrameSize { [Watch (9, 0)] #endif [DllImport (Constants.NetworkLibrary)] - [return: MarshalAs (UnmanagedType.I1)] - static extern bool nw_quic_get_stream_is_datagram (OS_nw_protocol_options options); + static extern byte nw_quic_get_stream_is_datagram (OS_nw_protocol_options options); #if NET [SupportedOSPlatform ("tvos16.0")] @@ -224,7 +222,7 @@ public ushort DatagramFrameSize { [Watch (9, 0)] #endif [DllImport (Constants.NetworkLibrary)] - static extern void nw_quic_set_stream_is_datagram (OS_nw_protocol_options options, [MarshalAs (UnmanagedType.I1)] bool is_datagram); + static extern void nw_quic_set_stream_is_datagram (OS_nw_protocol_options options, byte is_datagram); #if NET [SupportedOSPlatform ("tvos16.0")] @@ -238,8 +236,8 @@ public ushort DatagramFrameSize { [Watch (9, 0)] #endif public bool StreamIsDatagram { - get => nw_quic_get_stream_is_datagram (GetCheckedHandle ()); - set => nw_quic_set_stream_is_datagram (GetCheckedHandle (), value); + get => nw_quic_get_stream_is_datagram (GetCheckedHandle ()) != 0; + set => nw_quic_set_stream_is_datagram (GetCheckedHandle (), value.AsByte ()); } #if NET diff --git a/src/Network/NWProtocolTcpOptions.cs b/src/Network/NWProtocolTcpOptions.cs index 68715baa783e..90858c17ebfd 100644 --- a/src/Network/NWProtocolTcpOptions.cs +++ b/src/Network/NWProtocolTcpOptions.cs @@ -43,13 +43,13 @@ internal NWProtocolTcpOptions (NativeHandle handle, bool owns) : base (handle, o public NWProtocolTcpOptions () : this (nw_tcp_create_options (), owns: true) { } - public void SetNoDelay (bool noDelay) => nw_tcp_options_set_no_delay (GetCheckedHandle (), noDelay); + public void SetNoDelay (bool noDelay) => nw_tcp_options_set_no_delay (GetCheckedHandle (), noDelay.AsByte ()); - public void SetNoPush (bool noPush) => nw_tcp_options_set_no_push (GetCheckedHandle (), noPush); + public void SetNoPush (bool noPush) => nw_tcp_options_set_no_push (GetCheckedHandle (), noPush.AsByte ()); - public void SetNoOptions (bool noOptions) => nw_tcp_options_set_no_options (GetCheckedHandle (), noOptions); + public void SetNoOptions (bool noOptions) => nw_tcp_options_set_no_options (GetCheckedHandle (), noOptions.AsByte ()); - public void SetEnableKeepAlive (bool enableKeepAlive) => nw_tcp_options_set_enable_keepalive (GetCheckedHandle (), enableKeepAlive); + public void SetEnableKeepAlive (bool enableKeepAlive) => nw_tcp_options_set_enable_keepalive (GetCheckedHandle (), enableKeepAlive.AsByte ()); public void SetKeepAliveCount (uint keepAliveCount) => nw_tcp_options_set_keepalive_count (GetCheckedHandle (), keepAliveCount); @@ -71,14 +71,14 @@ public void SetPersistTimeout (TimeSpan persistTimeout) public void SetRetransmitConnectionDropTime (TimeSpan connectionDropTime) => nw_tcp_options_set_retransmit_connection_drop_time (GetCheckedHandle (), (uint) connectionDropTime.Seconds); - public void SetRetransmitFinDrop (bool retransmitFinDrop) => nw_tcp_options_set_retransmit_fin_drop (GetCheckedHandle (), retransmitFinDrop); + public void SetRetransmitFinDrop (bool retransmitFinDrop) => nw_tcp_options_set_retransmit_fin_drop (GetCheckedHandle (), retransmitFinDrop.AsByte ()); public void SetDisableAckStretching (bool disableAckStretching) - => nw_tcp_options_set_disable_ack_stretching (GetCheckedHandle (), disableAckStretching); + => nw_tcp_options_set_disable_ack_stretching (GetCheckedHandle (), disableAckStretching.AsByte ()); - public void SetEnableFastOpen (bool enableFastOpen) => nw_tcp_options_set_enable_fast_open (GetCheckedHandle (), enableFastOpen); + public void SetEnableFastOpen (bool enableFastOpen) => nw_tcp_options_set_enable_fast_open (GetCheckedHandle (), enableFastOpen.AsByte ()); - public void SetDisableEcn (bool disableEcn) => nw_tcp_options_set_disable_ecn (GetCheckedHandle (), disableEcn); + public void SetDisableEcn (bool disableEcn) => nw_tcp_options_set_disable_ecn (GetCheckedHandle (), disableEcn.AsByte ()); #if NET [SupportedOSPlatform ("tvos15.0")] diff --git a/src/Network/NWProtocolUdpOptions.cs b/src/Network/NWProtocolUdpOptions.cs index eb6a98fd21b8..caf63051b708 100644 --- a/src/Network/NWProtocolUdpOptions.cs +++ b/src/Network/NWProtocolUdpOptions.cs @@ -37,6 +37,6 @@ internal NWProtocolUdpOptions (NativeHandle handle, bool owns) : base (handle, o public NWProtocolUdpOptions () : this (nw_udp_create_options (), owns: true) { } - public void SetPreferNoChecksum (bool preferNoChecksum) => nw_udp_options_set_prefer_no_checksum (GetCheckedHandle (), preferNoChecksum); + public void SetPreferNoChecksum (bool preferNoChecksum) => nw_udp_options_set_prefer_no_checksum (GetCheckedHandle (), preferNoChecksum.AsByte ()); } } diff --git a/src/OpenGL/OpenTK/Math/Matrix4.cs b/src/OpenGL/OpenTK/Math/Matrix4.cs index 1a25df13de09..65ad162a37b5 100644 --- a/src/OpenGL/OpenTK/Math/Matrix4.cs +++ b/src/OpenGL/OpenTK/Math/Matrix4.cs @@ -471,7 +471,7 @@ public static void CreateOrthographic (float width, float height, float zNear, f /// The height of the projection volume. /// The near edge of the projection volume. /// The far edge of the projection volume. - /// The resulting Matrix4 instance. + /// The resulting Matrix4 instance. public static Matrix4 CreateOrthographic (float width, float height, float zNear, float zFar) { Matrix4 result; diff --git a/src/OpenGL/OpenTK/Math/Matrix4d.cs b/src/OpenGL/OpenTK/Math/Matrix4d.cs index 6b7829d6f5d9..d9d63a709e7c 100644 --- a/src/OpenGL/OpenTK/Math/Matrix4d.cs +++ b/src/OpenGL/OpenTK/Math/Matrix4d.cs @@ -471,7 +471,7 @@ public static void CreateOrthographic (double width, double height, double zNear /// The height of the projection volume. /// The near edge of the projection volume. /// The far edge of the projection volume. - /// The resulting Matrix4d instance. + /// The resulting Matrix4d instance. public static Matrix4d CreateOrthographic (double width, double height, double zNear, double zFar) { Matrix4d result; diff --git a/src/SceneKit/SCNMatrix4.cs b/src/SceneKit/SCNMatrix4.cs index 314f1492e45a..907d61f46c37 100644 --- a/src/SceneKit/SCNMatrix4.cs +++ b/src/SceneKit/SCNMatrix4.cs @@ -580,7 +580,7 @@ public static void CreateOrthographic (pfloat width, pfloat height, pfloat zNear /// The height of the projection volume. /// The near edge of the projection volume. /// The far edge of the projection volume. - /// The resulting SCNMatrix4 instance. + /// The resulting SCNMatrix4 instance. public static SCNMatrix4 CreateOrthographic (pfloat width, pfloat height, pfloat zNear, pfloat zFar) { SCNMatrix4 result; diff --git a/src/SceneKit/SCNMatrix4_dotnet.cs b/src/SceneKit/SCNMatrix4_dotnet.cs index b205105a9c98..7351416da338 100644 --- a/src/SceneKit/SCNMatrix4_dotnet.cs +++ b/src/SceneKit/SCNMatrix4_dotnet.cs @@ -647,7 +647,7 @@ public static void CreateOrthographic (pfloat width, pfloat height, pfloat zNear /// The height of the projection volume. /// The near edge of the projection volume. /// The far edge of the projection volume. - /// The resulting SCNMatrix4 instance. + /// The resulting SCNMatrix4 instance. public static SCNMatrix4 CreateOrthographic (pfloat width, pfloat height, pfloat zNear, pfloat zFar) { SCNMatrix4 result; @@ -777,7 +777,7 @@ public static SCNMatrix4 CreatePerspectiveFieldOfView (pfloat fovy, pfloat aspec #region CreatePerspectiveOffCenter /// - /// Creates an perspective projection matrix. + /// Creates a perspective projection matrix. /// /// Left edge of the view frustum /// Right edge of the view frustum @@ -818,7 +818,7 @@ public static void CreatePerspectiveOffCenter (pfloat left, pfloat right, pfloat } /// - /// Creates an perspective projection matrix. + /// Creates a perspective projection matrix. /// /// Left edge of the view frustum /// Right edge of the view frustum @@ -849,7 +849,7 @@ public static SCNMatrix4 CreatePerspectiveOffCenter (pfloat left, pfloat right, /// /// Build a scaling matrix /// - /// Single scale factor for x,y and z axes + /// Single scale factor for x, y and z axes /// A scaling matrix public static SCNMatrix4 Scale (pfloat scale) { @@ -859,7 +859,7 @@ public static SCNMatrix4 Scale (pfloat scale) /// /// Build a scaling matrix /// - /// Scale factors for x,y and z axes + /// Scale factors for x, y and z axes /// A scaling matrix public static SCNMatrix4 Scale (SCNVector3 scale) { @@ -1147,7 +1147,7 @@ static bool InvertSoftware (SCNMatrix4 matrix, out SCNMatrix4 result) /// Calculate the inverse of the given matrix /// /// The matrix to invert - /// The inverse of the given matrix if it has one, or the input if it is singular + /// The inverse of the given matrix if it has one. /// Thrown if the SCNMatrix4 is singular. public static SCNMatrix4 Invert (SCNMatrix4 matrix) { diff --git a/src/SceneKit/SCNVector3.cs b/src/SceneKit/SCNVector3.cs index bd0d8dd2f38e..19c4abf1c243 100644 --- a/src/SceneKit/SCNVector3.cs +++ b/src/SceneKit/SCNVector3.cs @@ -238,7 +238,7 @@ public void NormalizeFast () public static readonly SCNVector3 UnitY = new SCNVector3 (0, 1, 0); /// - /// /// Defines a unit-length SCNVector3 that points towards the Z-axis. + /// Defines a unit-length SCNVector3 that points towards the Z-axis. /// public static readonly SCNVector3 UnitZ = new SCNVector3 (0, 0, 1); @@ -733,10 +733,10 @@ public static void BaryCentric (ref SCNVector3 a, ref SCNVector3 b, ref SCNVecto #region Transform #if NET - /// Transform a direction vector by the given Matrix - /// Assumes the matrix has a right-most column of (0,0,0,1), that is the translation part is ignored. - /// - /// The column vector to transform + /// Transform a direction vector by the given Matrix + /// Assumes the matrix has a right-most column of (0,0,0,1), that is the translation part is ignored. + /// + /// The column vector to transform /// The desired transformation /// The transformed vector #else @@ -754,14 +754,14 @@ public static SCNVector3 TransformVector (SCNVector3 vec, SCNMatrix4 mat) } #if NET - /// Transform a direction vector by the given Matrix - /// Assumes the matrix has a right-most column of (0,0,0,1), that is the translation part is ignored. - /// - /// The column vector to transform + /// Transform a direction vector by the given matrix. + /// Assumes the matrix has a right-most column of (0,0,0,1), that is the translation part is ignored. + /// + /// The column vector to transform /// The desired transformation /// The transformed vector #else - /// Transform a direction vector by the given Matrix + /// Transform a direction vector by the given matrix. /// Assumes the matrix has a bottom row of (0,0,0,1), that is the translation part is ignored. /// /// The row vector to transform diff --git a/src/bgen/Generator.cs b/src/bgen/Generator.cs index f532c9061d72..e9d6ad11de94 100644 --- a/src/bgen/Generator.cs +++ b/src/bgen/Generator.cs @@ -2543,11 +2543,14 @@ public void PrintPlatformAttributesNoDuplicates (MemberInfo generatedType, Membe } } - public string SelectorField (string s, bool ignore_inline_directive = false) + public string SelectorField (string s, bool ignore_inline_directive = false, bool force_gethandle = false) { string name; if (InlineSelectors && !ignore_inline_directive) + force_gethandle = true; + + if (force_gethandle) return "Selector.GetHandle (\"" + s + "\")"; if (selector_names.TryGetValue (s, out name)) @@ -2654,17 +2657,38 @@ public bool IsProtocol (Type type) return AttributeManager.HasAttribute (type); } + public string GetMethodName (MemberInformation minfo, bool is_async) + { + var mi = minfo.Method; + string name; + if (minfo.is_ctor) { + if (minfo.is_protocol_member) { + var bindAttribute = GetBindAttribute (mi); + name = bindAttribute?.Selector ?? "CreateInstance"; + } else { + name = Nomenclator.GetGeneratedTypeName (mi.DeclaringType); + } + } else if (is_async) { + name = GetAsyncName (mi); + } else { + name = mi.Name; + } + return name; + } + public string MakeSignature (MemberInformation minfo, bool is_async, ParameterInfo [] parameters, string extra = "", bool alreadyPreserved = false) { var mi = minfo.Method; var category_class = minfo.category_extension_type; StringBuilder sb = new StringBuilder (); - string name = minfo.is_ctor ? Nomenclator.GetGeneratedTypeName (mi.DeclaringType) : is_async ? GetAsyncName (mi) : mi.Name; + string name = GetMethodName (minfo, is_async); // Some codepaths already write preservation info PrintAttributes (minfo.mi, preserve: !alreadyPreserved, advice: true, bindAs: true, requiresSuper: true); - if (!minfo.is_ctor && !is_async) { + if (minfo.is_ctor && minfo.is_protocol_member) { + sb.Append ("T? "); + } else if (!minfo.is_ctor && !is_async) { var prefix = ""; if (!BindThirdPartyLibrary) { if (minfo.Method.ReturnType.IsArray) { @@ -2700,6 +2724,13 @@ public string MakeSignature (MemberInformation minfo, bool is_async, ParameterIn name = "Set" + name.Substring (4); } sb.Append (name); + + if (minfo.is_protocol_member) { + if (minfo.is_ctor || minfo.is_static) { + sb.Append (""); + } + } + sb.Append (" ("); bool comma = false; @@ -2718,6 +2749,14 @@ public string MakeSignature (MemberInformation minfo, bool is_async, ParameterIn MakeSignatureFromParameterInfo (comma, sb, mi, minfo.type, parameters); sb.Append (extra); sb.Append (")"); + + if (minfo.is_protocol_member) { + if (minfo.is_static || minfo.is_ctor) { + sb.Append (" where T: NSObject, "); + sb.Append ("I").Append (minfo.Method.DeclaringType.Name); + } + } + return sb.ToString (); } @@ -2929,10 +2968,10 @@ void GenerateInvoke (bool stret, bool supercall, MethodInfo mi, MemberInformatio if (minfo.is_interface_impl || minfo.is_extension_method) { var tmp = InlineSelectors; InlineSelectors = true; - selector_field = SelectorField (selector); + selector_field = SelectorField (selector, force_gethandle: minfo.is_protocol_member); InlineSelectors = tmp; } else { - selector_field = SelectorField (selector); + selector_field = SelectorField (selector, force_gethandle: minfo.is_protocol_member); } if (ShouldMarshalNativeExceptions (mi)) @@ -2946,6 +2985,12 @@ void GenerateInvoke (bool stret, bool supercall, MethodInfo mi, MemberInformatio print ("{0} ({5}, {1}{2}, {3}{4});", sig, target_name, handle, selector_field, args, ret_val); print ("aligned_assigned = true;"); + } else if (minfo.is_protocol_member && mi.Name == "Constructor") { + const string handleName = "__handle__"; + print ($"IntPtr {handleName};"); + print ($"{handleName} = global::{NamespaceCache.Messaging}.IntPtr_objc_msgSend (Class.GetHandle (typeof (T)), Selector.GetHandle (\"alloc\"));"); + print ($"{handleName} = {sig} ({handleName}, {selector_field}{args});"); + print ($"{(assign_to_temp ? "ret = " : "return ")} global::ObjCRuntime.Runtime.GetINativeObject ({handleName}, true);"); } else { bool returns = mi.ReturnType != TypeCache.System_Void && mi.Name != "Constructor"; string cast_a = "", cast_b = ""; @@ -3510,7 +3555,8 @@ public void GenerateMethodBody (MemberInformation minfo, MethodInfo mi, string s (IsNativeEnum (mi.ReturnType)) || (mi.ReturnType == TypeCache.System_Boolean) || (mi.ReturnType == TypeCache.System_Char) || - (mi.Name != "Constructor" && by_ref_processing.Length > 0 && mi.ReturnType != TypeCache.System_Void); + minfo.is_protocol_member && disposes.Length > 0 && mi.Name == "Constructor" || + ((mi.Name != "Constructor" || minfo.is_protocol_member) && by_ref_processing.Length > 0 && mi.ReturnType != TypeCache.System_Void); if (use_temp_return) { // for properties we (most often) put the attribute on the property itself, not the getter/setter methods @@ -3530,6 +3576,8 @@ public void GenerateMethodBody (MemberInformation minfo, MethodInfo mi, string s print ("byte ret;"); } else if (mi.ReturnType == TypeCache.System_Char) { print ("ushort ret;"); + } else if (minfo.is_ctor && minfo.is_protocol_member) { + print ($"T? ret;"); } else { var isClassType = mi.ReturnType.IsClass || mi.ReturnType.IsInterface; var nullableReturn = isClassType ? "?" : string.Empty; @@ -3540,7 +3588,7 @@ public void GenerateMethodBody (MemberInformation minfo, MethodInfo mi, string s bool needs_temp = use_temp_return || disposes.Length > 0; if (minfo.is_virtual_method || mi.Name == "Constructor") { //print ("if (this.GetType () == TypeManager.{0}) {{", type.Name); - if (external || minfo.is_interface_impl || minfo.is_extension_method) { + if (external || minfo.is_interface_impl || minfo.is_extension_method || minfo.is_protocol_member) { GenerateNewStyleInvoke (false, mi, minfo, sel, argsArray, needs_temp, category_type); } else { var may_throw = shouldMarshalNativeExceptions; @@ -3655,6 +3703,8 @@ public void GenerateMethodBody (MemberInformation minfo, MethodInfo mi, string s print ("return ret != 0;"); } else if (mi.ReturnType == TypeCache.System_Char) { print ("return (char) ret;"); + } else if (minfo.is_ctor && minfo.is_protocol_member) { + print ("return ret;"); } else { // we can't be 100% confident that the ObjC API annotations are correct so we always null check inside generated code print ("return ret!;"); @@ -4363,6 +4413,9 @@ void PrintBlockProxy (Type type) void PrintExport (MemberInformation minfo) { + if (minfo.is_ctor && minfo.is_protocol_member) + return; + if (minfo.is_export) print ("[Export (\"{0}\"{1})]", minfo.selector, minfo.is_variadic ? ", IsVariadic = true" : string.Empty); } @@ -4440,7 +4493,7 @@ void GenerateMethod (MemberInformation minfo) #if NET var is_abstract = false; - var do_not_call_base = minfo.is_abstract || minfo.is_model; + var do_not_call_base = (minfo.is_abstract || minfo.is_model) && !(minfo.is_ctor && minfo.is_protocol_member); #else var is_abstract = minfo.is_abstract; var do_not_call_base = minfo.is_model; @@ -4454,7 +4507,7 @@ void GenerateMethod (MemberInformation minfo) if (!is_abstract) { - if (minfo.is_ctor) { + if (minfo.is_ctor && !minfo.is_protocol_member) { indent++; print (": {0}", minfo.wrap_method is null ? "base (NSObjectFlag.Empty)" : minfo.wrap_method); indent--; @@ -4580,7 +4633,7 @@ group fullname by ns into g } } - IEnumerable SelectProtocolMethods (Type type, bool? @static = null, bool? required = null) + IEnumerable SelectProtocolMethods (Type type, bool? @static = null, bool? required = null, bool selectConstructors = false) { var list = type.GetMethods (BindingFlags.Public | BindingFlags.Instance); @@ -4588,7 +4641,7 @@ IEnumerable SelectProtocolMethods (Type type, bool? @static = null, if (m.IsSpecialName) continue; - if (m.Name == "Constructor") + if ((m.Name == "Constructor") != selectConstructors) continue; var attrs = AttributeManager.GetCustomAttributes (m); @@ -4686,6 +4739,7 @@ void GenerateProtocolTypes (Type type, string class_visibility, string TypeName, { var allProtocolMethods = new List (); var allProtocolProperties = new List (); + var allProtocolConstructors = new List (); var ifaces = (IEnumerable) type.GetInterfaces ().Concat (new Type [] { ReflectionExtensions.GetBaseType (type, this) }).OrderBy (v => v.FullName, StringComparer.Ordinal); if (type.Namespace is not null) { @@ -4697,6 +4751,7 @@ void GenerateProtocolTypes (Type type, string class_visibility, string TypeName, allProtocolMethods.AddRange (SelectProtocolMethods (type)); allProtocolProperties.AddRange (SelectProtocolProperties (type)); + allProtocolConstructors.AddRange (SelectProtocolMethods (type, selectConstructors: true)); var requiredInstanceMethods = allProtocolMethods.Where ((v) => IsRequired (v) && !AttributeManager.HasAttribute (v)).ToList (); var optionalInstanceMethods = allProtocolMethods.Where ((v) => !IsRequired (v) && !AttributeManager.HasAttribute (v)); @@ -4838,6 +4893,15 @@ void GenerateProtocolTypes (Type type, string class_visibility, string TypeName, print ("{"); indent++; + +#if NET + foreach (var ctor in allProtocolConstructors) { + var minfo = new MemberInformation (this, this, ctor, type, null); + minfo.is_protocol_member = true; + GenerateMethod (minfo); + print (""); + } +#endif foreach (var mi in requiredInstanceMethods) { if (AttributeManager.HasAttribute (mi)) continue; diff --git a/src/bgen/Models/MemberInformation.cs b/src/bgen/Models/MemberInformation.cs index e11919c0358f..d8d2b7fe3fad 100644 --- a/src/bgen/Models/MemberInformation.cs +++ b/src/bgen/Models/MemberInformation.cs @@ -33,6 +33,7 @@ public class MemberInformation { public bool is_variadic; public bool is_interface_impl; public bool is_extension_method; + public bool is_protocol_member; public bool is_appearance; public bool is_model; public bool is_ctor; @@ -215,6 +216,8 @@ public string GetModifiers () if (is_sealed) { mods += ""; + } else if (is_ctor && is_protocol_member) { + mods += "unsafe static "; } else if (is_static || is_category_extension || is_extension_method) { mods += "static "; } else if (is_abstract) { diff --git a/src/coreanimation.cs b/src/coreanimation.cs index a24c145a3b7c..73daff87e7ec 100644 --- a/src/coreanimation.cs +++ b/src/coreanimation.cs @@ -1854,7 +1854,7 @@ interface CAEmitterLayer { [Export ("seed")] int Seed { get; set; } // unsigned int - /** `emitterShape' values. **/ + /* `emitterShape' values. */ [Field ("kCAEmitterLayerPoint")] NSString ShapePoint { get; } @@ -1873,7 +1873,7 @@ interface CAEmitterLayer { [Field ("kCAEmitterLayerSphere")] NSString ShapeSphere { get; } - /** `emitterMode' values. **/ + /* `emitterMode' values. */ [Field ("kCAEmitterLayerPoints")] NSString ModePoints { get; } @@ -1886,7 +1886,7 @@ interface CAEmitterLayer { [Field ("kCAEmitterLayerVolume")] NSString ModeVolume { get; } - /** `renderOrder' values. **/ + /* `renderOrder' values. */ [Field ("kCAEmitterLayerUnordered")] NSString RenderUnordered { get; } diff --git a/src/frameworks.sources b/src/frameworks.sources index 28e3f2455a85..a387c07b63bf 100644 --- a/src/frameworks.sources +++ b/src/frameworks.sources @@ -923,6 +923,7 @@ GAMECONTROLLER_SOURCES = \ GameController/GCExtendedGamepadSnapshot.cs \ GameController/GCGamepadSnapshot.cs \ GameController/GCMicroGamepadSnapshot.cs \ + GameController/GCMouse.cs \ # GameKit diff --git a/src/gamecontroller.cs b/src/gamecontroller.cs index 2bc5492cada1..9b214e55554d 100644 --- a/src/gamecontroller.cs +++ b/src/gamecontroller.cs @@ -876,7 +876,7 @@ interface GCKeyboardInput { [Mac (11, 0), iOS (14, 0), TV (14, 0)] [MacCatalyst (14, 0)] [BaseType (typeof (NSObject))] - interface GCMouse : GCDevice, NSSecureCoding, NSCoding { + interface GCMouse : GCDevice { [NullAllowed, Export ("mouseInput", ArgumentSemantic.Strong)] GCMouseInput MouseInput { get; } diff --git a/src/healthkit.cs b/src/healthkit.cs index a4f16469ce88..32424ecf075d 100644 --- a/src/healthkit.cs +++ b/src/healthkit.cs @@ -2487,8 +2487,6 @@ enum HKDataTypeIdentifier { [Mac (13, 0)] [MacCatalyst (13, 1)] enum HKCategoryTypeIdentifier { - /**** HKCategoryType Identifiers ****/ - [Field ("HKCategoryTypeIdentifierSleepAnalysis")] SleepAnalysis, @@ -2810,8 +2808,6 @@ enum HKCategoryTypeIdentifier { [Mac (13, 0)] [MacCatalyst (13, 1)] enum HKCharacteristicTypeIdentifier { - /**** HKCharacteristicType Identifiers ****/ - [Field ("HKCharacteristicTypeIdentifierBiologicalSex")] BiologicalSex, diff --git a/tests/bgen/bgen-tests.csproj b/tests/bgen/bgen-tests.csproj index c283fb0844a6..e4a9f3007008 100644 --- a/tests/bgen/bgen-tests.csproj +++ b/tests/bgen/bgen-tests.csproj @@ -84,5 +84,11 @@ SdkVersions.cs + + BGenBase.cs + + + ProtocolTest.cs + diff --git a/tests/bindings-test/ApiDefinition.cs b/tests/bindings-test/ApiDefinition.cs index 505da3278c65..ddc40ac38a08 100644 --- a/tests/bindings-test/ApiDefinition.cs +++ b/tests/bindings-test/ApiDefinition.cs @@ -429,6 +429,34 @@ interface ObjCBlockTester { delegate void InnerBlock (int magic_number); delegate void OuterBlock ([BlockCallback] InnerBlock callback); +#if NET + [Protocol] + interface ConstructorProtocol { + [Abstract] + [Export ("initRequired:")] + IntPtr Constructor (string p0); + + [Export ("initOptional:")] + IntPtr Constructor (NSDate p0); + } + + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface TypeProvidingProtocolConstructors : ConstructorProtocol { + [Export ("initRequired:")] + new IntPtr Constructor (string p0); + + [Export ("initOptional:")] + new IntPtr Constructor (NSDate p0); + + [Export ("stringValue")] + string StringValue { get; set; } + + [Export ("dateValue")] + NSDate DateValue { get; set; } + } +#endif + [BaseType (typeof (NSObject))] interface EvilDeallocator { [Export ("evilCallback")] diff --git a/tests/bindings-test/ProtocolTest.cs b/tests/bindings-test/ProtocolTest.cs index 711f9d81ecd9..504051f5c8ca 100644 --- a/tests/bindings-test/ProtocolTest.cs +++ b/tests/bindings-test/ProtocolTest.cs @@ -9,6 +9,8 @@ using NUnit.Framework; +using Bindings.Test; + namespace Xamarin.BindingTests { [TestFixture] [Preserve (AllMembers = true)] @@ -29,6 +31,77 @@ bool HasProtocolAttributes { } } +#if NET + [Test] + public void Constructors () + { + using var dateNow = (NSDate) DateTime.Now; + + using (var obj = IConstructorProtocol.CreateInstance ("Hello world")) { + Assert.AreEqual ("Hello world", obj.StringValue, "A StringValue"); + Assert.IsNull (obj.DateValue, "A DateValue"); + } + + using (var obj = IConstructorProtocol.CreateInstance (dateNow)) { + Assert.IsNull (obj.StringValue, "B StringValue"); + Assert.AreEqual (dateNow, obj.DateValue, "B DateValue"); + } + + using (var obj = IConstructorProtocol.CreateInstance ("Hello Subclassed")) { + Assert.AreEqual ("Hello Subclassed", obj.StringValue, "C1 StringValue"); + Assert.IsNull (obj.DateValue, "C1 DateValue"); + } + + using (var obj = IConstructorProtocol.CreateInstance (dateNow)) { + Assert.IsNull (obj.StringValue, "C2 StringValue"); + Assert.AreEqual (dateNow, obj.DateValue, "C2 DateValue"); + } + + if (global::XamarinTests.ObjCRuntime.Registrar.IsDynamicRegistrar) { + Assert.Throws (() => { + IConstructorProtocol.CreateInstance ("Hello Subclassed 2"); + }, "D1 Exception"); + } else { + using (var obj = IConstructorProtocol.CreateInstance ("Hello Subclassed 2")) { + Assert.AreEqual ("Managed interceptor! Hello Subclassed 2", obj.StringValue, "D1 StringValue"); + Assert.IsNull (obj.DateValue, "D1 DateValue"); + } + } + + if (XamarinTests.ObjCRuntime.Registrar.IsDynamicRegistrar) { + Assert.Throws (() => { + IConstructorProtocol.CreateInstance (dateNow); + }, "D2 Exception"); + } else { + using (var obj = IConstructorProtocol.CreateInstance (dateNow)) { + Assert.IsNull (obj.StringValue, "D2 StringValue"); + Assert.AreEqual (dateNow.AddSeconds (42), obj.DateValue, "D2 DateValue"); + } + } + } + + class SubclassedTypeProvidingProtocolConstructors : TypeProvidingProtocolConstructors { + SubclassedTypeProvidingProtocolConstructors (NativeHandle handle) : base (handle) {} + + } + + class SubclassedTypeProvidingProtocolConstructors2 : TypeProvidingProtocolConstructors { + SubclassedTypeProvidingProtocolConstructors2 (NativeHandle handle) : base (handle) {} + + [Export ("initRequired:")] + public SubclassedTypeProvidingProtocolConstructors2 (string value) + : base ($"Managed interceptor! " + value) + { + } + + [Export ("initOptional:")] + public SubclassedTypeProvidingProtocolConstructors2 (NSDate value) + : base (value.AddSeconds (42)) + { + } + } +#endif + [Test] #if NET [UnconditionalSuppressMessage ("Trimming", "IL2026", Justification = "This test verifies trimmer behavior, and as such must do trimmer-unsafe stuff.")] diff --git a/tests/cecil-tests/BlittablePInvokes.KnownFailures.cs b/tests/cecil-tests/BlittablePInvokes.KnownFailures.cs index 7962081fef5f..8a70629e40df 100644 --- a/tests/cecil-tests/BlittablePInvokes.KnownFailures.cs +++ b/tests/cecil-tests/BlittablePInvokes.KnownFailures.cs @@ -17,20 +17,6 @@ namespace Cecil.Tests { public partial class BlittablePInvokes { static HashSet knownFailuresPInvokes = new HashSet { - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphAddNode(System.IntPtr,AudioUnit.AudioComponentDescription&,System.Int32&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphCountNodeInteractions(System.IntPtr,System.Int32,System.UInt32&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphGetCPULoad(System.IntPtr,System.Single&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphGetIndNode(System.IntPtr,System.UInt32,System.Int32&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphGetMaxCPULoad(System.IntPtr,System.Single&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphGetNodeCount(System.IntPtr,System.Int32&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphGetNumberOfInteractions(System.IntPtr,System.UInt32&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphIsInitialized(System.IntPtr,System.Boolean&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphIsOpen(System.IntPtr,System.Boolean&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphIsRunning(System.IntPtr,System.Boolean&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphNodeInfo(System.IntPtr,System.Int32,AudioUnit.AudioComponentDescription&,System.IntPtr&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphNodeInfo(System.IntPtr,System.Int32,System.IntPtr,System.IntPtr&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphSetNodeInputCallback(System.IntPtr,System.Int32,System.UInt32,AudioUnit.AURenderCallbackStruct&)", - "AudioUnit.AUGraphError AudioUnit.AUGraph::AUGraphUpdate(System.IntPtr,System.Boolean&)", "AVFoundation.AVSampleCursorAudioDependencyInfo ObjCRuntime.Messaging::AVSampleCursorAudioDependencyInfo_objc_msgSend(System.IntPtr,System.IntPtr)", "AVFoundation.AVSampleCursorAudioDependencyInfo ObjCRuntime.Messaging::AVSampleCursorAudioDependencyInfo_objc_msgSendSuper(System.IntPtr,System.IntPtr)", "AVFoundation.AVSampleCursorChunkInfo ObjCRuntime.Messaging::AVSampleCursorChunkInfo_objc_msgSend_stret(System.IntPtr,System.IntPtr)", @@ -41,8 +27,6 @@ public partial class BlittablePInvokes { "AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSend(System.IntPtr,System.IntPtr)", "AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSendSuper_stret(System.IntPtr,System.IntPtr)", "AVFoundation.AVSampleCursorSyncInfo ObjCRuntime.Messaging::AVSampleCursorSyncInfo_objc_msgSendSuper(System.IntPtr,System.IntPtr)", - "MediaToolbox.MTAudioProcessingTapError MediaToolbox.MTAudioProcessingTap::MTAudioProcessingTapCreate(System.IntPtr,MediaToolbox.MTAudioProcessingTap/Callbacks&,MediaToolbox.MTAudioProcessingTapCreationFlags,System.IntPtr&)", - "MediaToolbox.MTAudioProcessingTapError MediaToolbox.MTAudioProcessingTap::MTAudioProcessingTapGetSourceAudio(System.IntPtr,System.IntPtr,System.IntPtr,MediaToolbox.MTAudioProcessingTapFlags&,CoreMedia.CMTimeRange&,System.IntPtr&)", "System.Boolean Network.NWAdvertiseDescriptor::nw_advertise_descriptor_get_no_auto_rename(System.IntPtr)", "System.Boolean Network.NWBrowserDescriptor::nw_browse_descriptor_get_include_txt_record(System.IntPtr)", "System.Boolean Network.NWConnectionGroup::nw_connection_group_reinsert_extracted_connection(System.IntPtr,System.IntPtr)", @@ -72,17 +56,6 @@ public partial class BlittablePInvokes { "System.Boolean Network.NWPath::nw_path_is_equal(System.IntPtr,System.IntPtr)", "System.Boolean Network.NWPath::nw_path_is_expensive(System.IntPtr)", "System.Boolean Network.NWPath::nw_path_uses_interface_type(System.IntPtr,Network.NWInterfaceType)", - "System.Boolean Network.NWProtocolDefinition::nw_protocol_definition_is_equal(System.IntPtr,System.IntPtr)", - "System.Boolean Network.NWProtocolMetadata::nw_protocol_metadata_is_framer_message(System.IntPtr)", - "System.Boolean Network.NWProtocolMetadata::nw_protocol_metadata_is_ip(System.IntPtr)", - "System.Boolean Network.NWProtocolMetadata::nw_protocol_metadata_is_quic(System.IntPtr)", - "System.Boolean Network.NWProtocolMetadata::nw_protocol_metadata_is_tcp(System.IntPtr)", - "System.Boolean Network.NWProtocolMetadata::nw_protocol_metadata_is_tls(System.IntPtr)", - "System.Boolean Network.NWProtocolMetadata::nw_protocol_metadata_is_udp(System.IntPtr)", - "System.Boolean Network.NWProtocolMetadata::nw_protocol_metadata_is_ws(System.IntPtr)", - "System.Boolean Network.NWProtocolOptions::nw_protocol_options_is_quic(System.IntPtr)", - "System.Boolean Network.NWProtocolQuicOptions::nw_quic_get_stream_is_datagram(System.IntPtr)", - "System.Boolean Network.NWProtocolQuicOptions::nw_quic_get_stream_is_unidirectional(System.IntPtr)", "System.Boolean Network.NWTxtRecord::nw_txt_record_access_bytes(System.IntPtr,ObjCRuntime.BlockLiteral*)", "System.Boolean Network.NWTxtRecord::nw_txt_record_access_key(System.IntPtr,System.IntPtr,ObjCRuntime.BlockLiteral*)", "System.Boolean Network.NWTxtRecord::nw_txt_record_apply(System.IntPtr,ObjCRuntime.BlockLiteral*)", @@ -110,21 +83,6 @@ public partial class BlittablePInvokes { "System.Void Network.NWParameters::nw_parameters_set_requires_dnssec_validation(System.IntPtr,System.Boolean)", "System.Void Network.NWParameters::nw_parameters_set_reuse_local_address(System.IntPtr,System.Boolean)", "System.Void Network.NWPrivacyContext::nw_privacy_context_require_encrypted_name_resolution(System.IntPtr,System.Boolean,System.IntPtr)", - "System.Void Network.NWProtocolIPOptions::nw_ip_options_set_disable_multicast_loopback(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_ip_options_set_calculate_receive_time(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_ip_options_set_disable_fragmentation(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_ip_options_set_use_minimum_mtu(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_tcp_options_set_disable_ack_stretching(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_tcp_options_set_disable_ecn(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_tcp_options_set_enable_fast_open(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_tcp_options_set_enable_keepalive(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_tcp_options_set_no_delay(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_tcp_options_set_no_options(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_tcp_options_set_no_push(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_tcp_options_set_retransmit_fin_drop(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolOptions::nw_udp_options_set_prefer_no_checksum(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolQuicOptions::nw_quic_set_stream_is_datagram(System.IntPtr,System.Boolean)", - "System.Void Network.NWProtocolQuicOptions::nw_quic_set_stream_is_unidirectional(System.IntPtr,System.Boolean)", "System.Void Network.NWWebSocketOptions::nw_ws_options_set_auto_reply_ping(System.IntPtr,System.Boolean)", "System.Void Network.NWWebSocketOptions::nw_ws_options_set_skip_handshake(System.IntPtr,System.Boolean)", "System.Void ObjCRuntime.Messaging::void_objc_msgSend_GCDualSenseAdaptiveTriggerPositionalAmplitudes_float(System.IntPtr,System.IntPtr,GameController.GCDualSenseAdaptiveTriggerPositionalAmplitudes,System.Single)", diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 90bc72913c3f..55f4a9a2ec1f 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -31195,6 +31195,7 @@ M:CoreML.IMLBatchProvider.GetFeatures(System.IntPtr) M:CoreML.IMLCustomLayer.EvaluateOnCpu(CoreML.MLMultiArray[],CoreML.MLMultiArray[],Foundation.NSError@) M:CoreML.IMLCustomLayer.GetOutputShapes(Foundation.NSArray[],Foundation.NSError@) M:CoreML.IMLCustomLayer.SetWeightData(Foundation.NSData[],Foundation.NSError@) +M:CoreML.IMLCustomModel.CreateInstance``1(CoreML.MLModelDescription,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},Foundation.NSError@) M:CoreML.IMLCustomModel.GetPrediction(CoreML.IMLFeatureProvider,CoreML.MLPredictionOptions,Foundation.NSError@) M:CoreML.IMLFeatureProvider.GetFeatureValue(System.String) M:CoreML.IMLWritable.Write(Foundation.NSUrl,Foundation.NSError@) @@ -32506,6 +32507,7 @@ M:Foundation.ExportAttribute.ToGetter(System.Reflection.PropertyInfo) M:Foundation.ExportAttribute.ToSetter(System.Reflection.PropertyInfo) M:Foundation.FieldAttribute.#ctor(System.String,System.String) M:Foundation.FieldAttribute.#ctor(System.String) +M:Foundation.INSCoding.CreateInstance``1(Foundation.NSCoder) M:Foundation.INSCoding.EncodeTo(Foundation.NSCoder) M:Foundation.INSCopying.Copy(Foundation.NSZone) M:Foundation.INSDiscardableContent.BeginContentAccess @@ -34094,7 +34096,6 @@ M:GameController.GCMotion.SetGravity(GameController.GCAcceleration) M:GameController.GCMotion.SetRotationRate(GameController.GCRotationRate) M:GameController.GCMotion.SetState(GameController.GCMotion) M:GameController.GCMotion.SetUserAcceleration(GameController.GCAcceleration) -M:GameController.GCMouse.EncodeTo(Foundation.NSCoder) M:GameController.GCPhysicalInputProfile.Capture M:GameController.GCPhysicalInputProfile.Dispose(System.Boolean) M:GameController.GCPhysicalInputProfile.GetMappedElementAlias(System.String) @@ -37831,9 +37832,11 @@ M:MetalKit.MTKView.ReleaseDrawables M:MetalKit.MTKView.WillDrawLayer(CoreAnimation.CALayer) M:MetalKit.MTKViewDelegate.Draw(MetalKit.MTKView) M:MetalKit.MTKViewDelegate.DrawableSizeWillChange(MetalKit.MTKView,CoreGraphics.CGSize) +M:MetalPerformanceShaders.IMPSCnnBatchNormalizationDataSource.CreateInstance``1(Foundation.NSCoder) M:MetalPerformanceShaders.IMPSCnnBatchNormalizationDataSource.Purge M:MetalPerformanceShaders.IMPSCnnConvolutionDataSource.Load M:MetalPerformanceShaders.IMPSCnnConvolutionDataSource.Purge +M:MetalPerformanceShaders.IMPSCnnInstanceNormalizationDataSource.CreateInstance``1(Foundation.NSCoder) M:MetalPerformanceShaders.IMPSDeviceProvider.GetMTLDevice M:MetalPerformanceShaders.IMPSHeapProvider.GetNewHeap(Metal.MTLHeapDescriptor) M:MetalPerformanceShaders.IMPSImageAllocator.GetImage(Metal.IMTLCommandBuffer,MetalPerformanceShaders.MPSImageDescriptor,MetalPerformanceShaders.MPSKernel) diff --git a/tests/generator/BGenBase.cs b/tests/generator/BGenBase.cs new file mode 100644 index 000000000000..09994ea321bd --- /dev/null +++ b/tests/generator/BGenBase.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Linq; +using System.IO; + +using NUnit.Framework; + +using Xamarin.Tests; + +namespace GeneratorTests { + public class BGenBase { + internal BGenTool BuildFile (Profile profile, params string [] filenames) + { + return BuildFile (profile, true, false, filenames); + } + + internal BGenTool BuildFile (Profile profile, bool nowarnings, params string [] filenames) + { + return BuildFile (profile, nowarnings, false, filenames); + } + + internal BGenTool BuildFile (Profile profile, bool nowarnings, bool processEnums, params string [] filenames) + { + return BuildFile (profile, nowarnings, processEnums, Enumerable.Empty (), filenames); + } + + internal BGenTool BuildFile (Profile profile, bool nowarnings, bool processEnums, IEnumerable references, params string [] filenames) + { + Configuration.IgnoreIfIgnoredPlatform (profile.AsPlatform ()); + var bgen = new BGenTool (); + bgen.Profile = profile; + bgen.ProcessEnums = processEnums; + bgen.Defines = BGenTool.GetDefaultDefines (bgen.Profile); + bgen.References = references.ToList (); + TestContext.Out.WriteLine (TestContext.CurrentContext.Test.FullName); + foreach (var filename in filenames) + TestContext.Out.WriteLine ($"\t{filename}"); + bgen.CreateTemporaryBinding (filenames.Select ((filename) => File.ReadAllText (Path.Combine (Configuration.SourceRoot, "tests", "generator", filename))).ToArray ()); + bgen.AssertExecute ("build"); + if (nowarnings) + bgen.AssertNoWarnings (); + return bgen; + } + } +} diff --git a/tests/generator/BGenTests.cs b/tests/generator/BGenTests.cs index b1b60b6dde19..fee5ec360887 100644 --- a/tests/generator/BGenTests.cs +++ b/tests/generator/BGenTests.cs @@ -15,7 +15,7 @@ namespace GeneratorTests { [TestFixture ()] [Parallelizable (ParallelScope.All)] - public class BGenTests { + public class BGenTests : BGenBase { // Removing the following variable might make running the unit tests in VSMac fail. static Type variable_to_keep_reference_to_system_runtime_compilerservices_unsafe_assembly = typeof (System.Runtime.CompilerServices.Unsafe); @@ -1556,38 +1556,5 @@ public void Issue19612 () bgen.AssertNoWarnings (); } #endif - - BGenTool BuildFile (Profile profile, params string [] filenames) - { - return BuildFile (profile, true, false, filenames); - } - - BGenTool BuildFile (Profile profile, bool nowarnings, params string [] filenames) - { - return BuildFile (profile, nowarnings, false, filenames); - } - - BGenTool BuildFile (Profile profile, bool nowarnings, bool processEnums, params string [] filenames) - { - return BuildFile (profile, nowarnings, processEnums, Enumerable.Empty (), filenames); - } - - BGenTool BuildFile (Profile profile, bool nowarnings, bool processEnums, IEnumerable references, params string [] filenames) - { - Configuration.IgnoreIfIgnoredPlatform (profile.AsPlatform ()); - var bgen = new BGenTool (); - bgen.Profile = profile; - bgen.ProcessEnums = processEnums; - bgen.Defines = BGenTool.GetDefaultDefines (bgen.Profile); - bgen.References = references.ToList (); - TestContext.Out.WriteLine (TestContext.CurrentContext.Test.FullName); - foreach (var filename in filenames) - TestContext.Out.WriteLine ($"\t{filename}"); - bgen.CreateTemporaryBinding (filenames.Select ((filename) => File.ReadAllText (Path.Combine (Configuration.SourceRoot, "tests", "generator", filename))).ToArray ()); - bgen.AssertExecute ("build"); - if (nowarnings) - bgen.AssertNoWarnings (); - return bgen; - } } } diff --git a/tests/generator/ProtocolTests.cs b/tests/generator/ProtocolTests.cs new file mode 100644 index 000000000000..7a115fc066ec --- /dev/null +++ b/tests/generator/ProtocolTests.cs @@ -0,0 +1,56 @@ +using System; +using System.Linq; + +using NUnit.Framework; +using Xamarin.Tests; + +namespace GeneratorTests { + [TestFixture ()] + [Parallelizable (ParallelScope.All)] + public class ProtocolTests : BGenBase { +#if !NET + [Ignore ("This only applies to .NET")] +#endif + [TestCase (Profile.MacCatalyst)] + [TestCase (Profile.iOS)] + public void Members (Profile profile) + { + var bgen = BuildFile (profile, "tests/protocols.cs"); + + var allTypeDefinitions = bgen.ApiAssembly.MainModule.GetTypes ().ToArray (); + var allTypes = allTypeDefinitions.Select (v => v.FullName).ToArray (); + + var allTypeNames = allTypes.OrderBy (v => v).ToArray (); + var expectedTypes = new string [] { + "", + "api0.Messaging", + "Protocols.IProtocolWithConstructors", + "Protocols.ProtocolWithConstructorsWrapper", + }; + CollectionAssert.AreEqual (expectedTypes, allTypeNames, "Types"); + + var allMethods = allTypeDefinitions.SelectMany (v => v.Methods).Select (v => v.ToString ()).OrderBy (v => v).ToArray (); + var expectedMethods = new string [] { + "ObjCRuntime.NativeHandle api0.Messaging::NativeHandle_objc_msgSend_NativeHandle(System.IntPtr,System.IntPtr,ObjCRuntime.NativeHandle)", + "ObjCRuntime.NativeHandle api0.Messaging::NativeHandle_objc_msgSend_ref_NativeHandle(System.IntPtr,System.IntPtr,ObjCRuntime.NativeHandle*)", + "ObjCRuntime.NativeHandle api0.Messaging::NativeHandle_objc_msgSend(System.IntPtr,System.IntPtr)", + "ObjCRuntime.NativeHandle api0.Messaging::NativeHandle_objc_msgSendSuper_NativeHandle(System.IntPtr,System.IntPtr,ObjCRuntime.NativeHandle)", + "ObjCRuntime.NativeHandle api0.Messaging::NativeHandle_objc_msgSendSuper_ref_NativeHandle(System.IntPtr,System.IntPtr,ObjCRuntime.NativeHandle*)", + "ObjCRuntime.NativeHandle api0.Messaging::NativeHandle_objc_msgSendSuper(System.IntPtr,System.IntPtr)", + "System.IntPtr api0.Messaging::IntPtr_objc_msgSend_IntPtr(System.IntPtr,System.IntPtr,System.IntPtr)", + "System.IntPtr api0.Messaging::IntPtr_objc_msgSend(System.IntPtr,System.IntPtr)", + "System.IntPtr api0.Messaging::IntPtr_objc_msgSendSuper_IntPtr(System.IntPtr,System.IntPtr,System.IntPtr)", + "System.IntPtr api0.Messaging::IntPtr_objc_msgSendSuper(System.IntPtr,System.IntPtr)", + "System.Void api0.Messaging::.cctor()", + "System.Void Protocols.ProtocolWithConstructorsWrapper::.ctor(ObjCRuntime.NativeHandle,System.Boolean)", + "T Protocols.IProtocolWithConstructors::Create(Foundation.NSDate)", + "T Protocols.IProtocolWithConstructors::CreateInstance()", + "T Protocols.IProtocolWithConstructors::CreateInstance(Foundation.NSError&)", + "T Protocols.IProtocolWithConstructors::CreateInstance(System.String)", + }; + + CollectionAssert.AreEqual (expectedMethods, allMethods, "Types"); + } + } +} + diff --git a/tests/generator/generator-tests.csproj b/tests/generator/generator-tests.csproj index 9e55a14219dd..396804421594 100644 --- a/tests/generator/generator-tests.csproj +++ b/tests/generator/generator-tests.csproj @@ -67,6 +67,8 @@ + + Profile.cs diff --git a/tests/generator/tests/protocols.cs b/tests/generator/tests/protocols.cs new file mode 100644 index 000000000000..67bffa2393ab --- /dev/null +++ b/tests/generator/tests/protocols.cs @@ -0,0 +1,22 @@ +using System; +using Foundation; +using ObjCRuntime; + +namespace Protocols { + [Protocol] + interface ProtocolWithConstructors { + [Abstract] + [Export ("init")] + NativeHandle Constructor (); + + [Export ("initWithValue:")] + NativeHandle Constructor (string p0); + + [Export ("initWithError:")] + NativeHandle Constructor (out NSError error); + + [Bind ("Create")] + [Export ("initWithCustomName:")] + NativeHandle Constructor (NSDate error); + } +} diff --git a/tests/monotouch-test/ImageIO/CGImageSourceTest.cs b/tests/monotouch-test/ImageIO/CGImageSourceTest.cs index 87bff6ad959a..8b5ca0242cef 100644 --- a/tests/monotouch-test/ImageIO/CGImageSourceTest.cs +++ b/tests/monotouch-test/ImageIO/CGImageSourceTest.cs @@ -90,30 +90,10 @@ public void CreateThumbnailTest () { using (var imgsrc = CGImageSource.FromUrl (fileUrl)) { using (var img = imgsrc.CreateThumbnail (0, null)) { - if (TestRuntime.CheckXcodeVersion (15, 3)) { - Assert.NotNull (img, "#a1"); - Assert.AreNotEqual (IntPtr.Zero, img.Handle, "#a2"); - } else { -#if NET - Assert.Null (img, "#a1"); -#else - Assert.NotNull (img, "#a1"); - Assert.AreEqual (IntPtr.Zero, img.Handle, "#a2"); -#endif - } + Assert.That (img, Is.Null.Or.Not.Null, "#a1"); // sometimes we get an image, and sometimes we don't 🤷‍♂️ } using (var img = imgsrc.CreateThumbnail (0, new CGImageThumbnailOptions ())) { - if (TestRuntime.CheckXcodeVersion (15, 3)) { - Assert.NotNull (img, "#b1"); - Assert.AreNotEqual (IntPtr.Zero, img.Handle, "#b2"); - } else { -#if NET - Assert.Null (img, "#b1"); -#else - Assert.NotNull (img, "#b1"); - Assert.AreEqual (IntPtr.Zero, img.Handle, "#b2"); -#endif - } + Assert.That (img, Is.Null.Or.Not.Null, "#b1"); // sometimes we get an image, and sometimes we don't 🤷‍♂️ } } } diff --git a/tests/nunit.framework.targets b/tests/nunit.framework.targets index 986b9da02409..bfb7b169a8b4 100644 --- a/tests/nunit.framework.targets +++ b/tests/nunit.framework.targets @@ -3,7 +3,7 @@ $(MSBuildThisFileDirectory)nunit.framework.xml - --xml=$(XmlLinkerFile) $(MonoBundlingExtraArgs) - --xml=$(XmlLinkerFile) --dlsym:+nunit.framework.dll $(MtouchExtraArgs) + --xml=$(XmlLinkerFile) $(AppBundleExtraOptions) + --dlsym:+nunit.framework.dll $(AppBundleExtraOptions) diff --git a/tests/test-libraries/libtest.h b/tests/test-libraries/libtest.h index 7f5a03495b58..e481dab7ec6d 100644 --- a/tests/test-libraries/libtest.h +++ b/tests/test-libraries/libtest.h @@ -277,6 +277,23 @@ typedef void (^outerBlock) (innerBlock callback); // And Apple does (see UIAppearance appearanceWhenContainedInInstancesOfClasses for an example). @end +@protocol ConstructorProtocol +@required + -(id) initRequired: (NSString *) p0; +@optional + -(id) initOptional: (NSDate *) p0; +@end + +@interface TypeProvidingProtocolConstructors : NSObject { +} + -(id) initRequired: (NSString *) p0; + -(id) initOptional: (NSDate *) p0; + +@property (copy) NSString* stringValue; +@property (copy) NSDate* dateValue; + +@end + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/tests/test-libraries/libtest.m b/tests/test-libraries/libtest.m index ce08ffacead5..01dfb8bc991c 100644 --- a/tests/test-libraries/libtest.m +++ b/tests/test-libraries/libtest.m @@ -1346,4 +1346,26 @@ -(void) testClassArray: (int) action a:(NSArray **) refValue b:(NSArray **) outV } } @end + +@implementation TypeProvidingProtocolConstructors +-(id) initRequired: (NSString *) p0 +{ + self = [super init]; + if (self) { + _stringValue = [p0 copy]; + } + return self; +} + +-(id) initOptional: (NSDate *) p0 +{ + self = [super init]; + if (self) { + _dateValue = [p0 copy]; + } + return self; +} + +@end + #include "libtest.decompile.m" diff --git a/tests/test-libraries/rename.h b/tests/test-libraries/rename.h index c11892b03da7..9ba236efdf0e 100644 --- a/tests/test-libraries/rename.h +++ b/tests/test-libraries/rename.h @@ -11,6 +11,7 @@ #define UltimateMachine object_UltimateMachine #define FrameworkTest object_FrameworkTest #define RefOutParameters object_RefOutParameters + #define TypeProvidingProtocolConstructors objecct_TypeProvidingProtocolConstructors #define Sc object_Sc #define Scc object_Scc #define Sccc object_Sccc @@ -85,6 +86,7 @@ #define UltimateMachine ar_UltimateMachine #define FrameworkTest ar_FrameworkTest #define RefOutParameters ar_RefOutParameters + #define TypeProvidingProtocolConstructors ar_TypeProvidingProtocolConstructors #define Sc ar_Sc #define Scc ar_Scc #define Sccc ar_Sccc diff --git a/tests/xharness/Jenkins/TestData.cs b/tests/xharness/Jenkins/TestData.cs index 62e33f6f21de..411f64cdac9f 100644 --- a/tests/xharness/Jenkins/TestData.cs +++ b/tests/xharness/Jenkins/TestData.cs @@ -6,7 +6,7 @@ namespace Xharness.Jenkins { class TestData { public string Variation; - public string BundlerArguments; // MtouchExtraArgs + MonoBundlingExtraArgs + public string AppBundleExtraOptions; public KnownIssue KnownFailure; public bool Debug; public bool Profiling; diff --git a/tests/xharness/Jenkins/TestVariationsFactory.cs b/tests/xharness/Jenkins/TestVariationsFactory.cs index 72516f0920ef..970dc0131624 100644 --- a/tests/xharness/Jenkins/TestVariationsFactory.cs +++ b/tests/xharness/Jenkins/TestVariationsFactory.cs @@ -68,10 +68,10 @@ IEnumerable GetTestData (RunTestTask test) /* we don't add --assembly-build-target=@all=staticobject because that's the default in all our test projects */ if (supports_debug && !test.TestProject.IsDotNetProject) { - yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug)", BundlerArguments = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug)", BundlerArguments = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug, profiling)", BundlerArguments = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug, profiling)", BundlerArguments = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Static, Ignored = ignore }; + yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug)", AppBundleExtraOptions = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic, Ignored = ignore }; + yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, Ignored = ignore }; + yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug, profiling)", AppBundleExtraOptions = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic, Ignored = ignore }; + yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug, profiling)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Static, Ignored = ignore }; } if (test.ProjectConfiguration.Contains ("Debug")) @@ -83,7 +83,7 @@ IEnumerable GetTestData (RunTestTask test) var sdk_release_skip = test.Platform == TestPlatform.tvOS && test.TestName == "dont link"; sdk_release_skip = sdk_release_skip || test.TestProject.IsDotNetProject; if (!sdk_release_skip) - yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (release)", BundlerArguments = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, }; + yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (release)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, }; switch (test.TestName) { case "monotouch-test": @@ -91,35 +91,35 @@ IEnumerable GetTestData (RunTestTask test) ignore = true; if (supports_dynamic_registrar_on_device) yield return new TestData { Variation = "Debug (dynamic registrar)", Registrar = "dynamic", Debug = true, Profiling = false, Ignored = ignore }; - yield return new TestData { Variation = "Release (all optimizations)", BundlerArguments = "--optimize:all", Registrar = "static", Debug = false, Profiling = false, Defines = "OPTIMIZEALL", Ignored = ignore }; + yield return new TestData { Variation = "Release (all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "static", Debug = false, Profiling = false, Defines = "OPTIMIZEALL", Ignored = ignore }; if (supports_debug) { - yield return new TestData { Variation = "Debug (all optimizations)", BundlerArguments = "--optimize:all", Registrar = "static", Debug = true, Profiling = false, Defines = "OPTIMIZEALL", Ignored = ignore }; - yield return new TestData { Variation = "Debug: SGenConc", BundlerArguments = "", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, EnableSGenConc = true, Ignored = ignore }; + yield return new TestData { Variation = "Debug (all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "static", Debug = true, Profiling = false, Defines = "OPTIMIZEALL", Ignored = ignore }; + yield return new TestData { Variation = "Debug: SGenConc", AppBundleExtraOptions = "", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, EnableSGenConc = true, Ignored = ignore }; } if (supports_interpreter) { if (supports_debug) { - yield return new TestData { Variation = "Debug (interpreter)", BundlerArguments = "--interpreter", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", Ignored = ignore }; - yield return new TestData { Variation = "Debug (interpreter -mscorlib)", BundlerArguments = "--interpreter=-mscorlib", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", Ignored = ignore }; + yield return new TestData { Variation = "Debug (interpreter)", AppBundleExtraOptions = "--interpreter", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", Ignored = ignore }; + yield return new TestData { Variation = "Debug (interpreter -mscorlib)", AppBundleExtraOptions = "--interpreter=-mscorlib", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", Ignored = ignore }; } - yield return new TestData { Variation = "Release (interpreter -mscorlib)", BundlerArguments = "--interpreter=-mscorlib", Debug = false, Profiling = false, Undefines = "FULL_AOT_RUNTIME", Ignored = ignore }; + yield return new TestData { Variation = "Release (interpreter -mscorlib)", AppBundleExtraOptions = "--interpreter=-mscorlib", Debug = false, Profiling = false, Undefines = "FULL_AOT_RUNTIME", Ignored = ignore }; } if (test.TestProject.IsDotNetProject) { yield return new TestData { Variation = "Release (LLVM)", Debug = false, UseLlvm = true, Ignored = ignore }; yield return new TestData { Variation = "Debug (managed static registrar)", Registrar = "managed-static", Debug = true, Profiling = false, Ignored = ignore }; - yield return new TestData { Variation = "Release (managed static registrar, all optimizations)", BundlerArguments = "--optimize:all", Registrar = "managed-static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; + yield return new TestData { Variation = "Release (managed static registrar, all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "managed-static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; } if (test.TestProject.IsDotNetProject) yield return new TestData { Variation = "Release (NativeAOT)", Debug = false, PublishAot = true, Ignored = ignore, LinkMode = "Full" }; break; case string name when name.StartsWith ("mscorlib", StringComparison.Ordinal): if (supports_debug) - yield return new TestData { Variation = "Debug: SGenConc", BundlerArguments = "", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, EnableSGenConc = true }; + yield return new TestData { Variation = "Debug: SGenConc", AppBundleExtraOptions = "", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, EnableSGenConc = true }; if (supports_interpreter) { if (supports_debug) { - yield return new TestData { Variation = "Debug (interpreter)", BundlerArguments = "--interpreter", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", KnownFailure = new KnownIssue ("#1683", issueLink: "https://github.com/xamarin/maccore/issues/1683") }; - yield return new TestData { Variation = "Debug (interpreter -mscorlib)", BundlerArguments = "--interpreter=-mscorlib", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", KnownFailure = new KnownIssue ("#1682", issueLink: "https://github.com/xamarin/maccore/issues/1682") }; + yield return new TestData { Variation = "Debug (interpreter)", AppBundleExtraOptions = "--interpreter", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", KnownFailure = new KnownIssue ("#1683", issueLink: "https://github.com/xamarin/maccore/issues/1683") }; + yield return new TestData { Variation = "Debug (interpreter -mscorlib)", AppBundleExtraOptions = "--interpreter=-mscorlib", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", KnownFailure = new KnownIssue ("#1682", issueLink: "https://github.com/xamarin/maccore/issues/1682") }; } - yield return new TestData { Variation = "Release (interpreter -mscorlib)", BundlerArguments = "--interpreter=-mscorlib", Debug = false, Profiling = false, Undefines = "FULL_AOT_RUNTIME", KnownFailure = new KnownIssue ("#1682", issueLink: "https://github.com/xamarin/maccore/issues/1682") }; + yield return new TestData { Variation = "Release (interpreter -mscorlib)", AppBundleExtraOptions = "--interpreter=-mscorlib", Debug = false, Profiling = false, Undefines = "FULL_AOT_RUNTIME", KnownFailure = new KnownIssue ("#1682", issueLink: "https://github.com/xamarin/maccore/issues/1682") }; } break; } @@ -133,8 +133,8 @@ IEnumerable GetTestData (RunTestTask test) // The default is to run monotouch-test with the dynamic registrar (in the simulator), so that's already covered yield return new TestData { Variation = "Debug (LinkSdk)", Debug = true, Profiling = false, LinkMode = test.TestProject.IsDotNetProject ? "SdkOnly" : "LinkSdk", Ignored = ignore }; yield return new TestData { Variation = "Debug (static registrar)", Registrar = "static", Debug = true, Profiling = false, Ignored = ignore }; - yield return new TestData { Variation = "Release (all optimizations)", BundlerArguments = "--optimize:all", Registrar = "static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; - yield return new TestData { Variation = "Debug (all optimizations)", BundlerArguments = "--optimize:all,-remove-uithread-checks", Registrar = "static", Debug = true, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore ?? !jenkins.TestSelection.IsEnabled (TestLabel.All) }; + yield return new TestData { Variation = "Release (all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; + yield return new TestData { Variation = "Debug (all optimizations)", AppBundleExtraOptions = "--optimize:all,-remove-uithread-checks", Registrar = "static", Debug = true, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore ?? !jenkins.TestSelection.IsEnabled (TestLabel.All) }; if (test.TestProject.IsDotNetProject && mac_supports_arm64) { yield return new TestData { Variation = "Debug (ARM64)", Debug = true, Profiling = false, Ignored = !mac_supports_arm64 ? true : ignore, RuntimeIdentifier = arm64_sim_runtime_identifier, }; @@ -142,7 +142,7 @@ IEnumerable GetTestData (RunTestTask test) } if (test.TestProject.IsDotNetProject) { yield return new TestData { Variation = "Debug (managed static registrar)", Registrar = "managed-static", Debug = true, Profiling = false, Ignored = ignore }; - yield return new TestData { Variation = "Release (managed static registrar, all optimizations)", BundlerArguments = "--optimize:all", Registrar = "managed-static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; + yield return new TestData { Variation = "Release (managed static registrar, all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "managed-static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; yield return new TestData { Variation = "Release (NativeAOT, x64)", Debug = false, PublishAot = true, Ignored = ignore, RuntimeIdentifier = x64_sim_runtime_identifier, LinkMode = "Full" }; } break; @@ -184,20 +184,20 @@ IEnumerable GetTestData (RunTestTask test) yield return new TestData { Variation = "Release (NativeAOT)", Debug = false, PublishAot = true, Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Monotouch) || !jenkins.TestSelection.IsEnabled (PlatformLabel.Mac), LinkMode = "Full" }; } if (test.TestProject.IsDotNetProject) { - yield return new TestData { Variation = "Release (all optimizations)", BundlerArguments = "--optimize:all", Registrar = "static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; + yield return new TestData { Variation = "Release (all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; yield return new TestData { Variation = "Debug (managed static registrar)", Registrar = "managed-static", Debug = true, Profiling = false, Ignored = ignore }; - yield return new TestData { Variation = "Release (managed static registrar, all optimizations)", BundlerArguments = "--optimize:all", Registrar = "managed-static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; + yield return new TestData { Variation = "Release (managed static registrar, all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "managed-static", Debug = false, Profiling = false, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = ignore }; } } break; case "xammac tests": switch (test.ProjectConfiguration) { case "Release": - yield return new TestData { Variation = "Release (all optimizations)", BundlerArguments = "--optimize:all", Registrar = "static", Debug = false, LinkMode = "Full", Defines = "OPTIMIZEALL" }; + yield return new TestData { Variation = "Release (all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "static", Debug = false, LinkMode = "Full", Defines = "OPTIMIZEALL" }; yield return new TestData { Variation = "Release (ARM64)", XamMacArch = "ARM64", Debug = false, Ignored = !mac_supports_arm64 || !jenkins.TestSelection.IsEnabled (TestLabel.Xammac) || !jenkins.TestSelection.IsEnabled (PlatformLabel.Mac) }; break; case "Debug": - yield return new TestData { Variation = "Debug (all optimizations)", BundlerArguments = "--optimize:all,-remove-uithread-checks", Registrar = "static", Debug = true, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = !(jenkins.TestSelection.IsEnabled (TestLabel.All) && jenkins.TestSelection.IsEnabled (PlatformLabel.Mac)) }; + yield return new TestData { Variation = "Debug (all optimizations)", AppBundleExtraOptions = "--optimize:all,-remove-uithread-checks", Registrar = "static", Debug = true, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = !(jenkins.TestSelection.IsEnabled (TestLabel.All) && jenkins.TestSelection.IsEnabled (PlatformLabel.Mac)) }; yield return new TestData { Variation = "Debug (ARM64)", XamMacArch = "ARM64", Debug = true, Ignored = !mac_supports_arm64 || !jenkins.TestSelection.IsEnabled (TestLabel.Xammac) || !jenkins.TestSelection.IsEnabled (PlatformLabel.Mac) }; break; } @@ -223,7 +223,7 @@ public IEnumerable CreateTestVariations (IEnumerable tests, Func CreateTestVariations (IEnumerable tests, Func? convert = null; convert = (input) => { diff --git a/tests/xharness/Targets/MacTarget.cs b/tests/xharness/Targets/MacTarget.cs index 9206073a30cb..b6dae3e64b7e 100644 --- a/tests/xharness/Targets/MacTarget.cs +++ b/tests/xharness/Targets/MacTarget.cs @@ -153,7 +153,7 @@ public override Dictionary NewPropertiesToAdd { if (System) { props.Add ("TargetFrameworkVersion", "v4.7.1"); - props.Add ("MonoBundlingExtraArgs", "--embed-mono=no"); + props.Add ("AppBundleExtraOptions", "--embed-mono=no"); } else if (Modern) { props.Add ("TargetFrameworkVersion", "v2.0"); } else {