[registrar] Create a xamarin_string_to_nsstring function to avoid code duplication.

This commit is contained in:
Rolf Bjarne Kvinge 2019-03-19 18:31:10 +01:00 коммит произвёл monojenkins
Родитель 10d7d1c26f
Коммит 8b0f3c80d8
4 изменённых файлов: 24 добавлений и 32 удалений

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

@ -51,6 +51,22 @@ xamarin_get_exception_for_parameter (int code, guint32 inner_exception_gchandle,
return exception_gchandle; return exception_gchandle;
} }
NSString *
xamarin_string_to_nsstring (MonoString *obj, bool retain)
{
if (obj == NULL)
return NULL;
char *str = mono_string_to_utf8 ((MonoString *) obj);
NSString *arg;
if (retain) {
arg = [[NSString alloc] initWithUTF8String:str];
} else {
arg = [NSString stringWithUTF8String:str];
}
mono_free (str);
return arg;
}
void void
xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_func iterator, marshal_return_value_func marshal_return_value, void *context) xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_func iterator, marshal_return_value_func marshal_return_value, void *context)
{ {
@ -545,10 +561,8 @@ xamarin_invoke_trampoline (enum TrampolineType type, id self, SEL sel, iterator_
*(NSObject **) arg = NULL; *(NSObject **) arg = NULL;
LOGZ (" writing back managed null string to argument at %p\n", arg); LOGZ (" writing back managed null string to argument at %p\n", arg);
} else { } else {
char *str = mono_string_to_utf8 (value); *(NSObject **) arg = xamarin_string_to_nsstring (value, false);
*(NSObject **) arg = [[[NSString alloc] initWithUTF8String:str] autorelease];
LOGZ (" writing back managed string %p = %s to argument at %p\n", *(NSObject **) arg, str, arg); LOGZ (" writing back managed string %p = %s to argument at %p\n", *(NSObject **) arg, str, arg);
mono_free (str);
} }
} else if (xamarin_is_class_nsobject (p_klass)) { } else if (xamarin_is_class_nsobject (p_klass)) {
*(NSObject **) arg = xamarin_get_handle ((MonoObject *) arg_frame [ofs], &exception_gchandle); *(NSObject **) arg = xamarin_get_handle ((MonoObject *) arg_frame [ofs], &exception_gchandle);

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

@ -71,13 +71,7 @@ xamarin_marshal_return_value_impl (MonoType *mtype, const char *type, MonoObject
if (desc && desc->bindas [0].original_type != NULL) { if (desc && desc->bindas [0].original_type != NULL) {
return xamarin_generate_conversion_to_native (retval, mono_class_get_type (r_klass), mono_reflection_type_get_type (desc->bindas [0].original_type), method, (void *) INVALID_TOKEN_REF, exception_gchandle); return xamarin_generate_conversion_to_native (retval, mono_class_get_type (r_klass), mono_reflection_type_get_type (desc->bindas [0].original_type), method, (void *) INVALID_TOKEN_REF, exception_gchandle);
} else if (r_klass == mono_get_string_class ()) { } else if (r_klass == mono_get_string_class ()) {
char *str = mono_string_to_utf8 ((MonoString *) retval); return xamarin_string_to_nsstring ((MonoString *) retval, retain);
NSString *rv = [[NSString alloc] initWithUTF8String:str];
if (!retain)
[rv autorelease];
mono_free (str);
return (void *) rv;
} else if (xamarin_is_class_array (r_klass)) { } else if (xamarin_is_class_array (r_klass)) {
MonoClass *e_klass = mono_class_get_element_class (r_klass); MonoClass *e_klass = mono_class_get_element_class (r_klass);
bool is_string = e_klass == mono_get_string_class (); bool is_string = e_klass == mono_get_string_class ();
@ -92,13 +86,7 @@ xamarin_marshal_return_value_impl (MonoType *mtype, const char *type, MonoObject
MonoObject *value = mono_array_get (m_arr, MonoObject *, i); MonoObject *value = mono_array_get (m_arr, MonoObject *, i);
if (is_string) { if (is_string) {
char *str = mono_string_to_utf8 ((MonoString *) value); v = xamarin_string_to_nsstring ((MonoString *) value, false);
NSString *sv = [[NSString alloc] initWithUTF8String:str];
[sv autorelease];
mono_free (str);
v = sv;
} else { } else {
v = xamarin_get_handle (value, exception_gchandle); v = xamarin_get_handle (value, exception_gchandle);
if (*exception_gchandle != 0) { if (*exception_gchandle != 0) {

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

@ -179,6 +179,8 @@ id xamarin_uiedgeinsets_to_nsvalue (MonoObject *value, void *context,
id xamarin_uioffset_to_nsvalue (MonoObject *value, void *context, guint32 *exception_gchandle); id xamarin_uioffset_to_nsvalue (MonoObject *value, void *context, guint32 *exception_gchandle);
id xamarin_nsdirectionaledgeinsets_to_nsvalue(MonoObject *value, void *context, guint32 *exception_gchandle); id xamarin_nsdirectionaledgeinsets_to_nsvalue(MonoObject *value, void *context, guint32 *exception_gchandle);
NSString * xamarin_string_to_nsstring (MonoString *obj, bool retain);
/* Copied from SGen */ /* Copied from SGen */
static inline void static inline void

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

@ -3531,10 +3531,7 @@ namespace Registrar {
setup_call_stack.AppendLine ("a{0} = *p{0} ? mono_string_new (mono_domain_get (), [(*p{0}) UTF8String]) : NULL;", i); setup_call_stack.AppendLine ("a{0} = *p{0} ? mono_string_new (mono_domain_get (), [(*p{0}) UTF8String]) : NULL;", i);
setup_call_stack.AppendLine ("arg_ptrs [{0}] = &a{0};", i); setup_call_stack.AppendLine ("arg_ptrs [{0}] = &a{0};", i);
body_setup.AppendLine ("char *str{0} = NULL;", i); body_setup.AppendLine ("char *str{0} = NULL;", i);
copyback.AppendLine ("str{0} = mono_string_to_utf8 (a{0});", i); copyback.AppendLine ("*p{0} = xamarin_string_to_nsstring (a{0}, false);", i);
copyback.AppendLine ("*p{0} = [[NSString alloc] initWithUTF8String:str{0}];", i);
copyback.AppendLine ("[*p{0} autorelease];", i);
copyback.AppendLine ("mono_free (str{0});", i);
} else { } else {
setup_call_stack.AppendLine ("arg_ptrs [{0}] = p{0} ? mono_string_new (mono_domain_get (), [p{0} UTF8String]) : NULL;", i); setup_call_stack.AppendLine ("arg_ptrs [{0}] = p{0} ? mono_string_new (mono_domain_get (), [p{0} UTF8String]) : NULL;", i);
} }
@ -3819,11 +3816,7 @@ namespace Registrar {
setup_return.AppendLine ("MonoObject *value = mono_array_get ((MonoArray *) retval, MonoObject *, i);"); setup_return.AppendLine ("MonoObject *value = mono_array_get ((MonoArray *) retval, MonoObject *, i);");
if (elementType.FullName == "System.String") { if (elementType.FullName == "System.String") {
setup_return.AppendLine ("char *str = mono_string_to_utf8 ((MonoString *) value);"); setup_return.AppendLine ("buf [i] = xamarin_string_to_nsstring ((MonoString *) value, false);");
setup_return.AppendLine ("NSString *sv = [[NSString alloc] initWithUTF8String:str];");
setup_return.AppendLine ("[sv autorelease];");
setup_return.AppendLine ("mono_free (str);");
setup_return.AppendLine ("buf [i] = sv;");
} else if (IsNSObject (elementType)) { } else if (IsNSObject (elementType)) {
setup_return.AppendLine ("buf [i] = xamarin_get_nsobject_handle ((MonoObject *) value);"); setup_return.AppendLine ("buf [i] = xamarin_get_nsobject_handle ((MonoObject *) value);");
} else if (IsINativeObject (elementType)) { } else if (IsINativeObject (elementType)) {
@ -3884,12 +3877,7 @@ namespace Registrar {
setup_return.AppendLine ("res = retobj;"); setup_return.AppendLine ("res = retobj;");
} else if (type.FullName == "System.String") { } else if (type.FullName == "System.String") {
// This should always be an NSString and never char* // This should always be an NSString and never char*
setup_return.AppendLine ("char *str = mono_string_to_utf8 ((MonoString *) retval);"); setup_return.AppendLine ("res = xamarin_string_to_nsstring ((MonoString *) retval, {0});", retain ? "true" : "false");
setup_return.AppendLine ("NSString *nsstr = [[NSString alloc] initWithUTF8String:str];");
if (!retain)
setup_return.AppendLine ("[nsstr autorelease];");
setup_return.AppendLine ("mono_free (str);");
setup_return.AppendLine ("res = nsstr;");
} else if (IsDelegate (type.Resolve ())) { } else if (IsDelegate (type.Resolve ())) {
var signature = "NULL"; var signature = "NULL";
var token = "INVALID_TOKEN_REF"; var token = "INVALID_TOKEN_REF";