static guint32 inflated_signatures_size;
static guint32 memberref_sig_cache_size;
static guint32 methods_size;
+static guint32 signatures_size;
/*
* This TLS variable contains the last type load error encountered by the loader.
MONO_COUNTER_METADATA | MONO_COUNTER_INT, &memberref_sig_cache_size);
mono_counters_register ("MonoMethod size",
MONO_COUNTER_METADATA | MONO_COUNTER_INT, &methods_size);
+ mono_counters_register ("MonoMethodSignature size",
+ MONO_COUNTER_METADATA | MONO_COUNTER_INT, &signatures_size);
inited = TRUE;
}
fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]);
- if (!mono_verifier_verify_memberref_signature (image, cols [MONO_MEMBERREF_SIGNATURE], NULL)) {
+ if (!mono_verifier_verify_memberref_field_signature (image, cols [MONO_MEMBERREF_SIGNATURE], NULL)) {
mono_loader_set_error_bad_image (g_strdup_printf ("Bad field signature class token 0x%08x field name %s token 0x%08x on image %s", class, fname, token, image->name));
return NULL;
}
continue;
method = mono_get_method (klass->image, MONO_TOKEN_METHOD_DEF | (klass->method.first + i + 1), klass);
- other_sig = mono_method_signature (method);
- if (method && other_sig && (sig->call_convention != MONO_CALL_VARARG) && mono_metadata_signature_equal (sig, other_sig))
- return method;
+ if (method) {
+ other_sig = mono_method_signature (method);
+ if (other_sig && (sig->call_convention != MONO_CALL_VARARG) && mono_metadata_signature_equal (sig, other_sig))
+ return method;
+ }
}
}
MonoMethod *m = klass->methods [i];
MonoMethodSignature *msig;
+ /* We must cope with failing to load some of the types. */
+ if (!m)
+ continue;
+
if (!((fqname && !strcmp (m->name, fqname)) ||
(qname && !strcmp (m->name, qname)) ||
(name && !strcmp (m->name, name))))
if (name [0] == '.' && (!strcmp (name, ".ctor") || !strcmp (name, ".cctor")))
break;
- g_assert (from_class->interface_offsets_count == in_class->interface_offsets_count);
+ /*
+ * This happens when we fail to lazily load the interfaces of one of the types.
+ * On such case we can't just bail out since user code depends on us trying harder.
+ */
+ if (from_class->interface_offsets_count != in_class->interface_offsets_count) {
+ in_class = in_class->parent;
+ from_class = from_class->parent;
+ continue;
+ }
+
for (i = 0; i < in_class->interface_offsets_count; i++) {
MonoClass *in_ic = in_class->interfaces_packed [i];
MonoClass *from_ic = from_class->interfaces_packed [i];
sig = find_cached_memberref_sig (image, sig_idx);
if (!sig) {
- if (!mono_verifier_verify_memberref_signature (image, sig_idx, NULL)) {
+ if (!mono_verifier_verify_memberref_method_signature (image, sig_idx, NULL)) {
guint32 class = cols [MONO_MEMBERREF_CLASS] & MONO_MEMBERREF_PARENT_MASK;
const char *fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]);
sig_idx = cols [MONO_MEMBERREF_SIGNATURE];
- if (!mono_verifier_verify_memberref_signature (image, sig_idx, NULL)) {
+ if (!mono_verifier_verify_memberref_method_signature (image, sig_idx, NULL)) {
mono_loader_set_error_method_load (klass->name, mname);
return NULL;
}
g_assert (param_count);
inst = mono_metadata_parse_generic_inst (image, NULL, param_count, ptr, &ptr);
+ if (!inst)
+ return NULL;
+
if (context && inst->is_open) {
inst = mono_metadata_inflate_generic_inst (inst, context, &error);
if (!mono_error_ok (&error)) {
mono_loader_unlock ();
return res;
}
- res = mono_dl_open (name, flags, NULL);
+ res = mono_dl_open (name, flags, err);
if (res)
g_hash_table_insert (global_module_map, g_strdup (name), res);
mono_loader_unlock ();
"Probing '%s'.", mangled_name2);
error_msg = mono_dl_symbol (module, mangled_name2, &piinfo->addr);
+ g_free (error_msg);
+ error_msg = NULL;
if (piinfo->addr)
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_DLLIMPORT,
if (can_cache_signature)
g_hash_table_insert (img->method_signatures, (gpointer)sig, signature);
+
+ signatures_size += mono_metadata_signature_size (signature);
}
/* Verify metadata consistency */