*
* Copyright 2002-2003 Ximian, Inc (http://www.ximian.com)
* Copyright 2004-2009 Novell, Inc (http://www.novell.com)
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
*/
#include "config.h"
mono_mb_free (MonoMethodBuilder *mb)
{
#ifndef DISABLE_JIT
+ GList *l;
+
+ for (l = mb->locals_list; l; l = l->next) {
+ /* Allocated in mono_mb_add_local () */
+ g_free (l->data);
+ }
g_list_free (mb->locals_list);
if (!mb->dynamic) {
g_free (mb->method);
header->code = mb->code;
for (i = 0, l = mb->locals_list; l; l = l->next, i++) {
- header->locals [i] = mono_metadata_type_dup (NULL, (MonoType*)l->data);
+ header->locals [i] = (MonoType*)l->data;
}
} else
#endif
memcpy ((char*)header->code, mb->code, mb->pos);
for (i = 0, l = mb->locals_list; l; l = l->next, i++) {
- header->locals [i] = mono_metadata_type_dup (NULL, (MonoType*)l->data);
+ header->locals [i] = (MonoType*)l->data;
}
#endif
}
+#ifndef DISABLE_JIT
+ /* Free the locals list so mono_mb_free () doesn't free the types twice */
+ g_list_free (mb->locals_list);
+ mb->locals_list = NULL;
+#endif
+
method->signature = signature;
if (!signature->hasthis)
method->flags |= METHOD_ATTRIBUTE_STATIC;
mono_mb_add_local (MonoMethodBuilder *mb, MonoType *type)
{
int res;
+ MonoType *t;
+
+ /*
+ * Have to make a copy early since type might be sig->ret,
+ * which is transient, see mono_metadata_signature_dup_internal_with_padding ().
+ */
+ t = mono_metadata_type_dup (NULL, type);
g_assert (mb != NULL);
g_assert (type != NULL);
res = mb->locals;
- mb->locals_list = g_list_append (mb->locals_list, type);
+ mb->locals_list = g_list_append (mb->locals_list, t);
mb->locals++;
return res;