MonoTableInfo *tables = image->tables;
MonoType *sig_type;
guint32 cols[6];
- guint32 nindex, class;
+ guint32 nindex, class, class_table;
const char *fname;
const char *ptr;
guint32 idx = mono_metadata_token_index (token);
return NULL;
}
+ switch (class) {
+ case MONO_MEMBERREF_PARENT_TYPEDEF:
+ class_table = MONO_TOKEN_TYPE_DEF;
+ klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | nindex);
+ break;
+ case MONO_MEMBERREF_PARENT_TYPEREF:
+ class_table = MONO_TOKEN_TYPE_REF;
+ klass = mono_class_from_typeref (image, MONO_TOKEN_TYPE_REF | nindex);
+ break;
+ case MONO_MEMBERREF_PARENT_TYPESPEC:
+ class_table = MONO_TOKEN_TYPE_SPEC;
+ klass = mono_class_get_full (image, MONO_TOKEN_TYPE_SPEC | nindex, context);
+ break;
+ default:
+ /*FIXME this must set a loader error!*/
+ g_warning ("field load from %x", class);
+ return NULL;
+ }
+
+ if (!klass) {
+ char *name = mono_class_name_from_token (image, class_table | nindex);
+ g_warning ("Missing field %s in class %s (type token %d)", fname, name, class_table | nindex);
+ mono_loader_set_error_type_load (name, image->assembly_name);
+ g_free (name);
+ return NULL;
+ }
+
ptr = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);
mono_metadata_decode_blob_size (ptr, &ptr);
/* we may want to check the signature here... */
if (*ptr++ != 0x6) {
g_warning ("Bad field signature class token %08x field name %s token %08x", class, fname, token);
- mono_loader_set_error_field_load (NULL, fname);
+ mono_loader_set_error_field_load (klass, fname);
return NULL;
}
/* FIXME: This needs a cache, especially for generic instances, since
if (!sig_type) {
sig_type = mono_metadata_parse_type (image, MONO_PARSE_TYPE, 0, ptr, &ptr);
if (sig_type == NULL) {
- mono_loader_set_error_field_load (NULL, fname);
+ mono_loader_set_error_field_load (klass, fname);
return NULL;
}
sig_type = cache_memberref_sig (image, cols [MONO_MEMBERREF_SIGNATURE], sig_type);
}
- switch (class) {
- case MONO_MEMBERREF_PARENT_TYPEDEF:
- klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | nindex);
- if (!klass) {
- char *name = mono_class_name_from_token (image, MONO_TOKEN_TYPE_DEF | nindex);
- g_warning ("Missing field %s in class %s (typedef index %d)", fname, name, nindex);
- mono_loader_set_error_type_load (name, image->assembly_name);
- g_free (name);
- return NULL;
- }
- mono_class_init (klass);
- if (retklass)
- *retklass = klass;
- field = mono_class_get_field_from_name_full (klass, fname, sig_type);
- break;
- case MONO_MEMBERREF_PARENT_TYPEREF:
- klass = mono_class_from_typeref (image, MONO_TOKEN_TYPE_REF | nindex);
- if (!klass) {
- char *name = mono_class_name_from_token (image, MONO_TOKEN_TYPE_REF | nindex);
- g_warning ("missing field %s in class %s (typeref index %d)", fname, name, nindex);
- mono_loader_set_error_type_load (name, image->assembly_name);
- g_free (name);
- return NULL;
- }
- mono_class_init (klass);
- if (retklass)
- *retklass = klass;
- field = mono_class_get_field_from_name_full (klass, fname, sig_type);
- break;
- case MONO_MEMBERREF_PARENT_TYPESPEC: {
- klass = mono_class_get_full (image, MONO_TOKEN_TYPE_SPEC | nindex, context);
- if (!klass) {
- char *name = mono_class_name_from_token (image, MONO_TOKEN_TYPE_REF | nindex);
- g_warning ("missing field %s in class %s (typeref index %d)", fname, name, nindex);
- mono_loader_set_error_type_load (name, image->assembly_name);
- g_free (name);
- return NULL;
- }
- mono_class_init (klass); /*FIXME is this really necessary?*/
- if (retklass)
- *retklass = klass;
- field = mono_class_get_field_from_name_full (klass, fname, sig_type);
- break;
- }
- default:
- g_warning ("field load from %x", class);
- return NULL;
- }
+ mono_class_init (klass); /*FIXME is this really necessary?*/
+ if (retklass)
+ *retklass = klass;
+ field = mono_class_get_field_from_name_full (klass, fname, sig_type);
if (!field)
mono_loader_set_error_field_load (klass, fname);