2004-02-29 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / jit / exception.c
index fb623774527a08ae10b145d0c730723fab4477b7..59b4c811a9ce0504d699148e13b69c429478a932 100644 (file)
 #include <mono/metadata/tabledefs.h>
 #include <mono/metadata/threads.h>
 #include <mono/metadata/debug-helpers.h>
+#include <mono/metadata/mono-debug.h>
 
 #include "jit.h"
 #include "codegen.h"
-#include "debug.h"
 
 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
 # define SC_EAX sc_eax
@@ -561,7 +561,7 @@ glist_to_array (GList *list)
  * start of the function or -1 if that info is not available.
  */
 static MonoJitInfo *
-mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoContext *ctx, 
+mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *res, MonoContext *ctx, 
                         MonoContext *new_ctx, char **trace, MonoLMF **lmf, int *native_offset,
                         gboolean *managed)
 {
@@ -601,11 +601,8 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoContex
                                *managed = TRUE;
 
                if (trace) {
-                       if (mono_debug_format != MONO_DEBUG_FORMAT_NONE)
-                               mono_debug_make_symbols ();
-
-                       source_location = mono_debug_source_location_from_address (ji->method, address, NULL);
-                       iloffset = mono_debug_il_offset_from_address (ji->method, address);
+                       source_location = mono_debug_source_location_from_address (ji->method, address, NULL, domain);
+                       iloffset = mono_debug_il_offset_from_address (ji->method, address, domain);
 
                        if (iloffset < 0)
                                tmpaddr = g_strdup_printf ("<0x%05x>", address);
@@ -643,10 +640,12 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoContex
                new_ctx->SC_EIP = *((int *)ctx->SC_EBP + 1) - 1;
                new_ctx->SC_EBP = *((int *)ctx->SC_EBP);
 
-               return ji;
+               *res = *ji;
+               return res;
 #ifdef MONO_USE_EXC_TABLES
        } else if ((ji = x86_unwind_native_frame (domain, jit_tls, ctx, new_ctx, *lmf, trace))) {
-               return ji;
+               *res = *ji;             
+               return res;
 #endif
        } else if (*lmf) {
                
@@ -657,9 +656,14 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoContex
 
                if (trace)
                        *trace = g_strdup_printf ("in (unmanaged) %s", mono_method_full_name ((*lmf)->method, TRUE));
-               
-               ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip);
-               g_assert (ji != NULL);
+
+
+               if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+                       *res = *ji;
+               } else {
+                       memset (res, 0, sizeof (MonoJitInfo));
+                       res->method = (*lmf)->method;
+               }
 
                new_ctx->SC_ESI = (*lmf)->esi;
                new_ctx->SC_EDI = (*lmf)->edi;
@@ -672,7 +676,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoContex
 
                *lmf = (*lmf)->previous_lmf;
 
-               return ji;
+               return res;
                
        }
 
@@ -686,6 +690,11 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
        MonoArray *res;
        MonoArray *ta = exc->trace_ips;
        int i, len;
+
+       if (ta == NULL) {
+               /* Exception is not thrown yet */
+               return mono_array_new (domain, mono_defaults.stack_frame_class, 0);
+       }
        
        len = mono_array_length (ta);
 
@@ -697,16 +706,22 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
                gpointer ip = mono_array_get (ta, gpointer, i);
 
                ji = mono_jit_info_table_find (domain, ip);
+               if (ji == NULL) {
+                       /* Unmanaged frame */
+                       mono_array_set (res, gpointer, i, sf);
+                       continue;
+               }
+
                g_assert (ji != NULL);
 
                sf->method = mono_method_get_object (domain, ji->method, NULL);
                sf->native_offset = (char *)ip - (char *)ji->code_start;
-               sf->il_offset = mono_debug_il_offset_from_address (ji->method, sf->native_offset);
+               sf->il_offset = mono_debug_il_offset_from_address (ji->method, sf->native_offset, domain);
 
                if (need_file_info) {
                        gchar *filename;
 
-                       filename = mono_debug_source_location_from_address (ji->method, sf->native_offset, &sf->line);
+                       filename = mono_debug_source_location_from_address (ji->method, sf->native_offset, &sf->line, domain);
 
                        sf->filename = mono_string_new (domain, filename ? filename : "<unknown>");
                        sf->column = 0;
@@ -725,7 +740,7 @@ mono_jit_walk_stack (MonoStackWalk func, gpointer user_data) {
        MonoDomain *domain = mono_domain_get ();
        MonoJitTlsData *jit_tls = TlsGetValue (mono_jit_tls_id);
        MonoLMF *lmf = jit_tls->lmf;
-       MonoJitInfo *ji;
+       MonoJitInfo *ji, rji;
        gint native_offset, il_offset;
        gboolean managed;
 
@@ -736,13 +751,13 @@ mono_jit_walk_stack (MonoStackWalk func, gpointer user_data) {
 
        while (MONO_CONTEXT_GET_BP (&ctx) < jit_tls->end_of_stack) {
                
-               ji = mono_arch_find_jit_info (domain, jit_tls, &ctx, &new_ctx, NULL, &lmf, &native_offset, &managed);
+               ji = mono_arch_find_jit_info (domain, jit_tls, &rji, &ctx, &new_ctx, NULL, &lmf, &native_offset, &managed);
                g_assert (ji);
 
                if (ji == (gpointer)-1)
                        return;
 
-               il_offset = mono_debug_il_offset_from_address (ji->method, native_offset);
+               il_offset = mono_debug_il_offset_from_address (ji->method, native_offset, domain);
 
                if (func (ji->method, native_offset, il_offset, managed, user_data))
                        return;
@@ -760,7 +775,7 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
        MonoDomain *domain = mono_domain_get ();
        MonoJitTlsData *jit_tls = TlsGetValue (mono_jit_tls_id);
        MonoLMF *lmf = jit_tls->lmf;
-       MonoJitInfo *ji;
+       MonoJitInfo *ji, rji;
        MonoContext ctx, new_ctx;
 
        MONO_CONTEXT_SET_IP (&ctx, ves_icall_get_frame_info);
@@ -769,7 +784,7 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
        skip++;
 
        do {
-               ji = mono_arch_find_jit_info (domain, jit_tls, &ctx, &new_ctx, NULL, &lmf, native_offset, NULL);
+               ji = mono_arch_find_jit_info (domain, jit_tls, &rji, &ctx, &new_ctx, NULL, &lmf, native_offset, NULL);
                ctx = new_ctx;
                
                if (!ji || ji == (gpointer)-1 || MONO_CONTEXT_GET_BP (&ctx) >= jit_tls->end_of_stack)
@@ -783,12 +798,12 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
        } while (skip >= 0);
 
        *method = mono_method_get_object (domain, ji->method, NULL);
-       *iloffset = mono_debug_il_offset_from_address (ji->method, *native_offset);
+       *iloffset = mono_debug_il_offset_from_address (ji->method, *native_offset, domain);
 
        if (need_file_info) {
                gchar *filename;
 
-               filename = mono_debug_source_location_from_address (ji->method, *native_offset, line);
+               filename = mono_debug_source_location_from_address (ji->method, *native_offset, line, domain);
 
                *file = mono_string_new (domain, filename ? filename : "<unknown>");
                *column = 0;
@@ -811,7 +826,7 @@ gboolean
 arch_handle_exception (MonoContext *ctx, gpointer obj, gboolean test_only)
 {
        MonoDomain *domain = mono_domain_get ();
-       MonoJitInfo *ji;
+       MonoJitInfo *ji, rji;
        static int (*call_filter) (MonoContext *, gpointer, gpointer) = NULL;
        MonoJitTlsData *jit_tls = TlsGetValue (mono_jit_tls_id);
        MonoLMF *lmf = jit_tls->lmf;            
@@ -836,11 +851,8 @@ arch_handle_exception (MonoContext *ctx, gpointer obj, gboolean test_only)
        if (!test_only) {
                MonoContext ctx_cp = *ctx;
                if (!arch_handle_exception (&ctx_cp, obj, TRUE)) {
-                       if (mono_break_on_exc) {
-                               if (mono_debug_format != MONO_DEBUG_FORMAT_NONE)
-                                       mono_debug_make_symbols ();
+                       if (mono_break_on_exc)
                                G_BREAKPOINT ();
-                       }
                        mono_unhandled_exception (obj);
                }
        }
@@ -849,7 +861,7 @@ arch_handle_exception (MonoContext *ctx, gpointer obj, gboolean test_only)
                MonoContext new_ctx;
                char *trace = NULL;
                
-               ji = mono_arch_find_jit_info (domain, jit_tls, ctx, &new_ctx, 
+               ji = mono_arch_find_jit_info (domain, jit_tls, &rji, ctx, &new_ctx, 
                                              test_only ? &trace : NULL, &lmf, NULL, NULL);
 
                if (!ji) {
@@ -939,3 +951,4 @@ arch_handle_exception (MonoContext *ctx, gpointer obj, gboolean test_only)
        g_assert_not_reached ();
 }
 
+