Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 52 additions & 7 deletions src/ObjCRuntime/Class.cs
Original file line number Diff line number Diff line change
Expand Up @@ -646,25 +646,56 @@ internal static bool IsCustomType (Type type)
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal static extern IntPtr objc_allocateClassPair (IntPtr superclass, string name, IntPtr extraBytes);
static extern IntPtr objc_allocateClassPair (IntPtr superclass, IntPtr name, IntPtr extraBytes);

internal static IntPtr objc_allocateClassPair (IntPtr superclass, string name, IntPtr extraBytes)
{
using var namePtr = new TransientString (name);
return objc_allocateClassPair (superclass, namePtr, extraBytes);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal static extern IntPtr objc_getClass (string name);
static extern IntPtr objc_getClass (IntPtr name);

internal static IntPtr objc_getClass (string name)
{
using var namePtr = new TransientString (name);
return objc_getClass (namePtr);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal static extern void objc_registerClassPair (IntPtr cls);

[DllImport (Messaging.LIBOBJC_DYLIB)]
[return: MarshalAs (UnmanagedType.U1)]
internal static extern bool class_addIvar (IntPtr cls, string name, IntPtr size, byte alignment, string types);
static extern bool class_addIvar (IntPtr cls, IntPtr name, IntPtr size, byte alignment, IntPtr types);

internal static bool class_addIvar (IntPtr cls, string name, IntPtr size, byte alignment, string types)
{
using var namePtr = new TransientString (name);
using var typesPtr = new TransientString (types);
return class_addIvar (cls, namePtr, size, alignment, typesPtr);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
[return: MarshalAs (UnmanagedType.U1)]
internal static extern bool class_addMethod (IntPtr cls, IntPtr name, IntPtr imp, string types);
static extern bool class_addMethod (IntPtr cls, IntPtr name, IntPtr imp, IntPtr types);

internal static bool class_addMethod (IntPtr cls, IntPtr name, IntPtr imp, string types)
{
using var typesPtr = new TransientString (types);
return class_addMethod (cls, name, imp, typesPtr);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
[return: MarshalAs (UnmanagedType.U1)]
internal extern static bool class_addMethod (IntPtr cls, IntPtr name, Delegate imp, string types);
internal extern static bool class_addMethod (IntPtr cls, IntPtr name, Delegate imp, IntPtr types);

internal static bool class_addMethod (IntPtr cls, IntPtr name, Delegate imp, string types)
{
using var typesPtr = new TransientString (types);
return class_addMethod (cls, name, imp, typesPtr);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
[return: MarshalAs (UnmanagedType.U1)]
Expand All @@ -683,14 +714,28 @@ internal static bool IsCustomType (Type type)
internal extern static IntPtr class_getMethodImplementation (IntPtr cls, IntPtr sel);

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal extern static IntPtr class_getInstanceVariable (IntPtr cls, string name);
internal extern static IntPtr class_getInstanceVariable (IntPtr cls, IntPtr name);

internal static IntPtr class_getInstanceVariable (IntPtr cls, string name)
{
using var namePtr = new TransientString (name);
return class_getInstanceVariable (cls, namePtr);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal extern static IntPtr class_getInstanceMethod (IntPtr cls, IntPtr sel);

[DllImport (Messaging.LIBOBJC_DYLIB, CharSet = CharSet.Ansi)]
[return: MarshalAs (UnmanagedType.U1)]
internal extern static bool class_addProperty (IntPtr cls, string name, objc_attribute_prop [] attributes, int count);
extern static bool class_addProperty (IntPtr cls, IntPtr name, IntPtr attributes, int count);

internal static bool class_addProperty (IntPtr cls, string name, objc_attribute_prop [] attributes, int count)
{
using var namePtr = new TransientString (name, TransientString.Encoding.Ansi);
var handle = GCHandle.Alloc (attributes);
var retval = class_addProperty (cls, namePtr, GCHandle.ToIntPtr (handle), count);
return retval;
}

[StructLayout (LayoutKind.Sequential, CharSet = CharSet.Ansi)]
internal struct objc_attribute_prop {
Expand Down
16 changes: 14 additions & 2 deletions src/ObjCRuntime/Dlfcn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,13 @@ internal struct Dl_info
public static extern int dlclose (IntPtr handle);

[DllImport (Constants.libSystemLibrary, EntryPoint = "dlopen")]
internal static extern IntPtr _dlopen (string? path, Mode mode /* this is int32, not nint */);
static extern IntPtr _dlopen (IntPtr path, Mode mode /* this is int32, not nint */);

internal static IntPtr _dlopen (string? path, Mode mode /* this is int32, not nint */)
{
using var pathPtr = new TransientString (path);
return _dlopen (pathPtr, mode);
}

public static IntPtr dlopen (string? path, int mode)
{
Expand Down Expand Up @@ -148,7 +154,13 @@ internal static IntPtr dlopen (string? path, int mode, bool showWarning)
}

[DllImport (Constants.libSystemLibrary)]
public static extern IntPtr dlsym (IntPtr handle, string symbol);
static extern IntPtr dlsym (IntPtr handle, IntPtr symbol);

public static IntPtr dlsym (IntPtr handle, string symbol)
{
using var symbolPtr = new TransientString (symbol);
return dlsym (handle, symbolPtr);
}

public static IntPtr dlsym (RTLD lookupType, string symbol)
{
Expand Down
34 changes: 30 additions & 4 deletions src/ObjCRuntime/Protocol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,19 +62,45 @@ public static IntPtr GetHandle (string name)
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal extern static IntPtr objc_getProtocol (string? name);
extern static IntPtr objc_getProtocol (IntPtr name);

internal static IntPtr objc_getProtocol (string? name)
{
var namePtr = new TransientString (name);
return objc_getProtocol (namePtr);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal extern static IntPtr objc_allocateProtocol (string name);
extern static IntPtr objc_allocateProtocol (IntPtr name);

internal static IntPtr objc_allocateProtocol (string name)
{
using var namePtr = new TransientString (name);
return objc_allocateProtocol (namePtr);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal extern static void objc_registerProtocol (IntPtr protocol);

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal extern static void protocol_addProperty (IntPtr protocol, string name, Class.objc_attribute_prop [] attributes, int count, [MarshalAs (UnmanagedType.I1)] bool isRequired, [MarshalAs (UnmanagedType.I1)] bool isInstance);
extern static void protocol_addProperty (IntPtr protocol, IntPtr name, IntPtr attributes, int count, [MarshalAs (UnmanagedType.I1)] bool isRequired, [MarshalAs (UnmanagedType.I1)] bool isInstance);

internal static void protocol_addProperty (IntPtr protocol, string name, Class.objc_attribute_prop [] attributes, int count, [MarshalAs (UnmanagedType.I1)] bool isRequired, [MarshalAs (UnmanagedType.I1)] bool isInstance)
{
using var namePtr = new TransientString (name);
var attributesHandle = GCHandle.Alloc (attributes);
protocol_addProperty (protocol, namePtr, GCHandle.ToIntPtr (attributesHandle), count, isRequired, isInstance);
attributesHandle.Free ();
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal extern static void protocol_addMethodDescription (IntPtr protocol, IntPtr nameSelector, string signature, [MarshalAs (UnmanagedType.I1)] bool isRequired, [MarshalAs (UnmanagedType.I1)] bool isInstance);
extern static void protocol_addMethodDescription (IntPtr protocol, IntPtr nameSelector, IntPtr signature, [MarshalAs (UnmanagedType.I1)] bool isRequired, [MarshalAs (UnmanagedType.I1)] bool isInstance);

internal static void protocol_addMethodDescription (IntPtr protocol, IntPtr nameSelector, string signature, [MarshalAs (UnmanagedType.I1)] bool isRequired, [MarshalAs (UnmanagedType.I1)] bool isInstance)
{
using var signaturePtr = new TransientString (signature);
protocol_addMethodDescription (protocol, nameSelector, signaturePtr, isRequired, isInstance);
}

[DllImport (Messaging.LIBOBJC_DYLIB)]
internal extern static void protocol_addProtocol (IntPtr protocol, IntPtr addition);
Expand Down
7 changes: 4 additions & 3 deletions src/ObjCRuntime/Runtime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1855,16 +1855,17 @@ public static void ConnectMethod (MethodInfo method, Selector selector)
ConnectMethod (method.DeclaringType!, method, selector);
}

[DllImport ("__Internal", CharSet = CharSet.Unicode)]
extern static void xamarin_log (string s);
[DllImport ("__Internal")]
extern static void xamarin_log (IntPtr s);

[DllImport (Constants.libcLibrary)]
extern static nint write (int filedes, byte [] buf, nint nbyte);

internal static void NSLog (string value)
{
try {
xamarin_log (value);
using var valuePtr = new TransientString (value, TransientString.Encoding.Unicode);
xamarin_log (valuePtr);
} catch {
// Append a newline like NSLog does
if (!value.EndsWith ('\n'))
Expand Down
5 changes: 3 additions & 2 deletions src/ObjCRuntime/Runtime.iOS.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public static void StartWWAN (Uri uri, Action<Exception?> callback)
}

[DllImport ("__Internal")]
static extern void xamarin_start_wwan (string uri);
static extern void xamarin_start_wwan (IntPtr uri);

public static void StartWWAN (Uri uri)
{
Expand All @@ -157,7 +157,8 @@ public static void StartWWAN (Uri uri)
if (Runtime.Arch == Arch.SIMULATOR)
return;

xamarin_start_wwan (uri.ToString ());
using var uriPtr = new TransientString (uri.ToString ());
xamarin_start_wwan (uriPtr);
}
#endif // !TVOS && !WATCH
#endif // !COREBUILD
Expand Down
2 changes: 1 addition & 1 deletion tests/cecil-tests/BlittablePInvokes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public BlitAndReason (bool isBlittable, string reason)
public string Reason;
}

[Ignore ("work in progress - there are 100 failures, mostly due to strings")]
[Ignore ("work in progress - there are 40 failures, mostly due to delegates")]
[TestCaseSource (typeof (Helper), nameof (Helper.NetPlatformImplementationAssemblyDefinitions))]
public void CheckForNonBlittablePInvokes (AssemblyInfo info)
{
Expand Down