From 90415031497143e6be128be9f587bf8fdf0045f1 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 6 Jul 2017 10:40:54 +0200 Subject: [PATCH] [runtime] Don't freak out at startup if we can't find the NSValue or NSNumber classes. They might have been linked away. --- runtime/runtime.m | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/runtime/runtime.m b/runtime/runtime.m index cb39d62e54..6bf1c9cd24 100644 --- a/runtime/runtime.m +++ b/runtime/runtime.m @@ -357,12 +357,16 @@ void xamarin_framework_peer_unlock () MonoClass * xamarin_get_nsvalue_class () { + if (nsvalue_class == NULL) + xamarin_assertion_message ("Internal consistency error, please file a bug (https://bugzilla.xamarin.com). Additional data: can't get the NSValue class because it's been linked away.\n"); return nsvalue_class; } MonoClass * xamarin_get_nsnumber_class () { + if (nsnumber_class == NULL) + xamarin_assertion_message ("Internal consistency error, please file a bug (https://bugzilla.xamarin.com). Additional data: can't get the NSNumber class because it's been linked away.\n"); return nsnumber_class; } @@ -399,6 +403,9 @@ xamarin_is_class_nsnumber (MonoClass *cls) // COOP: Reading managed data, must be in UNSAFE mode MONO_ASSERT_GC_UNSAFE; + if (nsnumber_class == NULL) + return false; + return mono_class_is_subclass_of (cls, nsnumber_class, false); } @@ -408,6 +415,9 @@ xamarin_is_class_nsvalue (MonoClass *cls) // COOP: Reading managed data, must be in UNSAFE mode MONO_ASSERT_GC_UNSAFE; + if (nsvalue_class == NULL) + return false; + return mono_class_is_subclass_of (cls, nsvalue_class, false); } @@ -417,6 +427,9 @@ xamarin_is_class_nsstring (MonoClass *cls) // COOP: Reading managed data, must be in UNSAFE mode MONO_ASSERT_GC_UNSAFE; + if (nsstring_class == NULL) + return false; + return mono_class_is_subclass_of (cls, nsstring_class, false); } @@ -874,11 +887,11 @@ gc_enable_new_refcount (void) } static MonoClass * -get_class_from_name (MonoImage* image, const char *nmspace, const char *name) +get_class_from_name (MonoImage* image, const char *nmspace, const char *name, bool optional = false) { // COOP: this is a convenience function executed only at startup, I believe the mode here doesn't matter. MonoClass *rv = mono_class_from_name (image, nmspace, name); - if (!rv) + if (!rv && !optional) xamarin_assertion_message ("Fatal error: failed to load the class '%s.%s'\n.", nmspace, name); return rv; } @@ -1299,9 +1312,9 @@ xamarin_initialize () runtime_class = get_class_from_name (platform_image, objcruntime, "Runtime"); inativeobject_class = get_class_from_name (platform_image, objcruntime, "INativeObject"); nsobject_class = get_class_from_name (platform_image, foundation, "NSObject"); - nsnumber_class = get_class_from_name (platform_image, foundation, "NSNumber"); - nsvalue_class = get_class_from_name (platform_image, foundation, "NSValue"); - nsstring_class = get_class_from_name (platform_image, foundation, "NSString"); + nsnumber_class = get_class_from_name (platform_image, foundation, "NSNumber", true); + nsvalue_class = get_class_from_name (platform_image, foundation, "NSValue", true); + nsstring_class = get_class_from_name (platform_image, foundation, "NSString", true); mono_add_internal_call (xamarin_use_new_assemblies ? "Foundation.NSObject::xamarin_release_managed_ref" : PRODUCT_COMPAT_NAMESPACE ".Foundation.NSObject::xamarin_release_managed_ref", (const void *) xamarin_release_managed_ref); mono_add_internal_call (xamarin_use_new_assemblies ? "Foundation.NSObject::xamarin_create_managed_ref" : PRODUCT_COMPAT_NAMESPACE ".Foundation.NSObject::xamarin_create_managed_ref", (const void *) xamarin_create_managed_ref);