"value", "not a widening conversion")); \
}G_STMT_END
-#define INVALID_CAST G_STMT_START{\
+#define INVALID_CAST G_STMT_START{ \
+ mono_get_runtime_callbacks ()->set_cast_details (vc, ec); \
mono_raise_exception (mono_get_exception_invalid_cast ()); \
}G_STMT_END
char* (*get_runtime_build_info) (void);
gpointer (*get_vtable_trampoline) (int slot_index);
gpointer (*get_imt_trampoline) (int imt_slot_index);
+ void (*set_cast_details) (MonoClass *from, MonoClass *to);
} MonoRuntimeCallbacks;
/* used to free a dynamic method */
#endif
+void
+mono_set_cast_details (MonoClass *from, MonoClass *to)
+{
+ MonoJitTlsData *jit_tls = NULL;
+
+ if (mini_get_debug_options ()->better_cast_details) {
+ jit_tls = TlsGetValue (mono_jit_tls_id);
+ jit_tls->class_cast_from = from;
+ jit_tls->class_cast_to = to;
+ }
+}
+
callbacks.create_ftnptr = mini_create_ftnptr;
callbacks.get_addr_from_ftnptr = mini_get_addr_from_ftnptr;
callbacks.get_runtime_build_info = mono_get_runtime_build_info;
+ callbacks.set_cast_details = mono_set_cast_details;
#ifdef MONO_ARCH_HAVE_IMT
if (mono_use_imt) {
gint32 *iloffset, gint32 *native_offset,
MonoString **file, gint32 *line, gint32 *column) MONO_INTERNAL;
MonoString *ves_icall_System_Exception_get_trace (MonoException *exc) MONO_INTERNAL;
+void mono_set_cast_details (MonoClass *from, MonoClass *to) MONO_INTERNAL;
/* Dominator/SSA methods */
void mono_compile_dominator_info (MonoCompile *cfg, int dom_flags) MONO_INTERNAL;