Add support for --debug=casts to Array:SetValue (). Fixes #668851.
authorZoltan Varga <vargaz@gmail.com>
Wed, 2 Feb 2011 23:25:29 +0000 (00:25 +0100)
committerZoltan Varga <vargaz@gmail.com>
Wed, 2 Feb 2011 23:26:34 +0000 (00:26 +0100)
mono/metadata/icall.c
mono/metadata/object-internals.h
mono/mini/mini-exceptions.c
mono/mini/mini.c
mono/mini/mini.h

index aed1b2cd274ba7b84943a998731ae9cc5aa5bf70..2882df214700c75ae41d24060d2fa09c211f54e2 100644 (file)
@@ -246,7 +246,8 @@ ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32
                        "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
 
index 79280485bf5896b39da40d1279e7789475286262..7348edcfcb6ec59ec7548447d1060ee2e8dee216 100644 (file)
@@ -568,6 +568,7 @@ typedef struct {
        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 */
index 251d15293b25127cf4007fd387257ecd01d4582d..5576d41441835a1a14431232acb5600e1156c0a0 100644 (file)
@@ -2379,3 +2379,15 @@ mono_install_handler_block_guard (MonoInternalThread *thread, MonoContext *ctx)
 
 #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;
+       }
+}
+
index fe46ef3ea6a5a5ab2c4661229c8db7a340277bab..b2d6192cf05d7b80c8e94935e7eee8bb2a79e417 100644 (file)
@@ -6176,6 +6176,7 @@ mini_init (const char *filename, const char *runtime_version)
        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) {
index 012fe0a5b90fc5639edf84b87156956b5193296d..ceaed63f10923df15109e59c229885b0eb15bd02 100644 (file)
@@ -2136,6 +2136,7 @@ MonoBoolean ves_icall_get_frame_info            (gint32 skip, MonoBoolean need_f
                                                 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;