[runtime] Handle NativeHandle as IntPtr when it comes to arguments in the dynamic registrar.

This commit is contained in:
Rolf Bjarne Kvinge 2021-11-17 10:30:52 +01:00
Родитель 698fbbbe49
Коммит 249735647a
6 изменённых файлов: 44 добавлений и 0 удалений

Просмотреть файл

@ -1092,6 +1092,12 @@ xamarin_is_class_inativeobject (MonoClass *cls)
return xamarin_bridge_is_class_of_type (cls, XamarinLookupTypes_ObjCRuntime_INativeObject);
}
bool
xamarin_is_class_nativehandle (MonoClass *cls)
{
return xamarin_bridge_is_class_of_type (cls, XamarinLookupTypes_ObjCRuntime_NativeHandle);
}
bool
xamarin_is_class_array (MonoClass *cls)
{

Просмотреть файл

@ -34,6 +34,9 @@ static MonoClass* nsvalue_class = NULL;
static MonoClass* nsnumber_class = NULL;
static MonoClass* nsstring_class = NULL;
static MonoClass* runtime_class = NULL;
#if DOTNET
static MonoClass* nativehandle_class = NULL;
#endif
#if !LEGACY_XAMARIN_MAC
void
@ -126,6 +129,9 @@ xamarin_bridge_call_runtime_initialize (struct InitializationOptions* options, G
runtime_class = get_class_from_name (platform_image, objcruntime, "Runtime");
inativeobject_class = get_class_from_name (platform_image, objcruntime, "INativeObject");
#if DOTNET
nativehandle_class = get_class_from_name (platform_image, objcruntime, "NativeHandle");
#endif
nsobject_class = get_class_from_name (platform_image, foundation, "NSObject");
nsnumber_class = get_class_from_name (platform_image, foundation, "NSNumber", true);
nsvalue_class = get_class_from_name (platform_image, foundation, "NSValue", true);
@ -170,6 +176,16 @@ xamarin_get_inativeobject_class ()
return inativeobject_class;
}
#if DOTNET
MonoClass *
xamarin_get_nativehandle_class ()
{
if (nativehandle_class == NULL)
xamarin_assertion_message ("Internal consistency error, please file a bug (https://github.com/xamarin/xamarin-macios/issues/new). Additional data: can't get the %s class because it's been linked away.\n", "NativeHandle");
return nativehandle_class;
}
#endif
MonoClass *
xamarin_get_nsobject_class ()
{
@ -315,6 +331,14 @@ xamarin_is_class_inativeobject (MonoClass *cls)
return mono_class_is_subclass_of (cls, xamarin_get_inativeobject_class (), true);
}
#if DOTNET
bool
xamarin_is_class_nativehandle (MonoClass *cls)
{
return cls == xamarin_get_nativehandle_class ();
}
#endif
bool
xamarin_is_class_array (MonoClass *cls)
{

Просмотреть файл

@ -440,6 +440,13 @@ xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_
arg_ptrs [i + mofs] = &arg_frame [frameofs];
LOGZ (" argument %i is IntPtr: %p\n", i + 1, id_arg);
break;
#if DOTNET
} else if (xamarin_is_class_nativehandle (p_klass)) {
arg_frame [ofs] = id_arg;
arg_ptrs [i + mofs] = &arg_frame [frameofs];
LOGZ (" argument %i is NativeHandle: %p\n", i + 1, id_arg);
break;
#endif
} else if (!id_arg) {
arg_ptrs [i + mofs] = NULL;
break;

Просмотреть файл

@ -73,6 +73,7 @@ enum XamarinLookupTypes : int {
XamarinLookupTypes_Foundation_NSString,
XamarinLookupTypes_Foundation_NSValue,
XamarinLookupTypes_ObjCRuntime_INativeObject,
XamarinLookupTypes_ObjCRuntime_NativeHandle,
};
// Keep in sync with Runtime.ExceptionType in Runtime.CoreCLR.cs

Просмотреть файл

@ -165,6 +165,7 @@ void xamarin_check_for_gced_object (MonoObject *obj, SEL sel, id self, MonoMet
unsigned long xamarin_objc_type_size (const char *type);
bool xamarin_is_class_nsobject (MonoClass *cls);
bool xamarin_is_class_inativeobject (MonoClass *cls);
bool xamarin_is_class_nativehandle (MonoClass *cls);
bool xamarin_is_class_array (MonoClass *cls);
bool xamarin_is_class_nsnumber (MonoClass *cls);
bool xamarin_is_class_nsvalue (MonoClass *cls);
@ -266,6 +267,7 @@ id xamarin_invoke_objc_method_implementation (id self, SEL sel, IMP xamarin_i
MonoType * xamarin_get_nsnumber_type ();
MonoType * xamarin_get_nsvalue_type ();
MonoClass * xamarin_get_inativeobject_class ();
MonoClass * xamarin_get_nativehandle_class ();
MonoClass * xamarin_get_nsobject_class ();
MonoClass * xamarin_get_nsstring_class ();
MonoClass * xamarin_get_runtime_class ();

Просмотреть файл

@ -45,6 +45,7 @@ namespace ObjCRuntime {
Foundation_NSString,
Foundation_NSValue,
ObjCRuntime_INativeObject,
ObjCRuntime_NativeHandle,
}
// Keep in sync with XamarinExceptionType in main.h
@ -233,6 +234,9 @@ namespace ObjCRuntime {
case TypeLookup.ObjCRuntime_INativeObject:
rv = typeof (ObjCRuntime.INativeObject).IsAssignableFrom (type);
break;
case TypeLookup.ObjCRuntime_NativeHandle:
rv = typeof (ObjCRuntime.NativeHandle).IsAssignableFrom (type);
break;
default:
throw new ArgumentOutOfRangeException (nameof (type));
}