gboolean mono_class_is_magic_float (MonoClass *klass) { static MonoClass *magic_nfloat_class; if (klass == magic_nfloat_class) return TRUE; if (magic_nfloat_class) return FALSE; if (!mono_class_is_magic_assembly (klass)) return FALSE; if (strcmp ("System", m_class_get_name_space (klass)) != 0) return FALSE; if (strcmp ("nfloat", m_class_get_name (klass)) == 0) { magic_nfloat_class = klass; /* Assert that we are using the matching assembly */ MonoClassField *value_field = mono_class_get_field_from_name_full (klass, "v", NULL); g_assert (value_field); MonoType *t = mono_field_get_type (value_field); MonoType *native = mini_native_type_replace_type (m_class_get_byval_arg (klass)); if (t->type != native->type) g_error ("Assembly used for native types '%s' doesn't match this runtime, %s is mapped to %s, expecting %s.\n", m_class_get_image (klass)->name, m_class_get_name (klass), mono_type_full_name (t), mono_type_full_name (native)); return TRUE; } return FALSE; }
MonoType* mini_native_type_replace_type (MonoType *type) { MonoClass *klass; if (type->type != MONO_TYPE_VALUETYPE) return type; klass = type->data.klass; if (mono_class_is_magic_int (klass)) return type->byref ? m_class_get_this_arg (mono_defaults.int_class) : mono_get_int_type (); if (mono_class_is_magic_float (klass)) #if SIZEOF_VOID_P == 8 return type->byref ? m_class_get_this_arg (mono_defaults.double_class) : m_class_get_byval_arg (mono_defaults.double_class); #else return type->byref ? m_class_get_this_arg (mono_defaults.single_class) : m_class_get_byval_arg (mono_defaults.single_class); #endif return type; }
static MonoStringHandle get_type_name_as_mono_string (MonoErrorInternal *error, MonoDomain *domain, MonoError *error_out) { HANDLE_FUNCTION_ENTER (); MonoStringHandle res = NULL_HANDLE_STRING; if (error->type_name) { res = string_new_cleanup (domain, error->type_name); } else { MonoClass *klass = get_class (error); if (klass) { char *name = mono_type_full_name (m_class_get_byval_arg (klass)); if (name) { res = string_new_cleanup (domain, name); g_free (name); } } } if (MONO_HANDLE_IS_NULL (res)) mono_error_set_out_of_memory (error_out, "Could not allocate type name"); HANDLE_FUNCTION_RETURN_REF (MonoString, res); }
static int dump_verify_info (MonoImage *image, int flags, gboolean valid_only) { GSList *errors, *tmp; int count = 0, verifiable = 0; const char* desc [] = { "Ok", "Error", "Warning", NULL, "CLS", NULL, NULL, NULL, "Not Verifiable" }; if (verify_code) { /* verify code */ int i; MonoTableInfo *m = &image->tables [MONO_TABLE_METHOD]; for (i = 0; i < m->rows; ++i) { MonoMethod *method; ERROR_DECL (error); method = mono_get_method_checked (image, MONO_TOKEN_METHOD_DEF | (i+1), NULL, NULL, error); if (!method) { g_print ("Warning: Cannot lookup method with token 0x%08x due to %s\n", i + 1, mono_error_get_message (error)); mono_error_cleanup (error); continue; } errors = mono_method_verify (method, flags); if (errors) { MonoClass *klass = mono_method_get_class (method); char *name = mono_type_full_name (m_class_get_byval_arg (klass)); if (mono_method_signature_internal (method) == NULL) { g_print ("In method: %s::%s(ERROR)\n", name, mono_method_get_name (method)); } else { char *sig; sig = mono_signature_get_desc (mono_method_signature_internal (method), FALSE); g_print ("In method: %s::%s(%s)\n", name, mono_method_get_name (method), sig); g_free (sig); } g_free (name); } for (tmp = errors; tmp; tmp = tmp->next) { MonoVerifyInfo *info = (MonoVerifyInfo *)tmp->data; if (info->status == MONO_VERIFY_NOT_VERIFIABLE && valid_only) continue; g_print ("%s: %s\n", desc [info->status], info->message); if (info->status == MONO_VERIFY_ERROR) { count++; verifiable = 3; } if(info->status == MONO_VERIFY_NOT_VERIFIABLE) { if (verifiable < 2) verifiable = 2; } } mono_free_verify_list (errors); } } if (count) g_print ("Error count: %d\n", count); return verifiable; }