[runtime] Handle NativeHandle as IntPtr when it comes to arguments in the dynamic registrar.
This commit is contained in:
Родитель
698fbbbe49
Коммит
249735647a
|
@ -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));
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче