Merge branch 'master' into mono-2018-06

This commit is contained in:
Marek Safar 2018-07-10 10:41:51 +02:00
Родитель 95bcaa9124 4f0bac5161
Коммит 69f8d32ea6
48 изменённых файлов: 502 добавлений и 141 удалений

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

@ -50,7 +50,7 @@ IOS_PRODUCT=Xamarin.iOS
IOS_PACKAGE_NAME=Xamarin.iOS IOS_PACKAGE_NAME=Xamarin.iOS
IOS_PACKAGE_NAME_LOWER=$(shell echo $(IOS_PACKAGE_NAME) | tr "[:upper:]" "[:lower:]") IOS_PACKAGE_NAME_LOWER=$(shell echo $(IOS_PACKAGE_NAME) | tr "[:upper:]" "[:lower:]")
# NEVER customize IOS_PACKAGE_VERSION itself, other parts (mtouch, web updater) are using the IOS_PACKAGE_VERSION_* variables # NEVER customize IOS_PACKAGE_VERSION itself, other parts (mtouch, web updater) are using the IOS_PACKAGE_VERSION_* variables
IOS_PACKAGE_VERSION=11.13.$(PACKAGE_VERSION_REV).$(IOS_COMMIT_DISTANCE) IOS_PACKAGE_VERSION=11.15.$(PACKAGE_VERSION_REV).$(IOS_COMMIT_DISTANCE)
IOS_PACKAGE_VERSION_MAJOR=$(word 1, $(subst ., ,$(IOS_PACKAGE_VERSION))) IOS_PACKAGE_VERSION_MAJOR=$(word 1, $(subst ., ,$(IOS_PACKAGE_VERSION)))
IOS_PACKAGE_VERSION_MINOR=$(word 2, $(subst ., ,$(IOS_PACKAGE_VERSION))) IOS_PACKAGE_VERSION_MINOR=$(word 2, $(subst ., ,$(IOS_PACKAGE_VERSION)))
IOS_PACKAGE_VERSION_REV=$(PACKAGE_VERSION_REV) IOS_PACKAGE_VERSION_REV=$(PACKAGE_VERSION_REV)
@ -264,7 +264,7 @@ MAC_PRODUCT=Xamarin.Mac
MAC_PACKAGE_NAME=xamarin.mac MAC_PACKAGE_NAME=xamarin.mac
MAC_PACKAGE_NAME_LOWER=$(shell echo $(MAC_PACKAGE_NAME) | tr "[:upper:]" "[:lower:]") MAC_PACKAGE_NAME_LOWER=$(shell echo $(MAC_PACKAGE_NAME) | tr "[:upper:]" "[:lower:]")
MAC_PACKAGE_VERSION=4.5.$(PACKAGE_VERSION_REV).$(MAC_COMMIT_DISTANCE) MAC_PACKAGE_VERSION=4.7.$(PACKAGE_VERSION_REV).$(MAC_COMMIT_DISTANCE)
MAC_PACKAGE_VERSION_MAJOR=$(word 1, $(subst ., ,$(MAC_PACKAGE_VERSION))) MAC_PACKAGE_VERSION_MAJOR=$(word 1, $(subst ., ,$(MAC_PACKAGE_VERSION)))
MAC_PACKAGE_VERSION_MINOR=$(word 2, $(subst ., ,$(MAC_PACKAGE_VERSION))) MAC_PACKAGE_VERSION_MINOR=$(word 2, $(subst ., ,$(MAC_PACKAGE_VERSION)))
MAC_PACKAGE_VERSION_REV=$(PACKAGE_VERSION_REV) MAC_PACKAGE_VERSION_REV=$(PACKAGE_VERSION_REV)

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

@ -472,8 +472,37 @@ argument in the project's Mac Build options.
### <a name="MM8026"/>MM8026: * is not supported when the dynamic registrar has been linked away. ### <a name="MM8026"/>MM8026: * is not supported when the dynamic registrar has been linked away.
This usually indicates a bug in Xamarin.Mac, because the dynamic registrar should not be linked away if it's needed. Please file a bug at [https://bugzilla.xamarin.com](https://bugzilla.xamarin.com/enter_bug.cgi?product=iOS). This usually indicates a bug in Xamarin.Mac, because the dynamic registrar should not be linked away if it's needed. Please file a bug at [https://bugzilla.xamarin.com](https://bugzilla.xamarin.com/enter_bug.cgi?product=Xamarin.Mac).
It's possible to force the linker to keep the dynamic registrar by adding It's possible to force the linker to keep the dynamic registrar by adding
`--optimize=-remove-dynamic-registrar` to the additional mmp arguments in `--optimize=-remove-dynamic-registrar` to the additional mmp arguments in
the project's Mac Build options. the project's Mac Build options.
### <a name="MT8027"/>MT8027: Failed to marshal the Objective-C object {handle} (type: {managed_type}). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance.
This occurs when the Xamarin.Mac runtime finds an Objective-C object without a
corresponding managed wrapper object, and when trying to create that managed
wrapper, it turns out it's not possible.
There are a few reasons this may happen:
* If it occurs when deserializing a storyboard/nib/xib and mentioning a
managed type that's used in that storyboard/nib/xib, then the fix is to add
a constructor that takes a single `IntPtr` argument to that managed type.
This constructor should not have any logic (because it's invoked before the
native and managed instances are fully created).
* A managed wrapper existed at some point, but was collected by the GC. If the
native object is still alive, and later resurfaces to managed code, the
Xamarin.Mac runtime will try to re-create a managed wrapper instance. In
most cases the problem here is that the managed wrapper shouldn't have been
collected by the GC in the first place.
Possible causes include:
* Manually calling Dispose too early on the managed wrapper.
* Incorrect bindings for third-party libraries.
* Reference-counting bugs in third-party libraries.
* It could be a bug in Xamarin.Mac. If this is the case, please file a bug at
[https://bugzilla.xamarin.com](https://bugzilla.xamarin.com/enter_bug.cgi?product=Xamarin.Mac).

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

@ -2482,3 +2482,32 @@ This usually indicates a bug in Xamarin.iOS, because the dynamic registrar shoul
It's possible to force the linker to keep the dynamic registrar by adding It's possible to force the linker to keep the dynamic registrar by adding
`--optimize=-remove-dynamic-registrar` to the additional mtouch arguments in `--optimize=-remove-dynamic-registrar` to the additional mtouch arguments in
the project's iOS Build options. the project's iOS Build options.
### <a name="MM8027"/>MM8027: Failed to marshal the Objective-C object {handle} (type: {managed_type}). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance.
This occurs when the Xamarin.iOS runtime finds an Objective-C object without a
corresponding managed wrapper object, and when trying to create that managed
wrapper, it turns out it's not possible.
There are a few reasons this may happen:
* If it occurs when deserializing a storyboard/nib/xib and mentioning a
managed type that's used in that storyboard/nib/xib, then the fix is to add
a constructor that takes a single `IntPtr` argument to that managed type.
This constructor should not have any logic (because it's invoked before the
native and managed instances are fully created).
* A managed wrapper existed at some point, but was collected by the GC. If the
native object is still alive, and later resurfaces to managed code, the
Xamarin.iOS runtime will try to re-create a managed wrapper instance. In
most cases the problem here is that the managed wrapper shouldn't have been
collected by the GC in the first place.
Possible causes include:
* Manually calling Dispose too early on the managed wrapper.
* Incorrect bindings for third-party libraries.
* Reference-counting bugs in third-party libraries.
* It could be a bug in Xamarin.iOS. If this is the case, please file a bug at
[https://bugzilla.xamarin.com](https://bugzilla.xamarin.com/enter_bug.cgi?product=iOS).

2
external/mono поставляемый

@ -1 +1 @@
Subproject commit 7627a5f9eeba0fd846731ad0c498556f55be1a34 Subproject commit 6e514dcc645ef70d53ab2a34266005d4ad875c73

20
jenkins/Jenkinsfile поставляемый
Просмотреть файл

@ -16,6 +16,8 @@ currentStage = null
xiPackageFilename = null xiPackageFilename = null
xmPackageFilename = null xmPackageFilename = null
msbuildZipFilename = null
bundleZipFilename = null
manifestFilename = null manifestFilename = null
artifactsFilename = null artifactsFilename = null
reportPrefix = null reportPrefix = null
@ -271,6 +273,12 @@ timestamps {
xmPackageFilename = xmPackages [0].name xmPackageFilename = xmPackages [0].name
echo ("Created Xamarin.Mac package: ${xmPackageFilename}") echo ("Created Xamarin.Mac package: ${xmPackageFilename}")
} }
def msbuildZip = findFiles (glob: "package/msbuild.zip")
if (msbuildZip.length > 0)
msbuildZipFilename = msbuildZip [0].name
def bundleZip = findFiles (glob: "package/bundle.zip")
if (bundleZip.length > 0)
bundleZipFilename = bundleZip [0].name
withCredentials ([string (credentialsId: 'codesign_keychain_pw', variable: 'PRODUCTSIGN_KEYCHAIN_PASSWORD')]) { withCredentials ([string (credentialsId: 'codesign_keychain_pw', variable: 'PRODUCTSIGN_KEYCHAIN_PASSWORD')]) {
sh ("${workspace}/xamarin-macios/jenkins/productsign.sh") sh ("${workspace}/xamarin-macios/jenkins/productsign.sh")
} }
@ -326,11 +334,11 @@ timestamps {
utils = load ("${workspace}/xamarin-macios/jenkins/utils.groovy") utils = load ("${workspace}/xamarin-macios/jenkins/utils.groovy")
if (xiPackageFilename != null) { if (xiPackageFilename != null) {
xiPackageUrl = "${packagePrefix}/${xiPackageFilename}" xiPackageUrl = "${packagePrefix}/${xiPackageFilename}"
utils.reportGitHubStatus (gitHash, 'jenkins-PKG-Xamarin.iOS', "${xiPackageUrl}", 'SUCCESS', "${xiPackageFilename}") utils.reportGitHubStatus (gitHash, 'PKG-Xamarin.iOS', "${xiPackageUrl}", 'SUCCESS', "${xiPackageFilename}")
} }
if (xmPackageFilename != null) { if (xmPackageFilename != null) {
xmPackageUrl = "${packagePrefix}/${xmPackageFilename}" xmPackageUrl = "${packagePrefix}/${xmPackageFilename}"
utils.reportGitHubStatus (gitHash, 'jenkins-PKG-Xamarin.Mac', "${xmPackageUrl}", 'SUCCESS', "${xmPackageFilename}") utils.reportGitHubStatus (gitHash, 'PKG-Xamarin.Mac', "${xmPackageUrl}", 'SUCCESS', "${xmPackageFilename}")
} }
if (manifestFilename != null) { if (manifestFilename != null) {
def manifestUrl = "${packagePrefix}/${manifestFilename}" def manifestUrl = "${packagePrefix}/${manifestFilename}"
@ -340,6 +348,14 @@ timestamps {
def artifactUrl = "${packagePrefix}/${artifactsFilename}" def artifactUrl = "${packagePrefix}/${artifactsFilename}"
utils.reportGitHubStatus (gitHash, "Jenkins: Artifacts", "${artifactUrl}", 'SUCCESS', "${artifactsFilename}") utils.reportGitHubStatus (gitHash, "Jenkins: Artifacts", "${artifactUrl}", 'SUCCESS', "${artifactsFilename}")
} }
if (bundleZipFilename != null) {
def bundleZipUrl = "${packagePrefix}/${bundleZipFilename}"
utils.reportGitHubStatus (gitHash, "bundle.zip", "${bundleZipUrl}", 'SUCCESS', "${bundleZipFilename}")
}
if (msbuildZipFilename != null) {
def msbuildZipUrl = "${packagePrefix}/${msbuildZipFilename}"
utils.reportGitHubStatus (gitHash, "msbuild.zip", "${msbuildZipUrl}", 'SUCCESS', "${msbuildZipFilename}")
}
} }
dir ('xamarin-macios') { dir ('xamarin-macios') {

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

@ -18,7 +18,12 @@ if test -d "$DEPENDENCY_PATH"; then
if ! git log -1 --pretty=%H "$DEPENDENCY_HASH" > /dev/null 2>&1; then if ! git log -1 --pretty=%H "$DEPENDENCY_HASH" > /dev/null 2>&1; then
echo "*** [$DEPENDENCY_NAME] git fetch $DEPENDENCY_REMOTE" echo "*** [$DEPENDENCY_NAME] git fetch $DEPENDENCY_REMOTE"
git fetch "$DEPENDENCY_REMOTE" git fetch "$DEPENDENCY_REMOTE"
elif ! git rev-parse --verify "$DEPENDENCY_REMOTE/$DEPENDENCY_BRANCH" > /dev/null 2>&1; then
# Also check if we have the branch we need, we might already have the hash, but not the branch
echo "*** [$DEPENDENCY_NAME] git fetch $DEPENDENCY_REMOTE"
git fetch "$DEPENDENCY_REMOTE"
fi fi
else else
echo "*** [$DEPENDENCY_NAME] git clone $DEPENDENCY_MODULE --recursive $DEPENDENCY_DIRECTORY -b $DEPENDENCY_BRANCH --origin $DEPENDENCY_REMOTE" echo "*** [$DEPENDENCY_NAME] git clone $DEPENDENCY_MODULE --recursive $DEPENDENCY_DIRECTORY -b $DEPENDENCY_BRANCH --origin $DEPENDENCY_REMOTE"
mkdir -p "$(dirname "$DEPENDENCY_PATH")" mkdir -p "$(dirname "$DEPENDENCY_PATH")"
@ -30,6 +35,9 @@ fi
if ! git log -1 --pretty=%H "$DEPENDENCY_HASH" > /dev/null 2>&1; then if ! git log -1 --pretty=%H "$DEPENDENCY_HASH" > /dev/null 2>&1; then
echo "The hash $DEPENDENCY_HASH does not exist in $DEPENDENCY_MODULE. Please verify that you pushed your changes." echo "The hash $DEPENDENCY_HASH does not exist in $DEPENDENCY_MODULE. Please verify that you pushed your changes."
exit 1 exit 1
elif ! git rev-parse --verify "$DEPENDENCY_REMOTE/$DEPENDENCY_BRANCH" > /dev/null 2>&1; then
echo "The branch $DEPENDENCY_BRANCH does not exist in $DEPENDENCY_MODULE. Please verify that you pushed your changes."
exit 1
fi fi
if test -z "$DEPENDENCY_IGNORE_VERSION"; then if test -z "$DEPENDENCY_IGNORE_VERSION"; then

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

@ -1,5 +1,5 @@
ifdef ENABLE_XAMARIN ifdef ENABLE_XAMARIN
NEEDED_MACCORE_VERSION := 76ab6a58ff9061d35450f4bc75d075874a8489a8 NEEDED_MACCORE_VERSION := 347ba77a16159e911191587a49dd55c100117c84
NEEDED_MACCORE_BRANCH := master NEEDED_MACCORE_BRANCH := master
MACCORE_DIRECTORY := maccore MACCORE_DIRECTORY := maccore

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

@ -179,7 +179,9 @@
new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_nsobject_with_type", new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_nsobject_with_type",
"id", "IntPtr", "obj", "id", "IntPtr", "obj",
"void *", "IntPtr", "type", "void *", "IntPtr", "type",
"int32_t *", "out bool", "created" "int32_t *", "out bool", "created",
"SEL", "IntPtr", "selector",
"MonoReflectionMethod *", "IntPtr", "method"
) { ) {
WrappedManagedFunction = "GetNSObjectWithType", WrappedManagedFunction = "GetNSObjectWithType",
OnlyDynamicUsage = false, OnlyDynamicUsage = false,
@ -271,6 +273,14 @@
WrappedManagedFunction = "ConvertNSStringToSmartEnum", WrappedManagedFunction = "ConvertNSStringToSmartEnum",
OnlyDynamicUsage = true, OnlyDynamicUsage = true,
}, },
new XDelegate ("int32_t", "int", "xamarin_create_runtime_exception",
"int32_t", "int", "code",
"const char *", "IntPtr", "message"
) {
WrappedManagedFunction = "CreateRuntimeException",
OnlyDynamicUsage = false,
},
}; };
delegates.CalculateLengths (); delegates.CalculateLengths ();
#><#+ #><#+

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

@ -239,11 +239,12 @@
#region metadata/object-internals.h #region metadata/object-internals.h
new Export (true, "void", "mono_set_pending_exception", new Export (true, "void", "mono_runtime_set_pending_exception",
"MonoException *", "exc" "MonoException *", "exc",
"mono_bool", "overwrite"
) )
{ {
AlternativeEntryPoint = "mono_raise_exception", AlternativeExpression = "return mono_raise_exception (exc);",
}, },
#endregion #endregion
@ -674,7 +675,7 @@
{ {
public string ReturnType; public string ReturnType;
public string EntryPoint; public string EntryPoint;
public string AlternativeEntryPoint; public string AlternativeExpression;
public List<Arg> Arguments; public List<Arg> Arguments;
public bool Optional; public bool Optional;

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

@ -125,8 +125,8 @@ MONO_API <#= export.ReturnType #>
{ {
<# if (export.Optional) { #> <# if (export.Optional) { #>
if (<#= export.EntryPoint #>_func == NULL) if (<#= export.EntryPoint #>_func == NULL)
<# if (!string.IsNullOrEmpty (export.AlternativeEntryPoint)) { #> <# if (!string.IsNullOrEmpty (export.AlternativeExpression)) { #>
return <#= export.AlternativeEntryPoint #> (<#= export.ArgumentNames #>); <#= export.AlternativeExpression #>
<# } else {#> <# } else {#>
xamarin_assertion_message ("Could not load <#= export.EntryPoint #>\n"); xamarin_assertion_message ("Could not load <#= export.EntryPoint #>\n");
<# } #> <# } #>

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

@ -257,17 +257,17 @@ xamarin_get_parameter_type (MonoMethod *managed_method, int index)
} }
MonoObject * MonoObject *
xamarin_get_nsobject_with_type_for_ptr (id self, bool owns, MonoType* type, guint32 *exception_gchandle) xamarin_get_nsobject_with_type_for_ptr (id self, bool owns, MonoType* type, SEL selector, MonoMethod *managed_method, guint32 *exception_gchandle)
{ {
// COOP: Reading managed data, must be in UNSAFE mode // COOP: Reading managed data, must be in UNSAFE mode
MONO_ASSERT_GC_UNSAFE; MONO_ASSERT_GC_UNSAFE;
int32_t created; int32_t created;
return xamarin_get_nsobject_with_type_for_ptr_created (self, owns, type, &created, exception_gchandle); return xamarin_get_nsobject_with_type_for_ptr_created (self, owns, type, &created, selector, managed_method, exception_gchandle);
} }
MonoObject * MonoObject *
xamarin_get_nsobject_with_type_for_ptr_created (id self, bool owns, MonoType *type, int32_t *created, guint32 *exception_gchandle) xamarin_get_nsobject_with_type_for_ptr_created (id self, bool owns, MonoType *type, int32_t *created, SEL selector, MonoMethod *managed_method, guint32 *exception_gchandle)
{ {
// COOP: Reading managed data, must be in UNSAFE mode // COOP: Reading managed data, must be in UNSAFE mode
MONO_ASSERT_GC_UNSAFE; MONO_ASSERT_GC_UNSAFE;
@ -288,7 +288,7 @@ xamarin_get_nsobject_with_type_for_ptr_created (id self, bool owns, MonoType *ty
return mobj; return mobj;
} }
return xamarin_get_nsobject_with_type (self, mono_type_get_object (mono_domain_get (), type), created, exception_gchandle); return xamarin_get_nsobject_with_type (self, mono_type_get_object (mono_domain_get (), type), created, selector, managed_method == NULL ? NULL : mono_method_get_object (mono_domain_get (), managed_method, NULL), exception_gchandle);
} }
MonoObject * MonoObject *
@ -672,9 +672,10 @@ xamarin_check_for_gced_object (MonoObject *obj, SEL sel, id self, MonoMethod *me
char *type_name = xamarin_lookup_managed_type_name ([self class], exception_gchandle); char *type_name = xamarin_lookup_managed_type_name ([self class], exception_gchandle);
if (*exception_gchandle == 0) { if (*exception_gchandle == 0) {
char *msg = xamarin_strdup_printf (m, self, object_getClassName (self), type_name, sel_getName (sel), method_full_name); char *msg = xamarin_strdup_printf (m, self, object_getClassName (self), type_name, sel_getName (sel), method_full_name);
MonoException *mex = xamarin_create_exception (msg); guint32 ex_handle = xamarin_create_runtime_exception (8027, msg, exception_gchandle);
xamarin_free (msg); xamarin_free (msg);
*exception_gchandle = mono_gchandle_new ((MonoObject *) mex, FALSE); if (*exception_gchandle == 0)
*exception_gchandle = ex_handle;
} }
mono_free (type_name); mono_free (type_name);
mono_free (method_full_name); mono_free (method_full_name);
@ -2118,6 +2119,16 @@ get_method_block_wrapper_creator (MonoMethod *method, int par, guint32 *exceptio
return res; return res;
} }
void
xamarin_release_block_on_main_thread (void *obj)
{
if ([NSThread isMainThread]) {
_Block_release (obj);
} else {
dispatch_async_f (dispatch_get_main_queue (), obj, (dispatch_function_t) _Block_release);
}
}
/* /*
* Creates a System.Delegate to wrap an Objective-C proxy when surfacing parameters from Objective-C to C#. * Creates a System.Delegate to wrap an Objective-C proxy when surfacing parameters from Objective-C to C#.
* @method: method where the parameter is found * @method: method where the parameter is found
@ -2167,7 +2178,7 @@ xamarin_get_delegate_for_block_parameter (MonoMethod *method, guint32 token_ref,
MONO_EXIT_GC_SAFE; MONO_EXIT_GC_SAFE;
if (block_wrapper_queue == NULL) if (block_wrapper_queue == NULL)
block_wrapper_queue = mono_gc_reference_queue_new ((void(*)(void*))_Block_release); block_wrapper_queue = mono_gc_reference_queue_new (xamarin_release_block_on_main_thread);
mono_gc_reference_queue_add (block_wrapper_queue, delegate, nativeBlock); mono_gc_reference_queue_add (block_wrapper_queue, delegate, nativeBlock);
pthread_mutex_unlock (&wrapper_hash_lock); pthread_mutex_unlock (&wrapper_hash_lock);
@ -2277,7 +2288,7 @@ xamarin_process_nsexception_using_mode (NSException *ns_exception, bool throwMan
if (exc_handle != NULL) { if (exc_handle != NULL) {
int handle = [exc_handle getHandle]; int handle = [exc_handle getHandle];
MonoObject *exc = mono_gchandle_get_target (handle); MonoObject *exc = mono_gchandle_get_target (handle);
mono_set_pending_exception ((MonoException *) exc); mono_runtime_set_pending_exception ((MonoException *) exc, false);
} else { } else {
int handle = xamarin_create_ns_exception (ns_exception, &exception_gchandle); int handle = xamarin_create_ns_exception (ns_exception, &exception_gchandle);
if (exception_gchandle != 0) { if (exception_gchandle != 0) {
@ -2288,7 +2299,7 @@ xamarin_process_nsexception_using_mode (NSException *ns_exception, bool throwMan
} }
MONO_ENTER_GC_UNSAFE; MONO_ENTER_GC_UNSAFE;
MonoObject *exc = mono_gchandle_get_target (handle); MonoObject *exc = mono_gchandle_get_target (handle);
mono_set_pending_exception ((MonoException *) exc); mono_runtime_set_pending_exception ((MonoException *) exc, false);
mono_gchandle_free (handle); mono_gchandle_free (handle);
MONO_EXIT_GC_UNSAFE; MONO_EXIT_GC_UNSAFE;
} }

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

@ -118,7 +118,7 @@ xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_
if (isCategoryInstance) { if (isCategoryInstance) {
// we know this must be an id // we know this must be an id
p = mono_signature_get_params (msig, &iter); p = mono_signature_get_params (msig, &iter);
arg_ptrs [0] = xamarin_get_nsobject_with_type_for_ptr (self, false, p, &exception_gchandle); arg_ptrs [0] = xamarin_get_nsobject_with_type_for_ptr (self, false, p, sel, method, &exception_gchandle);
if (exception_gchandle != 0) if (exception_gchandle != 0)
goto exception_handling; goto exception_handling;
mofs = 1; mofs = 1;
@ -195,7 +195,7 @@ xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_
MonoObject *obj; MonoObject *obj;
NSObject *targ = *(NSObject **) arg; NSObject *targ = *(NSObject **) arg;
obj = xamarin_get_nsobject_with_type_for_ptr (targ, false, p, &exception_gchandle); obj = xamarin_get_nsobject_with_type_for_ptr (targ, false, p, sel, method, &exception_gchandle);
if (exception_gchandle != 0) if (exception_gchandle != 0)
goto exception_handling; goto exception_handling;
#if DEBUG #if DEBUG
@ -324,7 +324,7 @@ xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_
} else { } else {
MonoObject *obj; MonoObject *obj;
id targ = [arr objectAtIndex: j]; id targ = [arr objectAtIndex: j];
obj = xamarin_get_nsobject_with_type_for_ptr (targ, false, e, &exception_gchandle); obj = xamarin_get_nsobject_with_type_for_ptr (targ, false, e, sel, method, &exception_gchandle);
if (exception_gchandle != 0) if (exception_gchandle != 0)
goto exception_handling; goto exception_handling;
#if DEBUG #if DEBUG
@ -343,7 +343,7 @@ xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_
} }
MonoObject *obj; MonoObject *obj;
int32_t created = false; int32_t created = false;
obj = xamarin_get_nsobject_with_type_for_ptr_created (id_arg, false, p, &created, &exception_gchandle); obj = xamarin_get_nsobject_with_type_for_ptr_created (id_arg, false, p, &created, sel, method, &exception_gchandle);
if (exception_gchandle != 0) if (exception_gchandle != 0)
goto exception_handling; goto exception_handling;
@ -380,7 +380,7 @@ xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_
[id_arg autorelease]; [id_arg autorelease];
} }
MonoObject *obj; MonoObject *obj;
obj = xamarin_get_nsobject_with_type_for_ptr (id_arg, false, p, &exception_gchandle); obj = xamarin_get_nsobject_with_type_for_ptr (id_arg, false, p, sel, method, &exception_gchandle);
if (exception_gchandle != 0) if (exception_gchandle != 0)
goto exception_handling; goto exception_handling;
#if DEBUG #if DEBUG

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

@ -1122,7 +1122,7 @@ xamarin_nsstring_to_smart_enum (id value, void *ptr, MonoClass *managedType, gui
managed_method = xamarin_get_managed_method_for_token (context /* token ref */, exception_gchandle); managed_method = xamarin_get_managed_method_for_token (context /* token ref */, exception_gchandle);
if (*exception_gchandle != 0) return NULL; if (*exception_gchandle != 0) return NULL;
arg_ptrs [0] = xamarin_get_nsobject_with_type_for_ptr (value, false, xamarin_get_parameter_type (managed_method, 0), exception_gchandle); arg_ptrs [0] = xamarin_get_nsobject_with_type_for_ptr (value, false, xamarin_get_parameter_type (managed_method, 0), NULL, NULL, exception_gchandle);
if (*exception_gchandle != 0) return NULL; if (*exception_gchandle != 0) return NULL;
obj = mono_runtime_invoke (managed_method, NULL, arg_ptrs, &exception); obj = mono_runtime_invoke (managed_method, NULL, arg_ptrs, &exception);

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

@ -173,8 +173,8 @@ bool xamarin_is_class_nsstring (MonoClass *cls);
bool xamarin_is_class_nullable (MonoClass *cls, MonoClass **element_type, guint32 *exception_gchandle); bool xamarin_is_class_nullable (MonoClass *cls, MonoClass **element_type, guint32 *exception_gchandle);
MonoClass * xamarin_get_nullable_type (MonoClass *cls, guint32 *exception_gchandle); MonoClass * xamarin_get_nullable_type (MonoClass *cls, guint32 *exception_gchandle);
MonoType * xamarin_get_parameter_type (MonoMethod *managed_method, int index); MonoType * xamarin_get_parameter_type (MonoMethod *managed_method, int index);
MonoObject * xamarin_get_nsobject_with_type_for_ptr (id self, bool owns, MonoType* type, guint32 *exception_gchandle); MonoObject * xamarin_get_nsobject_with_type_for_ptr (id self, bool owns, MonoType* type, SEL selector, MonoMethod *managed_method, guint32 *exception_gchandle);
MonoObject * xamarin_get_nsobject_with_type_for_ptr_created (id self, bool owns, MonoType *type, int32_t *created, guint32 *exception_gchandle); MonoObject * xamarin_get_nsobject_with_type_for_ptr_created (id self, bool owns, MonoType *type, int32_t *created, SEL selector, MonoMethod *managed_method, guint32 *exception_gchandle);
int * xamarin_get_delegate_for_block_parameter (MonoMethod *method, guint32 token_ref, int par, void *nativeBlock, guint32 *exception_gchandle); int * xamarin_get_delegate_for_block_parameter (MonoMethod *method, guint32 token_ref, int par, void *nativeBlock, guint32 *exception_gchandle);
id xamarin_get_block_for_delegate (MonoMethod *method, MonoObject *delegate, const char *signature /* NULL allowed, but requires the dynamic registrar at runtime to compute */, guint32 *exception_gchandle); id xamarin_get_block_for_delegate (MonoMethod *method, MonoObject *delegate, const char *signature /* NULL allowed, but requires the dynamic registrar at runtime to compute */, guint32 *exception_gchandle);
id xamarin_get_nsobject_handle (MonoObject *obj); id xamarin_get_nsobject_handle (MonoObject *obj);
@ -200,6 +200,7 @@ void xamarin_create_classes ();
const char * xamarin_skip_encoding_flags (const char *encoding); const char * xamarin_skip_encoding_flags (const char *encoding);
void xamarin_add_registration_map (struct MTRegistrationMap *map); void xamarin_add_registration_map (struct MTRegistrationMap *map);
uint32_t xamarin_find_protocol_wrapper_type (uint32_t token_ref); uint32_t xamarin_find_protocol_wrapper_type (uint32_t token_ref);
void xamarin_release_block_on_main_thread (void *obj);
bool xamarin_has_managed_ref (id self); bool xamarin_has_managed_ref (id self);
bool xamarin_has_managed_ref_safe (id self); bool xamarin_has_managed_ref_safe (id self);

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

@ -202,8 +202,7 @@ namespace Compression
return ReadCore (new Span<byte> (array, offset, count)); return ReadCore (new Span<byte> (array, offset, count));
} }
// FIXME needs Span public override int Read (Span<byte> destination)
internal override int Read (Span<byte> destination)
{ {
if (GetType () != typeof (CompressionStream)) { if (GetType () != typeof (CompressionStream)) {
// CompressStream is not sealed, and a derived type may have overridden Read(byte[], int, int) prior // CompressStream is not sealed, and a derived type may have overridden Read(byte[], int, int) prior
@ -313,8 +312,7 @@ namespace Compression
return ReadAsyncMemory (new Memory<byte>(array, offset, count), cancellationToken).AsTask (); return ReadAsyncMemory (new Memory<byte>(array, offset, count), cancellationToken).AsTask ();
} }
// FIXME needs Span public override ValueTask<int> ReadAsync (Memory<byte> destination, CancellationToken cancellationToken = default(CancellationToken))
internal override ValueTask<int> ReadAsync (Memory<byte> destination, CancellationToken cancellationToken = default(CancellationToken))
{ {
if (GetType () != typeof (CompressionStream)) { if (GetType () != typeof (CompressionStream)) {
// Ensure that existing streams derived from DeflateStream and that override ReadAsync(byte[],...) // Ensure that existing streams derived from DeflateStream and that override ReadAsync(byte[],...)
@ -407,8 +405,7 @@ namespace Compression
WriteCore (new ReadOnlySpan<byte> (array, offset, count)); WriteCore (new ReadOnlySpan<byte> (array, offset, count));
} }
// FIXME needs Span public override void Write (ReadOnlySpan<byte> source)
internal override void Write (ReadOnlySpan<byte> source)
{ {
if (GetType () != typeof (CompressionStream)) { if (GetType () != typeof (CompressionStream)) {
// DeflateStream is not sealed, and a derived type may have overridden Write(byte[], int, int) prior // DeflateStream is not sealed, and a derived type may have overridden Write(byte[], int, int) prior
@ -561,8 +558,7 @@ namespace Compression
return WriteAsyncMemory (new ReadOnlyMemory<byte> (array, offset, count), cancellationToken); return WriteAsyncMemory (new ReadOnlyMemory<byte> (array, offset, count), cancellationToken);
} }
// FIXME needs Span public override Task WriteAsync (ReadOnlyMemory<byte> source, CancellationToken cancellationToken)
internal override Task WriteAsync (ReadOnlyMemory<byte> source, CancellationToken cancellationToken)
{ {
if (GetType () != typeof (CompressionStream)) { if (GetType () != typeof (CompressionStream)) {
// Ensure that existing streams derived from DeflateStream and that override WriteAsync(byte[],...) // Ensure that existing streams derived from DeflateStream and that override WriteAsync(byte[],...)

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

@ -107,6 +107,11 @@ namespace ObjCRuntime {
{ {
IntPtr @class = IntPtr.Zero; IntPtr @class = IntPtr.Zero;
if (type.IsByRef || type.IsPointer || type.IsArray) {
is_custom_type = false;
return IntPtr.Zero;
}
// We cache results in a dictionary (type_to_class) - we put failures (when @class = IntPtr.Zero) in the dictionary as well. // We cache results in a dictionary (type_to_class) - we put failures (when @class = IntPtr.Zero) in the dictionary as well.
// We do as little as possible with the lock held (only fetch/add to the dictionary, nothing else) // We do as little as possible with the lock held (only fetch/add to the dictionary, nothing else)

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

@ -906,7 +906,7 @@ namespace Registrar {
if (res.IsInstanceCategory) { if (res.IsInstanceCategory) {
mthis = IntPtr.Zero; mthis = IntPtr.Zero;
} else { } else {
var nsobj = Runtime.GetNSObject (obj, Runtime.MissingCtorResolution.ThrowConstructor1NotFound, true); var nsobj = Runtime.GetNSObject (obj, Runtime.MissingCtorResolution.ThrowConstructor1NotFound, true, selector, ObjectWrapper.Convert (res.Method));
mthis = ObjectWrapper.Convert (nsobj); mthis = ObjectWrapper.Convert (nsobj);
if (res.Method.ContainsGenericParameters) { if (res.Method.ContainsGenericParameters) {
res.WriteUnmanagedDescription (desc, Runtime.FindClosedMethod (nsobj.GetType (), res.Method)); res.WriteUnmanagedDescription (desc, Runtime.FindClosedMethod (nsobj.GetType (), res.Method));

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

@ -416,6 +416,12 @@ namespace ObjCRuntime {
return GCHandle.ToIntPtr (GCHandle.Alloc (ex)).ToInt32 (); return GCHandle.ToIntPtr (GCHandle.Alloc (ex)).ToInt32 ();
} }
static int CreateRuntimeException (int code, IntPtr message)
{
var ex = ErrorHelper.CreateError (code, Marshal.PtrToStringAuto (message));
return GCHandle.ToIntPtr (GCHandle.Alloc (ex)).ToInt32 ();
}
static IntPtr UnwrapNSException (int exc_handle) static IntPtr UnwrapNSException (int exc_handle)
{ {
var obj = GCHandle.FromIntPtr (new IntPtr (exc_handle)).Target; var obj = GCHandle.FromIntPtr (new IntPtr (exc_handle)).Target;
@ -698,11 +704,11 @@ namespace ObjCRuntime {
return ObjectWrapper.Convert (GetINativeObject (ptr, owns, iface, type)); return ObjectWrapper.Convert (GetINativeObject (ptr, owns, iface, type));
} }
static IntPtr GetNSObjectWithType (IntPtr ptr, IntPtr type_ptr, out bool created) static IntPtr GetNSObjectWithType (IntPtr ptr, IntPtr type_ptr, out bool created, IntPtr selector, IntPtr method)
{ {
// It doesn't work to use System.Type in the signature, we get garbage. // It doesn't work to use System.Type in the signature, we get garbage.
var type = (System.Type) ObjectWrapper.Convert (type_ptr); var type = (System.Type) ObjectWrapper.Convert (type_ptr);
return ObjectWrapper.Convert (GetNSObject (ptr, type, MissingCtorResolution.ThrowConstructor1NotFound, true, out created)); return ObjectWrapper.Convert (GetNSObject (ptr, type, MissingCtorResolution.ThrowConstructor1NotFound, true, out created, selector, method));
} }
static void Dispose (IntPtr mobj) static void Dispose (IntPtr mobj)
@ -1016,7 +1022,7 @@ namespace ObjCRuntime {
Ignore, Ignore,
} }
static void MissingCtor (IntPtr ptr, IntPtr klass, Type type, MissingCtorResolution resolution) static void MissingCtor (IntPtr ptr, IntPtr klass, Type type, MissingCtorResolution resolution, IntPtr selector = default (IntPtr), IntPtr method = default (IntPtr))
{ {
string msg; string msg;
@ -1041,15 +1047,26 @@ namespace ObjCRuntime {
return; return;
} }
throw new Exception (string.Format (msg, ptr.ToString ("x"), new Class (klass).Name, type.FullName)); if (selector != IntPtr.Zero || method != IntPtr.Zero)
msg += "\nAdditional information:\n";
if (selector != IntPtr.Zero)
msg += $"\tSelector: {Selector.GetName (selector)}\n";
if (method != IntPtr.Zero) {
var mi = ObjectWrapper.Convert (method) as MethodBase;
if (mi != null)
msg += $"\tMethod: {mi.FullName}\n";
}
throw ErrorHelper.CreateError (8027, string.Format (msg, ptr.ToString ("x"), new Class (klass).Name, type.FullName));
} }
static NSObject ConstructNSObject (IntPtr ptr, IntPtr klass, MissingCtorResolution missingCtorResolution) static NSObject ConstructNSObject (IntPtr ptr, IntPtr klass, MissingCtorResolution missingCtorResolution, IntPtr selector = default (IntPtr), IntPtr method = default (IntPtr))
{ {
Type type = Class.Lookup (klass); Type type = Class.Lookup (klass);
if (type != null) { if (type != null) {
return ConstructNSObject<NSObject> (ptr, type, missingCtorResolution); return ConstructNSObject<NSObject> (ptr, type, missingCtorResolution, selector, method);
} else { } else {
return new NSObject (ptr); return new NSObject (ptr);
} }
@ -1061,7 +1078,8 @@ namespace ObjCRuntime {
} }
// The generic argument T is only used to cast the return value. // The generic argument T is only used to cast the return value.
static T ConstructNSObject<T> (IntPtr ptr, Type type, MissingCtorResolution missingCtorResolution) where T: class, INativeObject // The 'selector' and 'method' arguments are only used in error messages.
static T ConstructNSObject<T> (IntPtr ptr, Type type, MissingCtorResolution missingCtorResolution, IntPtr selector = default (IntPtr), IntPtr method = default (IntPtr)) where T: class, INativeObject
{ {
if (type == null) if (type == null)
throw new ArgumentNullException ("type"); throw new ArgumentNullException ("type");
@ -1069,7 +1087,7 @@ namespace ObjCRuntime {
var ctor = GetIntPtrConstructor (type); var ctor = GetIntPtrConstructor (type);
if (ctor == null) { if (ctor == null) {
MissingCtor (ptr, IntPtr.Zero, type, missingCtorResolution); MissingCtor (ptr, IntPtr.Zero, type, missingCtorResolution, selector, method);
return null; return null;
} }
@ -1158,7 +1176,7 @@ namespace ObjCRuntime {
return GetNSObject (ptr, MissingCtorResolution.ThrowConstructor1NotFound); return GetNSObject (ptr, MissingCtorResolution.ThrowConstructor1NotFound);
} }
internal static NSObject GetNSObject (IntPtr ptr, MissingCtorResolution missingCtorResolution, bool evenInFinalizerQueue = false) { internal static NSObject GetNSObject (IntPtr ptr, MissingCtorResolution missingCtorResolution, bool evenInFinalizerQueue = false, IntPtr selector = default (IntPtr), IntPtr method = default (IntPtr)) {
if (ptr == IntPtr.Zero) if (ptr == IntPtr.Zero)
return null; return null;
@ -1167,7 +1185,7 @@ namespace ObjCRuntime {
if (o != null) if (o != null)
return o; return o;
return ConstructNSObject (ptr, Class.GetClassForObject (ptr), missingCtorResolution); return ConstructNSObject (ptr, Class.GetClassForObject (ptr), missingCtorResolution, selector, method);
} }
static public T GetNSObject<T> (IntPtr ptr) where T : NSObject static public T GetNSObject<T> (IntPtr ptr) where T : NSObject
@ -1237,7 +1255,8 @@ namespace ObjCRuntime {
// NSObject subclasses (the test case in #13518 should work even with type checks). // NSObject subclasses (the test case in #13518 should work even with type checks).
// //
static NSObject GetNSObject (IntPtr ptr, Type target_type, MissingCtorResolution missingCtorResolution, bool evenInFinalizerQueue, out bool created) { // The 'selector' and 'method' arguments are only used in error messages.
static NSObject GetNSObject (IntPtr ptr, Type target_type, MissingCtorResolution missingCtorResolution, bool evenInFinalizerQueue, out bool created, IntPtr selector = default (IntPtr), IntPtr method = default (IntPtr)) {
created = false; created = false;
if (ptr == IntPtr.Zero) if (ptr == IntPtr.Zero)
@ -1269,7 +1288,7 @@ namespace ObjCRuntime {
} }
created = true; created = true;
return ConstructNSObject<NSObject> (ptr, target_type, MissingCtorResolution.ThrowConstructor1NotFound); return ConstructNSObject<NSObject> (ptr, target_type, MissingCtorResolution.ThrowConstructor1NotFound, selector, method);
} }
static Type LookupINativeObjectImplementation (IntPtr ptr, Type target_type, Type implementation = null) static Type LookupINativeObjectImplementation (IntPtr ptr, Type target_type, Type implementation = null)
@ -1594,6 +1613,21 @@ namespace ObjCRuntime {
throw ErrorHelper.CreateError (8003, "Failed to find the closed generic method '{0}' on the type '{1}'.", open_method.Name, closed_type.FullName); throw ErrorHelper.CreateError (8003, "Failed to find the closed generic method '{0}' on the type '{1}'.", open_method.Name, closed_type.FullName);
} }
[EditorBrowsable (EditorBrowsableState.Never)]
#if MONOMAC
public static void ReleaseBlockOnMainThread (IntPtr block)
{
if (release_block_on_main_thread == null)
release_block_on_main_thread = LookupInternalFunction<intptr_func> ("xamarin_release_block_on_main_thread");
release_block_on_main_thread (block);
}
delegate void intptr_func (IntPtr block);
static intptr_func release_block_on_main_thread;
#else
[DllImport ("__Internal", EntryPoint = "xamarin_release_block_on_main_thread")]
public static extern void ReleaseBlockOnMainThread (IntPtr block);
#endif
} }
internal class IntPtrEqualityComparer : IEqualityComparer<IntPtr> internal class IntPtrEqualityComparer : IEqualityComparer<IntPtr>

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

@ -3921,6 +3921,10 @@ namespace AppKit {
[Mac (10,10)] [Mac (10,10)]
[Static, Export ("quaternaryLabelColor")] [Static, Export ("quaternaryLabelColor")]
NSColor QuaternaryLabelColor { get; } NSColor QuaternaryLabelColor { get; }
[Mac (10, 10)]
[Static, Export ("linkColor", ArgumentSemantic.Strong)]
NSColor LinkColor { get; }
[Mac (10,12)] [Mac (10,12)]
[Static] [Static]

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

@ -10255,7 +10255,16 @@ namespace Foundation
interface NSDistributedNotificationCenter { interface NSDistributedNotificationCenter {
[Static] [Static]
[Export ("defaultCenter")] [Export ("defaultCenter")]
#if XAMCORE_4_0
NSDistributedNotificationCenter DefaultCenter { get; }
#else
NSDistributedNotificationCenter GetDefaultCenter ();
[Static]
[Advice ("Use 'GetDefaultCenter ()' for a strongly typed version.")]
[Wrap ("GetDefaultCenter ()")]
NSObject DefaultCenter { get; } NSObject DefaultCenter { get; }
#endif
[Export ("addObserver:selector:name:object:suspensionBehavior:")] [Export ("addObserver:selector:name:object:suspensionBehavior:")]
void AddObserver (NSObject observer, Selector selector, [NullAllowed] string notificationName, [NullAllowed] string notificationSenderc, NSNotificationSuspensionBehavior suspensionBehavior); void AddObserver (NSObject observer, Selector selector, [NullAllowed] string notificationName, [NullAllowed] string notificationSenderc, NSNotificationSuspensionBehavior suspensionBehavior);

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

@ -2514,9 +2514,6 @@ public partial class Generator : IMemberGatherer {
print (""); print ("");
print ("[DllImport (\"/usr/lib/libobjc.dylib\")]"); print ("[DllImport (\"/usr/lib/libobjc.dylib\")]");
print ("static extern IntPtr _Block_copy (IntPtr ptr);"); print ("static extern IntPtr _Block_copy (IntPtr ptr);");
print ("");
print ("[DllImport (\"/usr/lib/libobjc.dylib\")]");
print ("static extern void _Block_release (IntPtr ptr);");
while (trampolines.Count > 0){ while (trampolines.Count > 0){
var queue = trampolines.Values.ToArray (); var queue = trampolines.Values.ToArray ();
@ -2604,7 +2601,7 @@ public partial class Generator : IMemberGatherer {
print_generated_code (); print_generated_code ();
print ("~{0} ()", ti.NativeInvokerName); print ("~{0} ()", ti.NativeInvokerName);
print ("{"); indent++; print ("{"); indent++;
print ("_Block_release (blockPtr);", ns.CoreObjCRuntime); print ("Runtime.ReleaseBlockOnMainThread (blockPtr);", ns.CoreObjCRuntime);
indent--; print ("}"); indent--; print ("}");
print (""); print ("");
print ("[Preserve (Conditional=true)]"); print ("[Preserve (Conditional=true)]");

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

@ -110,17 +110,17 @@ while ! test -z $1; do
done done
# reporting functions # reporting functions
COLOR_RED=$(tput setaf 1 2>/dev/null || true)
COLOR_ORANGE=$(tput setaf 3 2>/dev/null || true)
COLOR_MAGENTA=$(tput setaf 5 2>/dev/null || true)
COLOR_CLEAR=$(tput sgr0 2>/dev/null || true)
function fail () { function fail () {
tput setaf 1 2>/dev/null || true echo " ${COLOR_RED}$1${COLOR_CLEAR}"
echo " $1"
tput sgr0 2>/dev/null || true
FAIL=1 FAIL=1
} }
function warn () { function warn () {
tput setaf 3 2>/dev/null || true echo " ${COLOR_ORANGE}$1${COLOR_CLEAR}"
echo " $1"
tput sgr0 2>/dev/null || true
} }
function ok () { function ok () {
@ -439,6 +439,7 @@ function check_mono () {
fail "You may edit Make.config and change MAX_MONO_VERSION to your actual version to continue the" fail "You may edit Make.config and change MAX_MONO_VERSION to your actual version to continue the"
fail "build (unless you're on a release branch). Once the build completes successfully, please" fail "build (unless you're on a release branch). Once the build completes successfully, please"
fail "commit the new MAX_MONO_VERSION value." fail "commit the new MAX_MONO_VERSION value."
fail "Alternatively you can ${COLOR_MAGENTA}export IGNORE_MONO=1${COLOR_RED} to skip this check."
return return
fi fi
fi fi
@ -551,7 +552,9 @@ function check_visual_studio () {
fail "You may edit Make.config and change MAX_VISUAL_STUDIO_VERSION to your actual version to continue the" fail "You may edit Make.config and change MAX_VISUAL_STUDIO_VERSION to your actual version to continue the"
fail "build (unless you're on a release branch). Once the build completes successfully, please" fail "build (unless you're on a release branch). Once the build completes successfully, please"
fail "commit the new MAX_VISUAL_STUDIO_VERSION value." fail "commit the new MAX_VISUAL_STUDIO_VERSION value."
fail "Alternatively you can download an older version from $VS_URL." fail "Alternatively you can download an older version from:"
fail " $VS_URL,"
fail "or you can ${COLOR_MAGENTA}export IGNORE_VISUAL_STUDIO=1${COLOR_RED} to skip this check."
fi fi
return return
fi fi
@ -661,6 +664,7 @@ function check_objective_sharpie () {
else else
if test -z $OPTIONAL_SHARPIE; then if test -z $OPTIONAL_SHARPIE; then
fail "You must install Objective Sharpie, at least $MIN_SHARPIE_VERSION (no Objective Sharpie found). You can download it from $SHARPIE_URL" fail "You must install Objective Sharpie, at least $MIN_SHARPIE_VERSION (no Objective Sharpie found). You can download it from $SHARPIE_URL"
fail "Alternatively you can ${COLOR_MAGENTA}export IGNORE_SHARPIE=1${COLOR_RED} to skip this check."
else else
warn "You do not have Objective Sharpie installed (should be at least $MIN_SHARPIE_VERSION). You can download it from $SHARPIE_URL" warn "You do not have Objective Sharpie installed (should be at least $MIN_SHARPIE_VERSION). You can download it from $SHARPIE_URL"
fi fi
@ -675,6 +679,7 @@ function check_objective_sharpie () {
else else
if test -z $OPTIONAL_SHARPIE; then if test -z $OPTIONAL_SHARPIE; then
fail "You must have at least Objective Sharpie $MIN_SHARPIE_VERSION, found $ACTUAL_SHARPIE_VERSION. You can download it from $SHARPIE_URL" fail "You must have at least Objective Sharpie $MIN_SHARPIE_VERSION, found $ACTUAL_SHARPIE_VERSION. You can download it from $SHARPIE_URL"
fail "Alternatively you can ${COLOR_MAGENTA}export IGNORE_SHARPIE=1${COLOR_RED} to skip this check."
else else
warn "You do not have have at least Objective Sharpie $MIN_SHARPIE_VERSION (found $ACTUAL_SHARPIE_VERSION). You can download it from $SHARPIE_URL" warn "You do not have have at least Objective Sharpie $MIN_SHARPIE_VERSION (found $ACTUAL_SHARPIE_VERSION). You can download it from $SHARPIE_URL"
fi fi
@ -689,6 +694,7 @@ function check_objective_sharpie () {
else else
if test -z $OPTIONAL_SHARPIE; then if test -z $OPTIONAL_SHARPIE; then
fail "Your Objective Sharpie version is too new, max version is $MAX_SHARPIE_VERSION, found $ACTUAL_SHARPIE_VERSION. We recommend you download $SHARPIE_URL" fail "Your Objective Sharpie version is too new, max version is $MAX_SHARPIE_VERSION, found $ACTUAL_SHARPIE_VERSION. We recommend you download $SHARPIE_URL"
fail "Alternatively you can ${COLOR_MAGENTA}export IGNORE_SHARPIE=1${COLOR_RED} to skip this check."
else else
warn "You do not have have at most Objective Sharpie $MAX_SHARPIE_VERSION (found $ACTUAL_SHARPIE_VERSION). We recommend you download $SHARPIE_URL" warn "You do not have have at most Objective Sharpie $MAX_SHARPIE_VERSION (found $ACTUAL_SHARPIE_VERSION). We recommend you download $SHARPIE_URL"
fi fi

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

@ -31,6 +31,7 @@ namespace XamarinTests.ObjCRuntime {
} }
} }
#if __UNIFIED__
[Test] [Test]
public void IntPtrCtor () public void IntPtrCtor ()
{ {
@ -38,24 +39,22 @@ namespace XamarinTests.ObjCRuntime {
try { try {
ptr = Messaging.IntPtr_objc_msgSend (Class.GetHandle (typeof (IntPtrCtorTestClass)), Selector.GetHandle ("alloc")); ptr = Messaging.IntPtr_objc_msgSend (Class.GetHandle (typeof (IntPtrCtorTestClass)), Selector.GetHandle ("alloc"));
ptr = Messaging.IntPtr_objc_msgSend (ptr, Selector.GetHandle ("init")); ptr = Messaging.IntPtr_objc_msgSend (ptr, Selector.GetHandle ("init"));
var ex = Assert.Throws<Exception> (() => Messaging.bool_objc_msgSend_IntPtr (ptr, Selector.GetHandle ("conformsToProtocol:"), IntPtr.Zero)); var ex = Assert.Throws<RuntimeException> (() => Messaging.bool_objc_msgSend_IntPtr (ptr, Selector.GetHandle ("conformsToProtocol:"), IntPtr.Zero));
var msg = string.Format ("Failed to marshal the Objective-C object 0x{0} (type: IntPtrCtorTestClass). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance (because the type 'XamarinTests.ObjCRuntime.RegistrarSharedTest+IntPtrCtorTestClass' does not have a constructor that takes one IntPtr argument).", ptr.ToString ("x")); var msg = string.Format ("Failed to marshal the Objective-C object 0x{0} (type: IntPtrCtorTestClass). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance (because the type 'XamarinTests.ObjCRuntime.RegistrarSharedTest+IntPtrCtorTestClass' does not have a constructor that takes one IntPtr argument).", ptr.ToString ("x"));
msg += "\nAdditional information:\n\tSelector: conformsToProtocol:\n\tMethod: ";
// The difference between the registrars is basically whether this string
// was constructed by native mono API or managed API.
if (CurrentRegistrar == Registrars.Static) { if (CurrentRegistrar == Registrars.Static) {
msg += "\nAdditional information:\n\tSelector: conformsToProtocol:\n\tMethod: ";
#if !XAMCORE_2_0
#if __IOS__
msg += "MonoTouch.";
#else
msg += "MonoMac.";
#endif
#endif
msg += "Foundation.NSObject:InvokeConformsToProtocol (intptr)\n"; msg += "Foundation.NSObject:InvokeConformsToProtocol (intptr)\n";
} else {
msg += "Foundation.NSObject.InvokeConformsToProtocol(IntPtr)\n";
} }
Assert.AreEqual (msg, ex.Message, "#message"); Assert.AreEqual (msg, ex.Message, "#message");
} finally { } finally {
Messaging.void_objc_msgSend (ptr, Selector.GetHandle ("release")); Messaging.void_objc_msgSend (ptr, Selector.GetHandle ("release"));
} }
} }
#endif
[Register ("IntPtrCtorTestClass")] [Register ("IntPtrCtorTestClass")]
class IntPtrCtorTestClass : NSObject { class IntPtrCtorTestClass : NSObject {

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

@ -323,6 +323,16 @@ namespace Bindings.Test {
[Export ("callOptionalStaticCallback")] [Export ("callOptionalStaticCallback")]
void CallOptionalStaticCallback (); void CallOptionalStaticCallback ();
[Static]
[Export ("callAssertMainThreadBlockRelease:")]
void CallAssertMainThreadBlockRelease (OuterBlock completionHandler);
[Export ("assertMainThreadBlockReleaseCallback:")]
void AssertMainThreadBlockReleaseCallback (InnerBlock completionHandler);
[Export ("callAssertMainThreadBlockReleaseCallback")]
void CallAssertMainThreadBlockReleaseCallback ();
[Export ("testFreedBlocks")] [Export ("testFreedBlocks")]
void TestFreedBlocks (); void TestFreedBlocks ();
@ -331,6 +341,9 @@ namespace Bindings.Test {
int FreedBlockCount { get; } int FreedBlockCount { get; }
} }
delegate void InnerBlock (int magic_number);
delegate void OuterBlock ([BlockCallback] InnerBlock callback);
[BaseType (typeof (NSObject))] [BaseType (typeof (NSObject))]
interface EvilDeallocator interface EvilDeallocator
{ {

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

@ -55,5 +55,24 @@ namespace Xamarin.Tests
}; };
} }
} }
[Test]
public void MainThreadDeallocationTest ()
{
ObjCBlockTester.CallAssertMainThreadBlockRelease ((callback) => {
callback (42);
});
using (var main_thread_tester = new MainThreadTest ()) {
main_thread_tester.CallAssertMainThreadBlockReleaseCallback ();
}
}
class MainThreadTest : ObjCBlockTester {
public override void AssertMainThreadBlockReleaseCallback (InnerBlock completionHandler)
{
completionHandler (42);
}
}
} }
} }

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

@ -125,6 +125,9 @@ namespace LinkAll.Attributes {
[Preserve (AllMembers = true)] [Preserve (AllMembers = true)]
public class AttributeTest { public class AttributeTest {
// Good enough to fool linker to abort the tracking
static string mscorlib = "mscorlib";
[Test] [Test]
public void DebugAssemblyAttributes () public void DebugAssemblyAttributes ()
{ {
@ -187,7 +190,7 @@ namespace LinkAll.Attributes {
{ {
var d = new Dictionary<string,int> () { { "key", 0 } }; var d = new Dictionary<string,int> () { { "key", 0 } };
Assert.NotNull (d); // just to be 100% sure it won't be linked away (with the attribute we'll be looking for) Assert.NotNull (d); // just to be 100% sure it won't be linked away (with the attribute we'll be looking for)
var proxy = Type.GetType ("System.Collections.Generic.Mscorlib_DictionaryDebugView`2, mscorlib"); var proxy = Type.GetType ("System.Collections.Generic.IDictionaryDebugView`2, " + mscorlib);
#if DEBUG #if DEBUG
Assert.NotNull (proxy, "proxy"); Assert.NotNull (proxy, "proxy");
// having the type is nice, but it must not be empty to be useful // having the type is nice, but it must not be empty to be useful
@ -226,8 +229,8 @@ namespace LinkAll.Attributes {
// we ensure that we can create the type / call the code // we ensure that we can create the type / call the code
Assert.True (SecurityDeclarationDecoratedUserCode.Check (), "call"); Assert.True (SecurityDeclarationDecoratedUserCode.Check (), "call");
// we ensure that both the permission and the flag are NOT part of the final/linked binary (link all removes security declarations) // we ensure that both the permission and the flag are NOT part of the final/linked binary (link all removes security declarations)
Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAttribute, mscorlib"), "FileIOPermissionAttribute"); Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAttribute, " + mscorlib), "FileIOPermissionAttribute");
Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAccess, mscorlib"), "FileIOPermissionAccess"); Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAccess, " + mscorlib), "FileIOPermissionAccess");
} }
} }
} }

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

@ -192,10 +192,10 @@ namespace LinkAll {
{ {
#if !__WATCHOS__ #if !__WATCHOS__
// for (future) nunit[lite] platform detection - if this test fails then platform detection won't work // for (future) nunit[lite] platform detection - if this test fails then platform detection won't work
Assert.NotNull (Type.GetType (NamespacePrefix + "UIKit.UIApplicationDelegate, " + AssemblyName), "UIApplicationDelegate"); Assert.NotNull (Helper.GetType (NamespacePrefix + "UIKit.UIApplicationDelegate, " + AssemblyName), "UIApplicationDelegate");
#endif #endif
// and you can trust the old trick with the linker // and you can trust the old trick with the linker
Assert.NotNull (Type.GetType ("Mono.Runtime"), "Mono.Runtime"); Assert.NotNull (Helper.GetType ("Mono.Runtime"), "Mono.Runtime");
} }
[Test] [Test]
@ -220,16 +220,16 @@ namespace LinkAll {
// since we're linking the attributes will NOT be available - even if they are used // since we're linking the attributes will NOT be available - even if they are used
#if !XAMCORE_3_0 #if !XAMCORE_3_0
Assert.Null (Type.GetType (prefix + "ObjCRuntime.AvailabilityAttribute, " + suffix), "AvailabilityAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.AvailabilityAttribute, " + suffix), "AvailabilityAttribute");
Assert.Null (Type.GetType (prefix + "ObjCRuntime.iOSAttribute, " + suffix), "AvailabilityAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.iOSAttribute, " + suffix), "AvailabilityAttribute");
Assert.Null (Type.GetType (prefix + "ObjCRuntime.AvailabilityAttribute, " + suffix), "AvailabilityAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.AvailabilityAttribute, " + suffix), "AvailabilityAttribute");
Assert.Null (Type.GetType (prefix + "ObjCRuntime.SinceAttribute, " + suffix), "SinceAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.SinceAttribute, " + suffix), "SinceAttribute");
#endif #endif
Assert.Null (Type.GetType (prefix + "ObjCRuntime.IntroducedAttribute, " + suffix), "IntroducedAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.IntroducedAttribute, " + suffix), "IntroducedAttribute");
Assert.Null (Type.GetType (prefix + "ObjCRuntime.DeprecatedAttribute, " + suffix), "DeprecatedAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.DeprecatedAttribute, " + suffix), "DeprecatedAttribute");
Assert.Null (Type.GetType (prefix + "ObjCRuntime.ObsoletedAttribute, " + suffix), "ObsoletedAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.ObsoletedAttribute, " + suffix), "ObsoletedAttribute");
Assert.Null (Type.GetType (prefix + "ObjCRuntime.UnavailableAttribute, " + suffix), "UnavailableAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.UnavailableAttribute, " + suffix), "UnavailableAttribute");
Assert.Null (Type.GetType (prefix + "ObjCRuntime.ThreadSafeAttribute, " + suffix), "ThreadSafeAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.ThreadSafeAttribute, " + suffix), "ThreadSafeAttribute");
} }
[Test] [Test]
@ -419,14 +419,14 @@ namespace LinkAll {
// Compiler optimization (roslyn release) can remove the variable, which removes OpenTK-1.dll from the app and fail the test // Compiler optimization (roslyn release) can remove the variable, which removes OpenTK-1.dll from the app and fail the test
Assert.That (state, Is.EqualTo (OpenTK.WindowState.Normal), "normal"); Assert.That (state, Is.EqualTo (OpenTK.WindowState.Normal), "normal");
var gl = Type.GetType ("OpenTK.Graphics.ES11.GL, OpenTK-1.0", false); var gl = Helper.GetType ("OpenTK.Graphics.ES11.GL, OpenTK-1.0", false);
Assert.NotNull (gl, "ES11/GL"); Assert.NotNull (gl, "ES11/GL");
var core = Type.GetType ("OpenTK.Graphics.ES11.GL/Core, OpenTK-1.0", false); var core = Helper.GetType ("OpenTK.Graphics.ES11.GL/Core, OpenTK-1.0", false);
Assert.NotNull (core, "ES11/Core"); Assert.NotNull (core, "ES11/Core");
gl = Type.GetType ("OpenTK.Graphics.ES20.GL, OpenTK-1.0", false); gl = Helper.GetType ("OpenTK.Graphics.ES20.GL, OpenTK-1.0", false);
Assert.NotNull (gl, "ES20/GL"); Assert.NotNull (gl, "ES20/GL");
core = Type.GetType ("OpenTK.Graphics.ES20.GL/Core, OpenTK-1.0", false); core = Helper.GetType ("OpenTK.Graphics.ES20.GL/Core, OpenTK-1.0", false);
Assert.NotNull (core, "ES20/Core"); Assert.NotNull (core, "ES20/Core");
} }
#endif // !__WATCHOS__ #endif // !__WATCHOS__
@ -435,7 +435,7 @@ namespace LinkAll {
public void NestedNSObject () public void NestedNSObject ()
{ {
// Parent type is not used - but it's not linked out // Parent type is not used - but it's not linked out
var p = Type.GetType ("LinkAll.Parent"); var p = Helper.GetType ("LinkAll.Parent");
Assert.NotNull (p, "Parent"); Assert.NotNull (p, "Parent");
// because a nested type is a subclass of NSObject (and not part of monotouch.dll) // because a nested type is a subclass of NSObject (and not part of monotouch.dll)
var n = p.GetNestedType ("Derived"); var n = p.GetNestedType ("Derived");
@ -539,7 +539,7 @@ namespace LinkAll {
{ {
// make test work for classic (monotouch) and unified (iOS, tvOS and watchOS) // make test work for classic (monotouch) and unified (iOS, tvOS and watchOS)
var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.AppleTlsProvider"); var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.AppleTlsProvider");
Assert.Null (Type.GetType (fqn), "Should NOT be included (no SslStream or Socket support)"); Assert.Null (Helper.GetType (fqn), "Should NOT be included (no SslStream or Socket support)");
} }
[Test] [Test]
@ -548,7 +548,7 @@ namespace LinkAll {
{ {
// this test works only because "Link all" does not use WebKit // this test works only because "Link all" does not use WebKit
var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Foundation.NSProxy"); var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Foundation.NSProxy");
Assert.Null (Type.GetType (fqn), fqn); Assert.Null (Helper.GetType (fqn), fqn);
} }
static Type type_Task = typeof (Task); static Type type_Task = typeof (Task);

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

@ -16,6 +16,22 @@ using MonoTouch.Foundation;
#endif #endif
using NUnit.Framework; using NUnit.Framework;
namespace LinkAll
{
static class Helper
{
public static Type GetType (string name)
{
return Type.GetType (name);
}
public static Type GetType (string typeName, bool throwOnError)
{
return Type.GetType (typeName, throwOnError);
}
}
}
namespace LinkAll.Serialization { namespace LinkAll.Serialization {
[Serializable] [Serializable]
@ -75,7 +91,7 @@ namespace LinkAll.Serialization {
public void UnusedType () public void UnusedType ()
{ {
// the serialization attributes only keeps the method(s) if the type was used // the serialization attributes only keeps the method(s) if the type was used
var t = Type.GetType ("LinkAll.Serialization.Unused"); var t = Helper.GetType ("LinkAll.Serialization.Unused");
// since it's not used in the app then it's removed by the linker // since it's not used in the app then it's removed by the linker
Assert.Null (t, "type"); Assert.Null (t, "type");
} }
@ -84,7 +100,7 @@ namespace LinkAll.Serialization {
public void UsedType () public void UsedType ()
{ {
// the serialization attributes only keeps the method(s) if the type was used // the serialization attributes only keeps the method(s) if the type was used
var t = Type.GetType ("LinkAll.Serialization.Used"); var t = Helper.GetType ("LinkAll.Serialization.Used");
// since it's used here... // since it's used here...
Assert.NotNull (new Used (), "reference"); Assert.NotNull (new Used (), "reference");
// it's not removed by the linker // it's not removed by the linker

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

@ -436,14 +436,14 @@ namespace LinkSdk {
#else #else
const string OpenTKAssembly = "OpenTK"; const string OpenTKAssembly = "OpenTK";
#endif #endif
var gl = Type.GetType ("OpenTK.Graphics.ES11.GL, " + OpenTKAssembly, false); var gl = GetTypeHelper ("OpenTK.Graphics.ES11.GL, " + OpenTKAssembly, false);
Assert.NotNull (gl, "ES11/GL"); Assert.NotNull (gl, "ES11/GL");
var core = Type.GetType ("OpenTK.Graphics.ES11.GL/Core, " + OpenTKAssembly, false); var core = GetTypeHelper ("OpenTK.Graphics.ES11.GL/Core, " + OpenTKAssembly, false);
Assert.NotNull (core, "ES11/Core"); Assert.NotNull (core, "ES11/Core");
gl = Type.GetType ("OpenTK.Graphics.ES20.GL, " + OpenTKAssembly, false); gl = GetTypeHelper ("OpenTK.Graphics.ES20.GL, " + OpenTKAssembly, false);
Assert.NotNull (gl, "ES20/GL"); Assert.NotNull (gl, "ES20/GL");
core = Type.GetType ("OpenTK.Graphics.ES20.GL/Core, " + OpenTKAssembly, false); core = GetTypeHelper ("OpenTK.Graphics.ES20.GL/Core, " + OpenTKAssembly, false);
Assert.NotNull (core, "ES20/Core"); Assert.NotNull (core, "ES20/Core");
} }
#endif // !__WATCHOS__ #endif // !__WATCHOS__
@ -773,7 +773,7 @@ namespace LinkSdk {
public void Pointer_5200 () public void Pointer_5200 ()
{ {
// ensure the linker did not remove the type, which is used by the runtime // ensure the linker did not remove the type, which is used by the runtime
Assert.NotNull (Type.GetType ("System.Reflection.Pointer, mscorlib")); Assert.NotNull (GetTypeHelper ("System.Reflection.Pointer, mscorlib"));
} }
[Test] [Test]
@ -1065,8 +1065,8 @@ namespace LinkSdk {
// we ensure that we can create the type / call the code // we ensure that we can create the type / call the code
Assert.True (SecurityDeclarationDecoratedUserCode.Check (), "call"); Assert.True (SecurityDeclarationDecoratedUserCode.Check (), "call");
// we ensure that both the permission and the flag are NOT part of the final/linked binary (link removes security declarations) // we ensure that both the permission and the flag are NOT part of the final/linked binary (link removes security declarations)
Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAttribute, mscorlib"), "FileIOPermissionAttribute"); Assert.Null (GetTypeHelper ("System.Security.Permissions.FileIOPermissionAttribute, mscorlib"), "FileIOPermissionAttribute");
Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAccess, mscorlib"), "FileIOPermissionAccess"); Assert.Null (GetTypeHelper ("System.Security.Permissions.FileIOPermissionAccess, mscorlib"), "FileIOPermissionAccess");
} }
#if !__WATCHOS__ #if !__WATCHOS__
@ -1094,7 +1094,7 @@ namespace LinkSdk {
[Test] [Test]
public void MonoRuntime34671 () public void MonoRuntime34671 ()
{ {
Assert.NotNull (Type.GetType ("Mono.Runtime"), "Mono.Runtime"); Assert.NotNull (GetTypeHelper ("Mono.Runtime"), "Mono.Runtime");
} }
[Test] [Test]
@ -1119,7 +1119,7 @@ namespace LinkSdk {
{ {
// make test work for classic (monotouch) and unified (iOS, tvOS and watchOS) // make test work for classic (monotouch) and unified (iOS, tvOS and watchOS)
var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.OldTlsProvider"); var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.OldTlsProvider");
Assert.Null (Type.GetType (fqn), "Should not be included"); Assert.Null (GetTypeHelper (fqn), "Should not be included");
} }
[Test] [Test]
@ -1127,7 +1127,7 @@ namespace LinkSdk {
{ {
// make test work for classic (monotouch) and unified (iOS, tvOS and watchOS) // make test work for classic (monotouch) and unified (iOS, tvOS and watchOS)
var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.AppleTlsProvider"); var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.AppleTlsProvider");
Assert.Null (Type.GetType (fqn), "Should be included"); Assert.Null (GetTypeHelper (fqn), "Should be included");
} }
[Test] [Test]
@ -1138,7 +1138,18 @@ namespace LinkSdk {
var t = typeof (WKWebView); var t = typeof (WKWebView);
Assert.NotNull (t, "avoid compiler optimization of unused variable"); Assert.NotNull (t, "avoid compiler optimization of unused variable");
var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Foundation.NSProxy"); var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Foundation.NSProxy");
Assert.NotNull (Type.GetType (fqn), fqn); Assert.NotNull (GetTypeHelper (fqn), fqn);
}
// Fools linker not to keep the type by using it in test check
static Type GetTypeHelper (string name)
{
return Type.GetType (name);
}
static Type GetTypeHelper (string name, bool throwOnError)
{
return Type.GetType (name, throwOnError);
} }
} }
} }

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

@ -31,9 +31,12 @@ namespace Xamarin.Mac.Linker.Test {
} }
} }
static string linker_removed_type = "MonoMac.CoreImage.CIColor, XamMac";
public static void EnsureLinker (bool enabled) public static void EnsureLinker (bool enabled)
{ {
if ((Type.GetType ("MonoMac.CoreImage.CIColor, XamMac") != null) == enabled) {
if ((Type.GetType (linker_removed_type) != null) == enabled) {
Log.WriteLine ("[FAIL]\tThe linker was {0}enabled on this build", enabled ? "not " : String.Empty); Log.WriteLine ("[FAIL]\tThe linker was {0}enabled on this build", enabled ? "not " : String.Empty);
} }
} }

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

@ -18,6 +18,7 @@ namespace Xamarin.Mac.Linker.Test {
} }
class TypeDescriptorTest { class TypeDescriptorTest {
static string typeToCheck = "Xamarin.Mac.Linker.Test.CustomConverter";
static void Check (string typeName) static void Check (string typeName)
{ {
@ -57,7 +58,7 @@ namespace Xamarin.Mac.Linker.Test {
Check ("System.ComponentModel.CollectionConverter"); Check ("System.ComponentModel.CollectionConverter");
Check ("System.ComponentModel.EnumConverter"); Check ("System.ComponentModel.EnumConverter");
var t = Type.GetType ("Xamarin.Mac.Linker.Test.CustomConverter", false); var t = Type.GetType (typeToCheck, false);
Test.Log.WriteLine ("{0}\tXamarin.Mac.Linker.Test.CustomConverter", t == null ? "[PASS]" : "[FAIL]"); Test.Log.WriteLine ("{0}\tXamarin.Mac.Linker.Test.CustomConverter", t == null ? "[PASS]" : "[FAIL]");
Test.Terminate (); Test.Terminate ();

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

@ -85,6 +85,9 @@ namespace MonoTouchFixtures.ObjCRuntime {
Assert.AreEqual ("Can't register the class System.String when the dynamic registrar has been linked away.", e.Message, "exc message"); Assert.AreEqual ("Can't register the class System.String when the dynamic registrar has been linked away.", e.Message, "exc message");
} }
} }
Assert.AreEqual (IntPtr.Zero, Class.GetHandle (typeof (NSObject).MakeByRefType ()), "NSObject&");
Assert.AreEqual (IntPtr.Zero, Class.GetHandle (typeof (NSObject).MakeArrayType ()), "NSObject[]");
Assert.AreEqual (IntPtr.Zero, Class.GetHandle (typeof (NSObject).MakePointerType ()), "NSObject*");
} }
[Test] [Test]

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

@ -2087,7 +2087,7 @@ namespace MonoTouchFixtures.ObjCRuntime {
ptr = Messaging.IntPtr_objc_msgSend (Class.GetHandle (typeof (D2)), Selector.GetHandle ("alloc")); ptr = Messaging.IntPtr_objc_msgSend (Class.GetHandle (typeof (D2)), Selector.GetHandle ("alloc"));
ptr = Messaging.IntPtr_objc_msgSend (ptr, Selector.GetHandle ("init")); ptr = Messaging.IntPtr_objc_msgSend (ptr, Selector.GetHandle ("init"));
// Failed to marshal the Objective-C object 0x7adf5920 (type: AppDelegate_D2). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance (because the type 'AppDelegate+D2' does not have a constructor that takes one IntPtr argument). // Failed to marshal the Objective-C object 0x7adf5920 (type: AppDelegate_D2). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance (because the type 'AppDelegate+D2' does not have a constructor that takes one IntPtr argument).
Assert.Throws<Exception> (() => Runtime.GetNSObject<D2> (ptr), "c"); Assert.Throws<RuntimeException> (() => Runtime.GetNSObject<D2> (ptr), "c");
} finally { } finally {
Messaging.void_objc_msgSend (ptr, Selector.GetHandle ("release")); Messaging.void_objc_msgSend (ptr, Selector.GetHandle ("release"));
} }
@ -2532,6 +2532,28 @@ namespace MonoTouchFixtures.ObjCRuntime {
using (var obj = new NullOutParameters ()) using (var obj = new NullOutParameters ())
obj.Invoke_V_null_out (); obj.Invoke_V_null_out ();
} }
[Test]
public unsafe void ByrefParameter ()
{
using (var obj = new ByrefParameterTest ()) {
using (var param = new NSObject ()) {
// We want an instance of an NSObject subclass that doesn't have a managed wrapper, so we create a native NSString handle.
IntPtr handle = NSString.CreateNative ("ByrefParameter");
Messaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle ("doSomething:"), new IntPtr (&handle));
NSString.ReleaseNative (handle);
}
}
}
class ByrefParameterTest : NSObject {
[Export ("doSomething:")]
public void DoSomething (ref NSString str)
{
Assert.IsNotNull (str, "NonNull NSString&");
Assert.AreEqual ("ByrefParameter", str.ToString ());
}
}
} }
#if !__WATCHOS__ #if !__WATCHOS__

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

@ -591,5 +591,55 @@ namespace MonoTouchFixtures.ObjCRuntime {
Assert.AreEqual (0, brokenCount, "broken count"); Assert.AreEqual (0, brokenCount, "broken count");
} }
[Test]
public void MX8027 ()
{
var handle = Messaging.IntPtr_objc_msgSend (Messaging.IntPtr_objc_msgSend (Class.GetHandle (typeof (Dummy)), Selector.GetHandle ("alloc")), Selector.GetHandle ("init"));
try {
try {
Messaging.void_objc_msgSend_IntPtr (Class.GetHandle (typeof (Dummy)), Selector.GetHandle ("doSomethingElse:"), handle);
Assert.Fail ("Expected an MX8027 exception (A)");
} catch (RuntimeException mex) {
Assert.AreEqual (8027, mex.Code, "Exception code (A)");
Assert.That (mex.Message, Is.StringContaining ("Failed to marshal the Objective-C object"), "Failed to marshal (A)");
Assert.That (mex.Message, Is.StringContaining ("Additional information:"), "Additional information: (A)");
Assert.That (mex.Message, Is.StringContaining ("Selector: doSomethingElse:"), "Selector (A)");
Assert.That (mex.Message, Is.StringContaining ("DoSomethingElse"), "DoSomethingElse (A)");
}
try {
Messaging.void_objc_msgSend_IntPtr (handle, Selector.GetHandle ("doSomething:"), handle);
Assert.Fail ("Expected an MX8027 exception (B)");
} catch (RuntimeException mex) {
Assert.AreEqual (8027, mex.Code, "Exception code (B)");
Assert.That (mex.Message, Is.StringContaining ("Failed to marshal the Objective-C object"), "Failed to marshal (B)");
Assert.That (mex.Message, Is.StringContaining ("Additional information:"), "Additional information: (B)");
Assert.That (mex.Message, Is.StringContaining ("Selector: doSomething:"), "Selector (B)");
Assert.That (mex.Message, Is.StringContaining ("DoSomething"), "DoSomething (B)");
}
} finally {
Messaging.void_objc_msgSend (handle, Selector.GetHandle ("release"));
}
}
// does not have an IntPtr constructor
class Dummy : NSObject {
[Export ("initWithFoo:")]
public Dummy (int foo)
{
// Prevent the default ctor from being exported.
}
[Export ("doSomething:")]
public void DoSomething (Dummy dummy)
{
}
[Export ("doSomethingElse:")]
public static void DoSomethingElse (Dummy dummy)
{
}
}
} }
} }

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

@ -167,6 +167,11 @@ typedef unsigned int (^RegistrarTestBlock) (unsigned int magic);
+(void) callRequiredStaticCallback; +(void) callRequiredStaticCallback;
-(void) callOptionalCallback; -(void) callOptionalCallback;
+(void) callOptionalStaticCallback; +(void) callOptionalStaticCallback;
typedef void (^innerBlock) (int magic_number);
typedef void (^outerBlock) (innerBlock callback);
+(void) callAssertMainThreadBlockRelease: (outerBlock) completionHandler;
-(void) callAssertMainThreadBlockReleaseCallback;
-(void) assertMainThreadBlockReleaseCallback: (innerBlock) completionHandler;
-(void) testFreedBlocks; -(void) testFreedBlocks;
+(int) freedBlockCount; +(int) freedBlockCount;
@ -183,6 +188,12 @@ typedef unsigned int (^RegistrarTestBlock) (unsigned int magic);
-(void) dealloc; -(void) dealloc;
@end @end
// This object asserts that its dealloc function is called on the main thread
@interface MainThreadDeallocator : NSObject {
}
-(void) dealloc;
@end
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif

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

@ -599,6 +599,45 @@ static Class _TestClass = NULL;
assert (called); assert (called);
} }
+(void) callAssertMainThreadBlockRelease: (outerBlock) completionHandler
{
MainThreadDeallocator *obj = [[MainThreadDeallocator alloc] init];
__block bool success = false;
dispatch_sync (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^{
completionHandler (^(int magic_number)
{
assert (magic_number == 42);
assert ([NSThread isMainThread]); // This may crash way after the failed test has finished executing.
success = obj != NULL; // this captures the 'obj', and it's only freed when the block is freed.
});
});
assert (success);
[obj release];
}
-(void) callAssertMainThreadBlockReleaseCallback
{
MainThreadDeallocator *obj = [[MainThreadDeallocator alloc] init];
__block bool success = false;
dispatch_sync (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^{
[self assertMainThreadBlockReleaseCallback: ^(int magic_number)
{
assert (magic_number == 42);
assert ([NSThread isMainThread]); // This may crash way after the failed test has finished executing.
success = obj != NULL; // this captures the 'obj', and it's only freed when the block is freed.
}];
});
assert (success);
[obj release];
}
-(void) assertMainThreadBlockReleaseCallback: (innerBlock) completionHandler
{
assert (!"THIS FUNCTION SHOULD BE OVERRIDDEN");
}
-(void) testFreedBlocks -(void) testFreedBlocks
{ {
FreedNotifier* obj = [[FreedNotifier alloc] init]; FreedNotifier* obj = [[FreedNotifier alloc] init];
@ -634,4 +673,13 @@ static Class _TestClass = NULL;
} }
@end @end
@implementation MainThreadDeallocator : NSObject {
}
-(void) dealloc
{
assert ([NSThread isMainThread]);
[super dealloc];
}
@end
#include "libtest.decompile.m" #include "libtest.decompile.m"

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

@ -6,6 +6,7 @@
#define ObjCBlockTester object_ObjCBlockTester #define ObjCBlockTester object_ObjCBlockTester
#define FreedNotifier object_FreedNotifier #define FreedNotifier object_FreedNotifier
#define EvilDeallocator object_EvilDeallocator #define EvilDeallocator object_EvilDeallocator
#define MainThreadDeallocator object_MainThreadDeallocator
#define FakeType2 object_FakeType2 #define FakeType2 object_FakeType2
#define UltimateMachine object_UltimateMachine #define UltimateMachine object_UltimateMachine
#define FrameworkTest object_FrameworkTest #define FrameworkTest object_FrameworkTest
@ -73,6 +74,7 @@
#define ObjCBlockTester ar_ObjCBlockTester #define ObjCBlockTester ar_ObjCBlockTester
#define FreedNotifier ar_FreedNotifier #define FreedNotifier ar_FreedNotifier
#define EvilDeallocator ar_EvilDeallocator #define EvilDeallocator ar_EvilDeallocator
#define MainThreadDeallocator ar_MainThreadDeallocator
#define FakeType2 ar_FakeType2 #define FakeType2 ar_FakeType2
#define UltimateMachine ar_UltimateMachine #define UltimateMachine ar_UltimateMachine
#define FrameworkTest ar_FrameworkTest #define FrameworkTest ar_FrameworkTest

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

@ -1,5 +1,4 @@
!unknown-pinvoke! _Block_copy bound !unknown-pinvoke! _Block_copy bound
!unknown-pinvoke! _Block_release bound
!unknown-pinvoke! class_addIvar bound !unknown-pinvoke! class_addIvar bound
!unknown-pinvoke! class_addMethod bound !unknown-pinvoke! class_addMethod bound
!unknown-pinvoke! class_addProperty bound !unknown-pinvoke! class_addProperty bound

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

@ -12,10 +12,9 @@ endif
APIDIFF_DIR=. APIDIFF_DIR=.
MONO_API_HTML_DIR = $(MONO_PATH)/mcs/tools/mono-api-html MONO_API_INFO = $(MONO_PATH)/mcs/class/lib/build/mono-api-info.exe
MONO_API_INFO_DIR = $(MONO_PATH)/mcs/tools/corcompare MONO_API_HTML = $(MONO_PATH)/mcs/class/lib/build/mono-api-html.exe
MONO_API_INFO = $(MONO_API_INFO_DIR)/bin/Debug/mono-api-info.exe MONO_BUILD = MONO_PATH=$(MONO_PATH)/mcs/class/lib/build $(TOP)/builds/tools64/mono/mini/mono
MONO_API_HTML = $(TOP)/external/macios-binaries/mono-api-html.exe
# I18N are excluded - but otherwise if should be like ../../builds/Makefile + what XI adds # I18N are excluded - but otherwise if should be like ../../builds/Makefile + what XI adds
# in the order to the api-diff.html merged file # in the order to the api-diff.html merged file
@ -50,21 +49,21 @@ MAC_ARCH_ASSEMBLIES = native-32/Xamarin.Mac native-64/Xamarin.Mac
# create api info. Directory hierarchy is based on installed hierarchy # create api info. Directory hierarchy is based on installed hierarchy
# (XM goes into temp/xm, and XI goes into temp/xi) # (XM goes into temp/xm, and XI goes into temp/xi)
$(APIDIFF_DIR)/temp/xi/%.xml: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/%.dll $(MONO_API_INFO) $(APIDIFF_DIR)/temp/xi/%.xml: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/%.dll
$(Q) mkdir -p $(dir $@) $(Q) mkdir -p $(dir $@)
$(QF_GEN) mono --debug $(MONO_API_INFO) $< -o $@ $(QF_GEN) $(MONO_BUILD) --debug $(MONO_API_INFO) $< -o $@
$(APIDIFF_DIR)/temp/xm/%.xml: $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/%.dll $(MONO_API_INFO) $(APIDIFF_DIR)/temp/xm/%.xml: $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/%.dll
$(Q) mkdir -p $(dir $@) $(Q) mkdir -p $(dir $@)
$(QF_GEN) mono --debug $(MONO_API_INFO) $< -o $@ $(QF_GEN) $(MONO_BUILD) --debug $(MONO_API_INFO) -d $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5 $< -o $@
$(APIDIFF_DIR)/temp/native-%/Xamarin.Mac.xml: $(TOP)/src/build/mac/mobile-%/Xamarin.Mac.dll $(MONO_API_INFO) $(APIDIFF_DIR)/temp/native-%/Xamarin.Mac.xml: $(TOP)/src/build/mac/mobile-%/Xamarin.Mac.dll
$(Q) mkdir -p $(dir $@) $(Q) mkdir -p $(dir $@)
$(QF_GEN) mono --debug $(MONO_API_INFO) $< -o $@ $(QF_GEN) $(MONO_BUILD) --debug $(MONO_API_INFO) -d $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac $< -o $@
$(APIDIFF_DIR)/temp/native-%/Xamarin.iOS.xml: $(TOP)/src/build/ios/native-%/Xamarin.iOS.dll $(MONO_API_INFO) $(APIDIFF_DIR)/temp/native-%/Xamarin.iOS.xml: $(TOP)/src/build/ios/native-%/Xamarin.iOS.dll
$(Q) mkdir -p $(dir $@) $(Q) mkdir -p $(dir $@)
$(QF_GEN) mono --debug $(MONO_API_INFO) $< -o $@ $(QF_GEN) $(MONO_BUILD) --debug $(MONO_API_INFO) $< -o $@
# create diff from api info and reference info # create diff from api info and reference info
# note that we create an empty file (the 'touch' command) # note that we create an empty file (the 'touch' command)
@ -72,24 +71,16 @@ $(APIDIFF_DIR)/temp/native-%/Xamarin.iOS.xml: $(TOP)/src/build/ios/native-%/Xama
# to run mono-api-html every time even if none of the # to run mono-api-html every time even if none of the
# dependencies changed) # dependencies changed)
$(APIDIFF_DIR)/diff/%.html: $(APIDIFF_DIR)/temp/%.xml $(APIDIFF_DIR)/references/%.xml $(MONO_API_HTML) $(APIDIFF_DIR)/diff/%.html: $(APIDIFF_DIR)/temp/%.xml $(APIDIFF_DIR)/references/%.xml
$(Q) mkdir -p $(dir $@) $(Q) mkdir -p $(dir $@)
$(QF_GEN) mono --debug $(MONO_API_HTML) $(NEW_REGEX) $(ADD_REGEX) $(APIDIFF_DIR)/references/$*.xml $(APIDIFF_DIR)/temp/$*.xml -i 'INSObjectProtocol' $@ $(QF_GEN) $(MONO_BUILD) --debug $(MONO_API_HTML) $(NEW_REGEX) $(ADD_REGEX) $(APIDIFF_DIR)/references/$*.xml $(APIDIFF_DIR)/temp/$*.xml -i 'INSObjectProtocol' $@
$(Q) touch $@ $(Q) touch $@
# this is a hack to show the difference between iOS and tvOS # this is a hack to show the difference between iOS and tvOS
$(APIDIFF_DIR)/diff/ios-to-tvos.html: $(APIDIFF_DIR)/temp/xi/Xamarin.iOS/Xamarin.iOS.xml $(APIDIFF_DIR)/temp/xi/Xamarin.TVOS/Xamarin.TVOS.xml $(APIDIFF_DIR)/diff/ios-to-tvos.html: $(APIDIFF_DIR)/temp/xi/Xamarin.iOS/Xamarin.iOS.xml $(APIDIFF_DIR)/temp/xi/Xamarin.TVOS/Xamarin.TVOS.xml
$(Q) mkdir -p $(dir $@) $(Q) mkdir -p $(dir $@)
$(Q) sed -e 's_<assembly name="Xamarin.TVOS" version="0.0.0.0">_<assembly name="Xamarin.iOS" version="0.0.0.0">_' $(APIDIFF_DIR)/temp/xi/Xamarin.TVOS/Xamarin.TVOS.xml > $(APIDIFF_DIR)/temp/Xamarin.TVOS-as-iOS.xml $(Q) sed -e 's_<assembly name="Xamarin.TVOS" version="0.0.0.0">_<assembly name="Xamarin.iOS" version="0.0.0.0">_' $(APIDIFF_DIR)/temp/xi/Xamarin.TVOS/Xamarin.TVOS.xml > $(APIDIFF_DIR)/temp/Xamarin.TVOS-as-iOS.xml
$(QF_GEN) mono --debug $(MONO_API_HTML) $< $(APIDIFF_DIR)/temp/Xamarin.TVOS-as-iOS.xml $@ $(QF_GEN) $(MONO_BUILD) --debug $(MONO_API_HTML) $< $(APIDIFF_DIR)/temp/Xamarin.TVOS-as-iOS.xml $@
# our api-info and api-html binaries
$(MONO_API_HTML): $(wildcard $(MONO_API_HTML_DIR)/*.*)
$(Q_GEN) cd $(MONO_API_HTML_DIR) && $(SYSTEM_MSBUILD) mono-api-html.csproj $(MSBUILD_VERBOSITY)
$(MONO_API_INFO): $(wildcard $(MONO_API_INFO_DIR)/*.*)
$(Q_GEN) cd $(MONO_API_INFO_DIR) && $(SYSTEM_MSBUILD) mono-api-info.csproj $(MSBUILD_VERBOSITY)
# create diff files for all the assemblies per platform # create diff files for all the assemblies per platform
@ -252,7 +243,7 @@ macos-markdown: ; @true
endif endif
$(APIDIFF_DIR)/diff/%.md: $(APIDIFF_DIR)/temp/%.xml $(APIDIFF_DIR)/references/%.xml $(MONO_API_HTML) $(APIDIFF_DIR)/diff/%.md: $(APIDIFF_DIR)/temp/%.xml $(APIDIFF_DIR)/references/%.xml $(MONO_API_HTML)
$(QF_GEN) mono --debug $(MONO_API_HTML) $(NEW_REGEX) $(ADD_REGEX) $(APIDIFF_DIR)/references/$*.xml $(APIDIFF_DIR)/temp/$*.xml -i 'INSObjectProtocol' --md $@ $(QF_GEN) $(MONO_BUILD) --debug $(MONO_API_HTML) $(NEW_REGEX) $(ADD_REGEX) $(APIDIFF_DIR)/references/$*.xml $(APIDIFF_DIR)/temp/$*.xml -i 'INSObjectProtocol' --md $@
wrench-api-diff: wrench-api-diff:
@echo "@MonkeyWrench: AddDirectory: $(CURDIR)/diff/xi/Xamarin.iOS" @echo "@MonkeyWrench: AddDirectory: $(CURDIR)/diff/xi/Xamarin.iOS"

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

@ -3596,7 +3596,7 @@ namespace Registrar {
setup_call_stack.AppendLine ("if (nsobj{0}) {{", i); setup_call_stack.AppendLine ("if (nsobj{0}) {{", i);
body_setup.AppendLine ("MonoType *paramtype{0} = NULL;", i); body_setup.AppendLine ("MonoType *paramtype{0} = NULL;", i);
setup_call_stack.AppendLine ("paramtype{0} = xamarin_get_parameter_type (managed_method, {0});", i); setup_call_stack.AppendLine ("paramtype{0} = xamarin_get_parameter_type (managed_method, {0});", i);
setup_call_stack.AppendLine ("mobj{0} = xamarin_get_nsobject_with_type_for_ptr (nsobj{0}, false, paramtype{0}, &exception_gchandle);", i); setup_call_stack.AppendLine ("mobj{0} = xamarin_get_nsobject_with_type_for_ptr (nsobj{0}, false, paramtype{0}, _cmd, managed_method, &exception_gchandle);", i);
setup_call_stack.AppendLine ("if (exception_gchandle != 0) goto exception_handling;"); setup_call_stack.AppendLine ("if (exception_gchandle != 0) goto exception_handling;");
if (App.EnableDebug) { if (App.EnableDebug) {
setup_call_stack.AppendLine ("xamarin_verify_parameter (mobj{0}, _cmd, self, nsobj{0}, {0}, mono_class_from_mono_type (paramtype{0}), managed_method);", i); setup_call_stack.AppendLine ("xamarin_verify_parameter (mobj{0}, _cmd, self, nsobj{0}, {0}, mono_class_from_mono_type (paramtype{0}), managed_method);", i);
@ -3623,7 +3623,7 @@ namespace Registrar {
setup_call_stack.AppendLine ("if (nsobj{0}) {{", i); setup_call_stack.AppendLine ("if (nsobj{0}) {{", i);
body_setup.AppendLine ("MonoType *paramtype{0} = NULL;", i); body_setup.AppendLine ("MonoType *paramtype{0} = NULL;", i);
setup_call_stack.AppendLine ("paramtype{0} = xamarin_get_parameter_type (managed_method, {0});", i); setup_call_stack.AppendLine ("paramtype{0} = xamarin_get_parameter_type (managed_method, {0});", i);
setup_call_stack.AppendLine ("mobj{0} = xamarin_get_nsobject_with_type_for_ptr_created (nsobj{0}, false, paramtype{0}, &created{0}, &exception_gchandle);", i); setup_call_stack.AppendLine ("mobj{0} = xamarin_get_nsobject_with_type_for_ptr_created (nsobj{0}, false, paramtype{0}, &created{0}, _cmd, managed_method, &exception_gchandle);", i);
setup_call_stack.AppendLine ("if (exception_gchandle != 0) goto exception_handling;"); setup_call_stack.AppendLine ("if (exception_gchandle != 0) goto exception_handling;");
if (App.EnableDebug) { if (App.EnableDebug) {
setup_call_stack.AppendLine ("xamarin_verify_parameter (mobj{0}, _cmd, self, nsobj{0}, {0}, mono_class_from_mono_type (paramtype{0}), managed_method);", i); setup_call_stack.AppendLine ("xamarin_verify_parameter (mobj{0}, _cmd, self, nsobj{0}, {0}, mono_class_from_mono_type (paramtype{0}), managed_method);", i);

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

@ -23,6 +23,7 @@ linker_sources = \
$(LINKER_DIR)/Linker/Pipeline.cs \ $(LINKER_DIR)/Linker/Pipeline.cs \
$(LINKER_DIR)/Linker/AssemblyResolver.cs \ $(LINKER_DIR)/Linker/AssemblyResolver.cs \
$(LINKER_DIR)/Linker/TypePreserve.cs \ $(LINKER_DIR)/Linker/TypePreserve.cs \
$(LINKER_DIR)/Linker/TypeNameParser.cs \
$(LINKER_DIR)/Linker/Annotations.cs \ $(LINKER_DIR)/Linker/Annotations.cs \
$(LINKER_DIR)/Linker/LinkContext.cs \ $(LINKER_DIR)/Linker/LinkContext.cs \
$(LINKER_DIR)/Linker/ILogger.cs \ $(LINKER_DIR)/Linker/ILogger.cs \
@ -38,6 +39,7 @@ linker_sources = \
$(LINKER_DIR)/Linker/MarkingHelpers.cs \ $(LINKER_DIR)/Linker/MarkingHelpers.cs \
$(LINKER_DIR)/Linker/Tracer.cs \ $(LINKER_DIR)/Linker/Tracer.cs \
$(LINKER_DIR)/Linker/TypeReferenceExtensions.cs \ $(LINKER_DIR)/Linker/TypeReferenceExtensions.cs \
$(LINKER_DIR)/Linker/AssemblyUtilities.cs \
$(LINKER_DIR)/Linker.Steps/BaseStep.cs \ $(LINKER_DIR)/Linker.Steps/BaseStep.cs \
$(LINKER_DIR)/Linker.Steps/LoadReferencesStep.cs \ $(LINKER_DIR)/Linker.Steps/LoadReferencesStep.cs \
$(LINKER_DIR)/Linker.Steps/LoadI18nAssemblies.cs \ $(LINKER_DIR)/Linker.Steps/LoadI18nAssemblies.cs \
@ -147,8 +149,10 @@ LOCAL_MMP = \
Mono.Cecil.dll \ Mono.Cecil.dll \
Mono.Cecil.Mdb.dll \ Mono.Cecil.Mdb.dll \
mmp.exe: Makefile $(MONO_CECIL_DLL) $(MONO_CECIL_MDB_DLL) $(mmp_sources) config config_mobile Info.plist.tmpl Info-framework.plist.tmpl $(tuner_sources) $(linker_resources) mmp.exe: Makefile $(MONO_CECIL_DLL) $(MONO_CECIL_MDB_DLL) $(mmp_sources) config config_mobile Info.plist.tmpl Info-framework.plist.tmpl $(tuner_sources)
$(Q_CSC) $(SYSTEM_CSC) -unsafe -out:mmp.exe $(DEFINES) -r:$(MONO_CECIL_DLL) -r:$(MONO_CECIL_MDB_DLL) -r:Mono.Security.dll -resource:config -resource:config_mobile -resource:machine.4_5.config -resource:Info.plist.tmpl -resource:Info-framework.plist.tmpl $(tuner_sources) $(mmp_sources) -debug:portable -nologo -deterministic $(Q_CSC) $(SYSTEM_CSC) -unsafe -out:mmp.exe $(DEFINES) -r:$(MONO_CECIL_DLL) -r:$(MONO_CECIL_MDB_DLL) \
-noconfig -nostdlib -r:$(MONO_PATH)/external/binary-reference-assemblies/mono/Mono.Security.dll -r:$(MONO_PATH)/external/binary-reference-assemblies/v4.6.1/mscorlib.dll -r:$(MONO_PATH)/external/binary-reference-assemblies/v4.6.1/System.Xml.dll -r:$(MONO_PATH)/external/binary-reference-assemblies/v4.6.1/System.Core.dll -r:$(MONO_PATH)/external/binary-reference-assemblies/v4.6.1/System.dll \
-resource:config -resource:config_mobile -resource:machine.4_5.config -resource:Info.plist.tmpl -resource:Info-framework.plist.tmpl $(tuner_sources) $(mmp_sources) -debug:portable -nologo -deterministic
$(Q) cp $(MONO_CECIL_DLL) $(MONO_CECIL_MDB_DLL) . $(Q) cp $(MONO_CECIL_DLL) $(MONO_CECIL_MDB_DLL) .
Mono.Cecil.dll: $(MONO_CECIL_DLL) Mono.Cecil.dll: $(MONO_CECIL_DLL)

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

@ -25,4 +25,5 @@
<dllentry dll="__Internal" name="MoveMemory" target="mono_win32_compat_MoveMemory"/> <dllentry dll="__Internal" name="MoveMemory" target="mono_win32_compat_MoveMemory"/>
<dllentry dll="__Internal" name="ZeroMemory" target="mono_win32_compat_ZeroMemory"/> <dllentry dll="__Internal" name="ZeroMemory" target="mono_win32_compat_ZeroMemory"/>
</dllmap> </dllmap>
<dllmap dll="System.Native" target="__Internal"/>
</configuration> </configuration>

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

@ -11,4 +11,5 @@
<dllentry dll="__Internal" name="MoveMemory" target="mono_win32_compat_MoveMemory"/> <dllentry dll="__Internal" name="MoveMemory" target="mono_win32_compat_MoveMemory"/>
<dllentry dll="__Internal" name="ZeroMemory" target="mono_win32_compat_ZeroMemory"/> <dllentry dll="__Internal" name="ZeroMemory" target="mono_win32_compat_ZeroMemory"/>
</dllmap> </dllmap>
<dllmap dll="System.Native" target="__Internal"/>
</configuration> </configuration>

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

@ -104,7 +104,7 @@ namespace MonoMac.Tuner {
MarkMethods (GetType (system, "System.Net.Configuration.WebRequestModulesSection")); MarkMethods (GetType (system, "System.Net.Configuration.WebRequestModulesSection"));
MarkMethods (GetType (system, "System.Net.HttpRequestCreator")); MarkMethods (GetType (system, "System.Net.HttpRequestCreator"));
MarkMethods (GetType (system, "System.Net.FileWebRequestCreator")); MarkMethods (GetType (system, "System.Net.FileWebRequestCreator"));
MarkMethods (GetType (system, "System.Net.FtpRequestCreator")); MarkMethods (GetType (system, "System.Net.FtpWebRequestCreator"));
// types we cannot find (statiscally or using machine.config) // types we cannot find (statiscally or using machine.config)
MarkMethods (GetType (system, "System.ComponentModel.BooleanConverter")); MarkMethods (GetType (system, "System.ComponentModel.BooleanConverter"));

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

@ -128,7 +128,7 @@
<add prefix="http" type="System.Net.HttpRequestCreator, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <add prefix="http" type="System.Net.HttpRequestCreator, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add prefix="https" type="System.Net.HttpRequestCreator, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <add prefix="https" type="System.Net.HttpRequestCreator, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add prefix="file" type="System.Net.FileWebRequestCreator, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <add prefix="file" type="System.Net.FileWebRequestCreator, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add prefix="ftp" type="System.Net.FtpRequestCreator, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <add prefix="ftp" type="System.Net.FtpWebRequestCreator, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</webRequestModules> </webRequestModules>
<settings> <settings>
<ipv6 enabled="false"/> <ipv6 enabled="false"/>

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

@ -145,6 +145,12 @@
</Compile> </Compile>
<Compile Include="..\..\external\mono\external\linker\linker\Linker\TypePreserve.cs"> <Compile Include="..\..\external\mono\external\linker\linker\Linker\TypePreserve.cs">
<Link>Linker\TypePreserve.cs</Link> <Link>Linker\TypePreserve.cs</Link>
</Compile>
<Compile Include="..\..\external\mono\external\linker\linker\Linker\AssemblyUtilities.cs">
<Link>Linker\AssemblyUtilities.cs</Link>
</Compile>
<Compile Include="..\..\external\mono\external\linker\linker\Linker\TypeNameParser.cs">
<Link>Linker\TypeNameParser.cs</Link>
</Compile> </Compile>
<Compile Include="..\..\external\mono\external\linker\linker\Linker\XApiReader.cs"> <Compile Include="..\..\external\mono\external\linker\linker\Linker\XApiReader.cs">
<Link>Linker\XApiReader.cs</Link> <Link>Linker\XApiReader.cs</Link>

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

@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
/Library/Frameworks/Mono.framework/Commands/mono --debug @XAMARIN_MAC_PREFIX@/lib/mmp/mmp.exe "$@" exec /Library/Frameworks/Mono.framework/Commands/mono --debug @XAMARIN_MAC_PREFIX@/lib/mmp/mmp.exe "$@"

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

@ -30,9 +30,11 @@ LINKER_SOURCES = \
$(MONOLINKER)/Linker/MethodReferenceExtensions.cs \ $(MONOLINKER)/Linker/MethodReferenceExtensions.cs \
$(MONOLINKER)/Linker/TypeReferenceExtensions.cs \ $(MONOLINKER)/Linker/TypeReferenceExtensions.cs \
$(MONOLINKER)/Linker/TypePreserve.cs \ $(MONOLINKER)/Linker/TypePreserve.cs \
$(MONOLINKER)/Linker/TypeNameParser.cs \
$(MONOLINKER)/Linker/XApiReader.cs \ $(MONOLINKER)/Linker/XApiReader.cs \
$(MONOLINKER)/Linker/Tracer.cs \ $(MONOLINKER)/Linker/Tracer.cs \
$(MONOLINKER)/Linker/MarkingHelpers.cs \ $(MONOLINKER)/Linker/MarkingHelpers.cs \
$(MONOLINKER)/Linker/AssemblyUtilities.cs \
$(MONOLINKER)/Linker.Steps/BaseStep.cs \ $(MONOLINKER)/Linker.Steps/BaseStep.cs \
$(MONOLINKER)/Linker.Steps/BlacklistStep.cs \ $(MONOLINKER)/Linker.Steps/BlacklistStep.cs \
$(MONOLINKER)/Linker.Steps/CleanStep.cs \ $(MONOLINKER)/Linker.Steps/CleanStep.cs \