[mono-error] When fetching the error message for native usage, include assembly,...
authorRodrigo Kumpera <kumpera@gmail.com>
Mon, 2 Feb 2015 16:04:37 +0000 (11:04 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 12 Mar 2015 18:08:14 +0000 (14:08 -0400)
mono/utils/mono-error-internals.h
mono/utils/mono-error.c

index 29fb6319af70f7e19005889ee5db5978809eeb14..8e168c8e7eed21e2ecd1b248df9eca9968da006c 100644 (file)
@@ -17,8 +17,9 @@ typedef struct {
        const char *exception_name;
        MonoClass *klass;
        const char *full_message;
+       const char *full_message_with_fields;
 
-       void *padding [5];
+       void *padding [4];
     char message [128];
 } MonoErrorInternal;
 
index 63d6fcc00f862fa958321a6cd1cbb0045f9f6600..6618b70556ce982f5f682a8f8ec5f1d8d4dc7c1b 100644 (file)
@@ -35,11 +35,31 @@ mono_error_prepare (MonoErrorInternal *error)
        if (error->error_code != MONO_ERROR_NONE)
                return;
 
-       error->type_name = error->assembly_name = error->member_name = error->full_message = error->exception_name_space = error->exception_name = NULL;
+       error->type_name = error->assembly_name = error->member_name = error->full_message = error->exception_name_space = error->exception_name = error->full_message_with_fields = NULL;
        error->klass = NULL;
        error->message [0] = 0;
 }
 
+static const char*
+get_type_name (MonoErrorInternal *error)
+{
+       if (error->type_name)
+               return error->type_name;
+       if (error->klass)
+               return error->klass->name;
+       return "<unknown type>";
+}
+
+static const char*
+get_assembly_name (MonoErrorInternal *error)
+{
+       if (error->assembly_name)
+               return error->assembly_name;
+       if (error->klass && error->klass->image)
+               return error->klass->image->name;
+       return "<unknown assembly>";
+}
+
 void
 mono_error_init_flags (MonoError *oerror, unsigned short flags)
 {
@@ -64,6 +84,7 @@ mono_error_cleanup (MonoError *oerror)
                return;
 
        g_free ((char*)error->full_message);
+       g_free ((char*)error->full_message_with_fields);
        if (!(error->flags & MONO_ERROR_FREE_STRINGS)) //no memory was allocated
                return;
 
@@ -94,7 +115,16 @@ mono_error_get_message (MonoError *oerror)
        MonoErrorInternal *error = (MonoErrorInternal*)oerror;
        if (error->error_code == MONO_ERROR_NONE)
                return NULL;
-       return mono_internal_error_get_message (error);
+       if (error->full_message_with_fields)
+               return error->full_message_with_fields;
+
+       error->full_message_with_fields = g_strdup_printf ("%s assembly:%s type:%s member:%s",
+               mono_internal_error_get_message (error),
+               get_assembly_name (error),
+               get_type_name (error),
+               error->member_name ? error->member_name : "<none>");
+
+       return error->full_message_with_fields ? error->full_message_with_fields : mono_internal_error_get_message (error);
 }
 
 /*
@@ -364,26 +394,6 @@ mono_error_set_from_loader_error (MonoError *oerror)
        mono_loader_clear_error ();
 }
 
-static const char*
-get_type_name (MonoErrorInternal *error)
-{
-       if (error->type_name)
-               return error->type_name;
-       if (error->klass)
-               return error->klass->name;
-       return "<unknown type>";
-}
-
-static const char*
-get_assembly_name (MonoErrorInternal *error)
-{
-       if (error->assembly_name)
-               return error->assembly_name;
-       if (error->klass && error->klass->image)
-               return error->klass->image->name;
-       return "<unknown assembly>";
-}
-
 void
 mono_loader_set_error_from_mono_error (MonoError *oerror)
 {