[runtime] MonoError-ize mono_get_constant_value_from_blob
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 21 Apr 2016 15:45:23 +0000 (11:45 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Mon, 9 May 2016 15:04:43 +0000 (11:04 -0400)
mono/metadata/icall.c
mono/metadata/object-internals.h
mono/metadata/object.c
mono/metadata/reflection.c

index e22c730342dc4a3bc8eadcb4932aa9722ad5cc93..15e17edb0d9cde932cb54ee5e530a664122ac492 100644 (file)
@@ -2152,12 +2152,16 @@ ves_icall_MonoField_GetRawConstantValue (MonoReflectionField *rfield)
                        return NULL;
                }
                v = ((gchar *) o) + sizeof (MonoObject);
-               mono_get_constant_value_from_blob (domain, def_type, def_value, v);
+               mono_get_constant_value_from_blob (domain, def_type, def_value, v, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return NULL;
                break;
        }
        case MONO_TYPE_STRING:
        case MONO_TYPE_CLASS:
-               mono_get_constant_value_from_blob (domain, def_type, def_value, &o);
+               mono_get_constant_value_from_blob (domain, def_type, def_value, &o, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return NULL;
                break;
        default:
                g_assert_not_reached ();
index e6fca9fba94f2d7e2762b7aae438b38705c00b62..70a6f609e062f6ecf2cf2fc044ae6ea9d80a81f3 100644 (file)
@@ -1403,7 +1403,7 @@ gboolean
 mono_image_build_metadata (MonoReflectionModuleBuilder *module, MonoError *error);
 
 int
-mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value);
+mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value, MonoError *error);
 
 void
 mono_release_type_locks (MonoInternalThread *thread);
index cc73d75896fe1a4d77b172366922ee2f01ee47e3..5a58eb154d546e5176d65829cd511f9f9ec2a1fa 100644 (file)
@@ -3523,11 +3523,11 @@ mono_field_get_value_object_checked (MonoDomain *domain, MonoClassField *field,
 }
 
 int
-mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value)
+mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       MonoError error;
+       mono_error_init (error);
        int retval = 0;
        const char *p = blob;
        mono_metadata_decode_blob_size (p, &p);
@@ -3558,8 +3558,7 @@ mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const
                readr8 (p, (double*) value);
                break;
        case MONO_TYPE_STRING:
-               *(gpointer*) value = mono_ldstr_metadata_sig (domain, blob, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               *(gpointer*) value = mono_ldstr_metadata_sig (domain, blob, error);
                break;
        case MONO_TYPE_CLASS:
                *(gpointer*) value = NULL;
@@ -3576,11 +3575,13 @@ get_default_field_value (MonoDomain* domain, MonoClassField *field, void *value)
 {
        MONO_REQ_GC_NEUTRAL_MODE;
 
+       MonoError error;
        MonoTypeEnum def_type;
        const char* data;
        
        data = mono_class_get_field_default_value (field, &def_type);
-       mono_get_constant_value_from_blob (domain, def_type, data, value);
+       mono_get_constant_value_from_blob (domain, def_type, data, value, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
 }
 
 void
index 5488e7df3d8432c5e3e05ba91dd931624867290d..3b419bc00482aefea82f8f87c73a86826c7e589c 100644 (file)
@@ -8050,7 +8050,7 @@ mono_get_object_from_blob (MonoDomain *domain, MonoType *type, const char *blob,
                retval = &object;
        }
                        
-       if (!mono_get_constant_value_from_blob (domain, basetype->type,  blob, retval))
+       if (!mono_get_constant_value_from_blob (domain, basetype->type,  blob, retval, error))
                return object;
        else
                return NULL;