Hey Neale,

I think the code below is from mono_metadata_inflate_generic_inst.

And the question is whether it’s ok to call mono_metadata_free_type on each 
type_argv[i] if mono_metadata_get_generic_inst was called.  I’m going to go 
through how I think it’s working - let me know if I messed something up:

mono_metadata_get_generic_inst does two things:
  1. It makes a provisional MonoGenericInst allocated with g_alloca, and where 
the generic instantiation aliases each of the elements of type_argv from 
mono_metadata_inflate_generic_inst.
  2. It makes a canonical MonoGenericInst allocated in a MonoImageSet’s mempool 
by calling mono_metadata_get_canonical_generic_inst.
  In the case where the canonical instance already exists, we just return it.  
And in this case it’s okay to free the type_argv in 
mono_metadata_inflate_generic_inst because nothing should need those types 
anymore.
  In the case where the canonical instance doesn’t exist we have to create one 
and we call mono_metadata_type_dup which means the canonical instance gets its 
own fresh MonoTypes for the arguments.  And again it’s okay to free in 
mono_metadata_inflate_generic_inst.

What’d I miss?

-Aleksey

On 8/16/17, 16:57, "Mono-devel-list on behalf of Neale Ferguson" 
<mono-devel-list-boun...@lists.dot.net<mailto:mono-devel-list-boun...@lists.dot.net>
 on behalf of ne...@sinenomine.net<mailto:ne...@sinenomine.net>> wrote:


If there is no error in the first loop do we still want to free each of the 
type_argv elements in cleanup? If they are these types are overwritten. Freeing 
type_argv is valid as the mono_class_inflate_generic_type_checked() makes a 
copy of the array.



        for (i = 0; i < ginst->type_argc; i++) {

                type_argv [i] = mono_class_inflate_generic_type_checked 
(ginst->type_argv [i], context, error);

                if (!mono_error_ok (error))

                        goto cleanup;

                ++count;

        }



        nginst = mono_metadata_get_generic_inst (ginst->type_argc, type_argv);

cleanup:

        for (i = 0; i < count; i++)

                mono_metadata_free_type (type_argv [i]);

        g_free (type_argv);



        return nginst;

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.dot.net
http://lists.dot.net/mailman/listinfo/mono-devel-list

Reply via email to