Wed Jun 11 18:01:06 CEST 2003 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / exceptions-x86.c
index 932102f790a695317806f7149c185cad19c387a2..fcea3156e86f7d8b441eca565f2d5c1bd751edc3 100644 (file)
@@ -511,7 +511,7 @@ arch_get_call_filter (void)
                return start;
 
        inited = 1;
-       /* call_filter (struct sigcontext *ctx, unsigned long eip, gpointer exc) */
+       /* call_filter (struct sigcontext *ctx, unsigned long eip) */
        code = start;
 
        x86_push_reg (code, X86_EBP);
@@ -526,21 +526,20 @@ arch_get_call_filter (void)
        x86_mov_reg_membase (code, X86_ECX, X86_EBP, 12, 4);
        /* save EBP */
        x86_push_reg (code, X86_EBP);
-       /* push exc */
-       x86_push_membase (code, X86_EBP, 16);
+
        /* set new EBP */
        x86_mov_reg_membase (code, X86_EBP, X86_EAX,  G_STRUCT_OFFSET (struct sigcontext, SC_EBP), 4);
        /* restore registers used by global register allocation (EBX & ESI) */
        x86_mov_reg_membase (code, X86_EBX, X86_EAX,  G_STRUCT_OFFSET (struct sigcontext, SC_EBX), 4);
        x86_mov_reg_membase (code, X86_ESI, X86_EAX,  G_STRUCT_OFFSET (struct sigcontext, SC_ESI), 4);
        x86_mov_reg_membase (code, X86_EDI, X86_EAX,  G_STRUCT_OFFSET (struct sigcontext, SC_EDI), 4);
-       /* save the ESP - this is used by endfinally */
-       x86_mov_membase_reg (code, X86_EBP, mono_exc_esp_offset, X86_ESP, 4);
+
        /* call the handler */
        x86_call_reg (code, X86_ECX);
-       x86_alu_reg_imm (code, X86_ADD, X86_ESP, 4);
+
        /* restore EBP */
        x86_pop_reg (code, X86_EBP);
+
        /* restore saved regs */
        x86_pop_reg (code, X86_ESI);
        x86_pop_reg (code, X86_EDI);
@@ -963,7 +962,7 @@ mono_arch_handle_exception (MonoContext *ctx, gpointer obj, gboolean test_only)
 {
        MonoDomain *domain = mono_domain_get ();
        MonoJitInfo *ji, rji;
-       static int (*call_filter) (MonoContext *, gpointer, gpointer) = NULL;
+       static int (*call_filter) (MonoContext *, gpointer) = NULL;
        MonoJitTlsData *jit_tls = TlsGetValue (mono_jit_tls_id);
        MonoLMF *lmf = jit_tls->lmf;            
        GList *trace_ips = NULL;
@@ -1037,20 +1036,28 @@ mono_arch_handle_exception (MonoContext *ctx, gpointer obj, gboolean test_only)
                                        if (ei->try_start <= MONO_CONTEXT_GET_IP (ctx) && 
                                            MONO_CONTEXT_GET_IP (ctx) <= ei->try_end) { 
                                                /* catch block */
+
+                                               if ((ei->flags == MONO_EXCEPTION_CLAUSE_NONE) || (ei->flags == MONO_EXCEPTION_CLAUSE_FILTER)) {
+                                                       /* store the exception object int cfg->excvar */
+                                                       g_assert (ji->exvar_offset);
+                                                       *((gpointer *)((char *)MONO_CONTEXT_GET_BP (ctx) + ji->exvar_offset)) = obj;
+                                               }
+
                                                if ((ei->flags == MONO_EXCEPTION_CLAUSE_NONE && 
                                                     mono_object_isinst (obj, mono_class_get (ji->method->klass->image, ei->data.token))) ||
                                                    ((ei->flags == MONO_EXCEPTION_CLAUSE_FILTER &&
-                                                     call_filter (ctx, ei->data.filter, obj)))) {
+                                                     call_filter (ctx, ei->data.filter)))) {
                                                        if (test_only) {
                                                                ((MonoException*)obj)->trace_ips = glist_to_array (trace_ips);
                                                                g_list_free (trace_ips);
+                                                               g_free (trace);
                                                                return TRUE;
                                                        }
                                                        if (mono_jit_trace_calls)
                                                                g_print ("EXCEPTION: catch found at clause %d of %s\n", i, mono_method_full_name (ji->method, TRUE));
                                                        MONO_CONTEXT_SET_IP (ctx, ei->handler_start);
-                                                       *((gpointer *)((char *)MONO_CONTEXT_GET_BP (ctx) + ji->exvar_offset)) = obj;
                                                        jit_tls->lmf = lmf;
+                                                       g_free (trace);
                                                        return 0;
                                                }
                                                if (!test_only && ei->try_start <= MONO_CONTEXT_GET_IP (ctx) && 
@@ -1058,7 +1065,7 @@ mono_arch_handle_exception (MonoContext *ctx, gpointer obj, gboolean test_only)
                                                    (ei->flags & MONO_EXCEPTION_CLAUSE_FINALLY)) {
                                                        if (mono_jit_trace_calls)
                                                                g_print ("EXCEPTION: finally clause %d of %s\n", i, mono_method_full_name (ji->method, TRUE));
-                                                       call_filter (ctx, ei->handler_start, NULL);
+                                                       call_filter (ctx, ei->handler_start);
                                                }
                                                
                                        }