Merge pull request #3992 from lambdageek/dev-handles-srassembly
authorAleksey Kliger (λgeek) <akliger@gmail.com>
Wed, 23 Nov 2016 14:47:37 +0000 (09:47 -0500)
committerGitHub <noreply@github.com>
Wed, 23 Nov 2016 14:47:37 +0000 (09:47 -0500)
[coop] Use handles in System.Reflection.Assembly.{GetReferencedAssemblies,InternalGetAssemblyName}

1  2 
mono/metadata/assembly.c

diff --combined mono/metadata/assembly.c
index 6f646fe8fe81009f69b52f14ffb28cb10cb84a36,79b14c21b5fad56920ebaddf5d3478424d12db64..2bf24e8c1a60d06fb67c8e86e4ff50f476da5d67
@@@ -799,7 -799,7 +799,7 @@@ mono_assembly_binding_unlock (void
  }
  
  gboolean
- mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname)
+ mono_assembly_fill_assembly_name_full (MonoImage *image, MonoAssemblyName *aname, gboolean copyBlobs)
  {
        MonoTableInfo *t = &image->tables [MONO_TABLE_ASSEMBLY];
        guint32 cols [MONO_ASSEMBLY_SIZE];
        aname->hash_len = 0;
        aname->hash_value = NULL;
        aname->name = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_NAME]);
+       if (copyBlobs)
+               aname->name = g_strdup (aname->name);
        aname->culture = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_CULTURE]);
+       if (copyBlobs)
+               aname->culture = g_strdup (aname->culture);
        aname->flags = cols [MONO_ASSEMBLY_FLAGS];
        aname->major = cols [MONO_ASSEMBLY_MAJOR_VERSION];
        aname->minor = cols [MONO_ASSEMBLY_MINOR_VERSION];
  
        if (cols [MONO_ASSEMBLY_PUBLIC_KEY]) {
                aname->public_key = (guchar*)mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
+               if (copyBlobs) {
+                       const gchar *pkey_end;
+                       int len = mono_metadata_decode_blob_size ((const gchar*) aname->public_key, &pkey_end);
+                       pkey_end += len; /* move to end */
+                       size_t size = pkey_end - (const gchar*)aname->public_key;
+                       guchar *tmp = g_new (guchar, size);
+                       memcpy (tmp, aname->public_key, size);
+                       aname->public_key = tmp;
+               }
        }
        else
                aname->public_key = 0;
        return TRUE;
  }
  
+ gboolean
+ mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname)
+ {
+       return mono_assembly_fill_assembly_name_full (image, aname, FALSE);
+ }
  /**
   * mono_stringify_assembly_name:
   * @aname: the assembly name.
@@@ -1227,7 -1247,7 +1247,7 @@@ mono_assembly_load_reference (MonoImag
                                    image->assembly->aname.name, image->assembly, reference->aname.name, reference, reference->ref_count);
                } else {
                        if (image->assembly)
 -                              mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s[%p]\n",
 +                              mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s[%p].",
                                    image->assembly->aname.name, image->assembly);
                }