[runtime] Fix support for custom marshallers defined in other assemblies. Fixes ...
authorZoltan Varga <vargaz@gmail.com>
Thu, 5 Jun 2014 18:47:56 +0000 (20:47 +0200)
committerZoltan Varga <vargaz@gmail.com>
Thu, 5 Jun 2014 18:48:09 +0000 (20:48 +0200)
mono/metadata/marshal.c
mono/metadata/metadata-internals.h
mono/metadata/metadata.c
mono/metadata/metadata.h

index 8a8b6b8b512b3ade4dd00580152c020beae85bed..19aaa1a6b09988907be26fe8ea1215f08d058224 100644 (file)
@@ -5920,7 +5920,10 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t,
                g_assert (marshal_native_to_managed);
        }
 
-       mtype = mono_reflection_type_from_name (spec->data.custom_data.custom_name, m->image);
+       if (spec->data.custom_data.image)
+               mtype = mono_reflection_type_from_name (spec->data.custom_data.custom_name, spec->data.custom_data.image);
+       else
+               mtype = mono_reflection_type_from_name (spec->data.custom_data.custom_name, m->image);
        g_assert (mtype != NULL);
        mklass = mono_class_from_mono_type (mtype);
        g_assert (mklass != NULL);
index 618fd5b59d52a7487fe1b0798397971c06a119bf..68b4d71dd3d74c4234bd5b6bffae3ba445550650 100644 (file)
@@ -719,7 +719,7 @@ gboolean
 mono_metadata_type_equal_full (MonoType *t1, MonoType *t2, gboolean signature_only) MONO_INTERNAL;
 
 MonoMarshalSpec *
-mono_metadata_parse_marshal_spec_full (MonoImage *image, const char *ptr) MONO_INTERNAL;
+mono_metadata_parse_marshal_spec_full (MonoImage *image, MonoImage *parent_image, const char *ptr) MONO_INTERNAL;
 
 guint         mono_metadata_generic_inst_hash (gconstpointer data) MONO_INTERNAL;
 gboolean       mono_metadata_generic_inst_equal (gconstpointer ka, gconstpointer kb) MONO_INTERNAL;
index 356dc2c24371b6a941f22ef84647bfc16630f6aa..c2c697060813ad769abb485ac6a8a78ec82315f0 100644 (file)
@@ -5012,7 +5012,7 @@ mono_metadata_field_info_full (MonoImage *meta, guint32 index, guint32 *offset,
                const char *p;
                
                if ((p = mono_metadata_get_marshal_info (meta, index, TRUE))) {
-                       *marshal_spec = mono_metadata_parse_marshal_spec_full (alloc_from_image ? meta : NULL, p);
+                       *marshal_spec = mono_metadata_parse_marshal_spec_full (alloc_from_image ? meta : NULL, meta, p);
                }
        }
 
@@ -5344,11 +5344,15 @@ mono_image_strndup (MonoImage *image, const char *data, guint len)
 MonoMarshalSpec *
 mono_metadata_parse_marshal_spec (MonoImage *image, const char *ptr)
 {
-       return mono_metadata_parse_marshal_spec_full (NULL, ptr);
+       return mono_metadata_parse_marshal_spec_full (NULL, image, ptr);
 }
 
+/*
+ * If IMAGE is non-null, memory will be allocated from its mempool, otherwise it will be allocated using malloc.
+ * PARENT_IMAGE is the image containing the marshal spec.
+ */
 MonoMarshalSpec *
-mono_metadata_parse_marshal_spec_full (MonoImage *image, const char *ptr)
+mono_metadata_parse_marshal_spec_full (MonoImage *image, MonoImage *parent_image, const char *ptr)
 {
        MonoMarshalSpec *res;
        int len;
@@ -5413,6 +5417,7 @@ mono_metadata_parse_marshal_spec_full (MonoImage *image, const char *ptr)
                /* read cookie string */
                len = mono_metadata_decode_value (ptr, &ptr);
                res->data.custom_data.cookie = mono_image_strndup (image, ptr, len);
+               res->data.custom_data.image = parent_image;
        }
 
        if (res->native == MONO_NATIVE_SAFEARRAY) {
index 4b880c7bab42bb5aa733d70d0358604471524b29..0a61a2dc10aca05696f8172783b03c6964c980bf 100644 (file)
@@ -190,6 +190,7 @@ typedef struct {
                struct {
                        char *custom_name;
                        char *cookie;
+                       MonoImage *image;
                } custom_data;
                struct {
                        MonoMarshalVariant elem_type;