#endif
}
+static void
+save_cast_details (MonoCompile *cfg, MonoClass *klass, int obj_reg)
+{
+ if (mini_get_debug_options ()->better_cast_details) {
+ int to_klass_reg = alloc_preg (cfg);
+ int vtable_reg = alloc_preg (cfg);
+ int klass_reg = alloc_preg (cfg);
+ MonoInst *tls_get = mono_get_jit_tls_intrinsic (cfg);
+
+ if (!tls_get) {
+ fprintf (stderr, "error: --debug=casts not supported on this platform.\n.");
+ exit (1);
+ }
+
+ MONO_ADD_INS (cfg->cbb, tls_get);
+ MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+ MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+
+ MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), klass_reg);
+ MONO_EMIT_NEW_PCONST (cfg, to_klass_reg, klass);
+ MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_to), to_klass_reg);
+ }
+}
+
+static void
+reset_cast_details (MonoCompile *cfg)
+{
+ /* Reset the variables holding the cast details */
+ if (mini_get_debug_options ()->better_cast_details) {
+ MonoInst *tls_get = mono_get_jit_tls_intrinsic (cfg);
+
+ MONO_ADD_INS (cfg->cbb, tls_get);
+ /* It is enough to reset the from field */
+ MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), 0);
+ }
+}
+
/*
* On return the caller must check @array_class for load errors
*/
if (cfg->generic_sharing_context)
context_used = mono_class_check_context_used (array_class);
+ save_cast_details (cfg, array_class, obj->dreg);
+
MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vtable_reg, obj->dreg, G_STRUCT_OFFSET (MonoObject, vtable));
-
+
if (cfg->opt & MONO_OPT_SHARED) {
int class_reg = alloc_preg (cfg);
MONO_EMIT_NEW_LOAD_MEMBASE (cfg, class_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
}
MONO_EMIT_NEW_COND_EXC (cfg, NE_UN, "ArrayTypeMismatchException");
-}
-
-static void
-save_cast_details (MonoCompile *cfg, MonoClass *klass, int obj_reg)
-{
- if (mini_get_debug_options ()->better_cast_details) {
- int to_klass_reg = alloc_preg (cfg);
- int vtable_reg = alloc_preg (cfg);
- int klass_reg = alloc_preg (cfg);
- MonoInst *tls_get = mono_get_jit_tls_intrinsic (cfg);
-
- if (!tls_get) {
- fprintf (stderr, "error: --debug=casts not supported on this platform.\n.");
- exit (1);
- }
-
- MONO_ADD_INS (cfg->cbb, tls_get);
- MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
- MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
-
- MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), klass_reg);
- MONO_EMIT_NEW_PCONST (cfg, to_klass_reg, klass);
- MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_to), to_klass_reg);
- }
-}
-static void
-reset_cast_details (MonoCompile *cfg)
-{
- /* Reset the variables holding the cast details */
- if (mini_get_debug_options ()->better_cast_details) {
- MonoInst *tls_get = mono_get_jit_tls_intrinsic (cfg);
-
- MONO_ADD_INS (cfg->cbb, tls_get);
- /* It is enough to reset the from field */
- MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), 0);
- }
+ reset_cast_details (cfg);
}
/**
mono_ex = NULL;
}
- if (mono_ex && jit_tls->class_cast_from && !strcmp (mono_ex->object.vtable->klass->name, "InvalidCastException")) {
- char *from_name = mono_type_get_full_name (jit_tls->class_cast_from);
- char *to_name = mono_type_get_full_name (jit_tls->class_cast_to);
- char *msg = g_strdup_printf ("Unable to cast object of type '%s' to type '%s'.", from_name, to_name);
- mono_ex->message = mono_string_new (domain, msg);
- g_free (from_name);
- g_free (to_name);
- g_free (msg);
+ if (mono_ex && jit_tls->class_cast_from) {
+ if (!strcmp (mono_ex->object.vtable->klass->name, "InvalidCastException")) {
+ char *from_name = mono_type_get_full_name (jit_tls->class_cast_from);
+ char *to_name = mono_type_get_full_name (jit_tls->class_cast_to);
+ char *msg = g_strdup_printf ("Unable to cast object of type '%s' to type '%s'.", from_name, to_name);
+ mono_ex->message = mono_string_new (domain, msg);
+ g_free (from_name);
+ g_free (to_name);
+ g_free (msg);
+ }
+ if (!strcmp (mono_ex->object.vtable->klass->name, "ArrayTypeMismatchException")) {
+ char *from_name = mono_type_get_full_name (jit_tls->class_cast_from);
+ char *to_name = mono_type_get_full_name (jit_tls->class_cast_to);
+ char *msg = g_strdup_printf ("Source array of type '%s' cannot be cast to destination array type '%s'.", from_name, to_name);
+ mono_ex->message = mono_string_new (domain, msg);
+ g_free (from_name);
+ g_free (to_name);
+ g_free (msg);
+ }
}
if (!call_filter)