Merge pull request #2609 from directhex/xambug-30902
[mono.git] / mono / metadata / remoting.c
index 8ca8ae62fdb550f506b55949ba4f8feeac76dd77..9ab10c237bde3e877b127c0ed6dd6be21ee6a75b 100644 (file)
@@ -66,6 +66,11 @@ mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst);
 static MonoReflectionType *
 type_from_handle (MonoType *handle);
 
+/* Class lazy loading functions */
+static GENERATE_GET_CLASS_WITH_CACHE (remoting_services, System.Runtime.Remoting, RemotingServices)
+static GENERATE_GET_CLASS_WITH_CACHE (call_context, System.Runtime.Remoting.Messaging, CallContext)
+static GENERATE_GET_CLASS_WITH_CACHE (context, System.Runtime.Remoting.Contexts, Context)
+
 static mono_mutex_t remoting_mutex;
 static gboolean remoting_mutex_inited;
 
@@ -153,7 +158,7 @@ mono_remoting_marshal_init (void)
        byte_array_class = mono_array_class_get (mono_defaults.byte_class, 1);
 
 #ifndef DISABLE_JIT
-       klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting", "RemotingServices");
+       klass = mono_class_get_remoting_services_class ();
        method_rs_serialize = mono_class_get_method_from_name (klass, "SerializeCallData", -1);
        g_assert (method_rs_serialize);
        method_rs_deserialize = mono_class_get_method_from_name (klass, "DeserializeCallData", -1);
@@ -169,11 +174,11 @@ mono_remoting_marshal_init (void)
        method_exc_fixexc = mono_class_get_method_from_name (klass, "FixRemotingException", -1);
        g_assert (method_exc_fixexc);
 
-       klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Messaging", "CallContext");
+       klass = mono_class_get_call_context_class ();
        method_set_call_context = mono_class_get_method_from_name (klass, "SetCurrentCallContext", -1);
        g_assert (method_set_call_context);
 
-       klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Contexts", "Context");
+       klass = mono_class_get_context_class ();
        method_needs_context_sink = mono_class_get_method_from_name (klass, "get_NeedsContextSink", -1);
        g_assert (method_needs_context_sink);
 #endif 
@@ -340,6 +345,7 @@ mono_remoting_mb_create_and_cache (MonoMethod *key, MonoMethodBuilder *mb,
 static MonoObject *
 mono_remoting_wrapper (MonoMethod *method, gpointer *params)
 {
+       MonoError error;
        MonoMethodMessage *msg;
        MonoTransparentProxy *this_obj;
        MonoObject *res, *exc;
@@ -377,7 +383,10 @@ mono_remoting_wrapper (MonoMethod *method, gpointer *params)
                        }
                }
 
-               return mono_runtime_invoke (method, method->klass->valuetype? mono_object_unbox ((MonoObject*)this_obj): this_obj, mparams, NULL);
+               res = mono_runtime_invoke_checked (method, method->klass->valuetype? mono_object_unbox ((MonoObject*)this_obj): this_obj, mparams, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+
+               return res;
        }
 
        msg = mono_method_call_message_new (method, params, NULL, NULL, NULL);
@@ -408,7 +417,7 @@ mono_marshal_get_remoting_invoke (MonoMethod *method)
 
        /* this seems to be the best plase to put this, as all remoting invokes seem to get filtered through here */
 #ifndef DISABLE_COM
-       if (mono_class_is_com_object (method->klass) || method->klass == mono_class_get_com_object_class ()) {
+       if (mono_class_is_com_object (method->klass) || method->klass == mono_class_try_get_com_object_class ()) {
                MonoVTable *vtable = mono_class_vtable (mono_domain_get (), method->klass);
                g_assert (vtable); /*FIXME do proper error handling*/
 
@@ -1977,6 +1986,7 @@ mono_get_xdomain_marshal_type (MonoType *t)
 MonoObject *
 mono_marshal_xdomain_copy_value (MonoObject *val)
 {
+       MonoError error;
        MonoDomain *domain;
        if (val == NULL) return NULL;
 
@@ -2002,7 +2012,10 @@ mono_marshal_xdomain_copy_value (MonoObject *val)
        }
        case MONO_TYPE_STRING: {
                MonoString *str = (MonoString *) val;
-               return (MonoObject *) mono_string_new_utf16 (domain, mono_string_chars (str), mono_string_length (str));
+               MonoObject *res = NULL;
+               res = (MonoObject *) mono_string_new_utf16_checked (domain, mono_string_chars (str), mono_string_length (str), &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               return res;
        }
        case MONO_TYPE_ARRAY:
        case MONO_TYPE_SZARRAY: {