Merge branch 'master' into mono-2018-06
This commit is contained in:
Коммит
69f8d32ea6
|
@ -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).
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 7627a5f9eeba0fd846731ad0c498556f55be1a34
|
Subproject commit 6e514dcc645ef70d53ab2a34266005d4ad875c73
|
|
@ -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";
|
||||||
}
|
}
|
||||||
|
|
||||||
static NSObject ConstructNSObject (IntPtr ptr, IntPtr klass, MissingCtorResolution missingCtorResolution)
|
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, 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>
|
||||||
|
|
|
@ -3922,6 +3922,10 @@ namespace AppKit {
|
||||||
[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]
|
||||||
[Export ("colorWithDisplayP3Red:green:blue:alpha:")]
|
[Export ("colorWithDisplayP3Red:green:blue:alpha:")]
|
||||||
|
|
|
@ -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"));
|
||||||
if (CurrentRegistrar == Registrars.Static) {
|
|
||||||
msg += "\nAdditional information:\n\tSelector: conformsToProtocol:\n\tMethod: ";
|
msg += "\nAdditional information:\n\tSelector: conformsToProtocol:\n\tMethod: ";
|
||||||
#if !XAMCORE_2_0
|
// The difference between the registrars is basically whether this string
|
||||||
#if __IOS__
|
// was constructed by native mono API or managed API.
|
||||||
msg += "MonoTouch.";
|
if (CurrentRegistrar == Registrars.Static) {
|
||||||
#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 \
|
||||||
|
|
Загрузка…
Ссылка в новой задаче