#include "seq-points.h"
#include "llvm-runtime.h"
#include "mini-llvm.h"
+#include "interp/interp.h"
#ifdef ENABLE_LLVM
#include "mini-llvm-cpp.h"
#ifdef MONO_ARCH_HAVE_EXCEPTIONS_INIT
mono_arch_exceptions_init ();
#endif
- cbs.mono_walk_stack_with_ctx = mono_runtime_walk_stack_with_ctx;
+#ifdef ENABLE_INTERPRETER
+ if (mono_use_interpreter)
+ cbs.mono_walk_stack_with_ctx = interp_walk_stack_with_ctx;
+ else
+#endif
+ cbs.mono_walk_stack_with_ctx = mono_runtime_walk_stack_with_ctx;
+
cbs.mono_walk_stack_with_state = mono_walk_stack_with_state;
if (mono_llvm_only)
}
/* Class lazy loading functions */
-static GENERATE_GET_CLASS_WITH_CACHE (runtime_compat_attr, System.Runtime.CompilerServices, RuntimeCompatibilityAttribute)
+static GENERATE_GET_CLASS_WITH_CACHE (runtime_compat_attr, "System.Runtime.CompilerServices", "RuntimeCompatibilityAttribute")
/*
* wrap_non_exception_throws:
static MonoArray*
build_native_trace (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
/* This puppy only makes sense on mobile, IOW, ARM. */
#if defined (HAVE_BACKTRACE_SYMBOLS) && defined (TARGET_ARM)
MonoArray *res;
}
static void
-setup_stack_trace (MonoException *mono_ex, GSList *dynamic_methods, MonoArray *initial_trace_ips, GList **trace_ips)
+setup_stack_trace (MonoException *mono_ex, GSList *dynamic_methods, GList **trace_ips)
{
- if (mono_ex && !initial_trace_ips) {
+ if (mono_ex) {
*trace_ips = g_list_reverse (*trace_ips);
MonoError error;
MonoArray *ips_arr = mono_glist_to_array (*trace_ips, mono_defaults.int_class, &error);
static int (*call_filter) (MonoContext *, gpointer) = NULL;
MonoJitTlsData *jit_tls = (MonoJitTlsData *)mono_tls_get_jit_tls ();
MonoLMF *lmf = mono_get_lmf ();
- MonoArray *initial_trace_ips = NULL;
GList *trace_ips = NULL;
GSList *dynamic_methods = NULL;
MonoException *mono_ex;
stack_overflow = TRUE;
mono_ex = (MonoException*)obj;
- initial_trace_ips = mono_ex->trace_ips;
+ MonoArray *initial_trace_ips = mono_ex->trace_ips;
+ if (initial_trace_ips) {
+ int len = mono_array_length (initial_trace_ips) >> 1;
+
+ for (i = 0; i < (len - 1); i++) {
+ gpointer ip = mono_array_get (initial_trace_ips, gpointer, i * 2 + 0);
+ gpointer generic_info = mono_array_get (initial_trace_ips, gpointer, i * 2 + 1);
+ trace_ips = g_list_prepend (trace_ips, ip);
+ trace_ips = g_list_prepend (trace_ips, generic_info);
+ }
+ }
- if (mono_object_isinst_checked (obj, mono_defaults.exception_class, &error)) {
- mono_ex = (MonoException*)obj;
- initial_trace_ips = mono_ex->trace_ips;
- } else {
+ if (!mono_object_isinst_checked (obj, mono_defaults.exception_class, &error)) {
mono_error_assert_ok (&error);
mono_ex = NULL;
}
}
if (!unwind_res) {
- setup_stack_trace (mono_ex, dynamic_methods, initial_trace_ips, &trace_ips);
+ setup_stack_trace (mono_ex, dynamic_methods, &trace_ips);
g_slist_free (dynamic_methods);
return FALSE;
}
}
if (method->wrapper_type != MONO_WRAPPER_RUNTIME_INVOKE && mono_ex) {
- /*
- * Avoid overwriting the stack trace if the exception is
- * rethrown. Also avoid giant stack traces during a stack
- * overflow.
- */
- if (!initial_trace_ips && (frame_count < 1000)) {
+ // avoid giant stack traces during a stack overflow
+ if (frame_count < 1000) {
trace_ips = g_list_prepend (trace_ips, MONO_CONTEXT_GET_IP (ctx));
- trace_ips = g_list_prepend (trace_ips,
- get_generic_info_from_stack_frame (ji, ctx));
+ trace_ips = g_list_prepend (trace_ips, get_generic_info_from_stack_frame (ji, ctx));
}
}
ex_obj = obj;
if (ei->flags == MONO_EXCEPTION_CLAUSE_FILTER) {
- gboolean is_user_frame = method->wrapper_type == MONO_WRAPPER_NONE || method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD;
#ifndef DISABLE_PERFCOUNTERS
mono_perfcounters->exceptions_filters++;
#endif
- /*
- Here's the thing, if this is a filter clause done by a wrapper like runtime invoke, we don't want to
- trim the stackframe since if it returns FALSE we lose information.
-
- FIXME Not 100% sure if it's a good idea even with user clauses.
- */
- if (is_user_frame)
- setup_stack_trace (mono_ex, dynamic_methods, initial_trace_ips, &trace_ips);
#ifndef MONO_CROSS_COMPILE
#ifdef MONO_CONTEXT_SET_LLVM_EXC_REG
filter_idx ++;
if (filtered) {
- if (!is_user_frame)
- setup_stack_trace (mono_ex, dynamic_methods, initial_trace_ips, &trace_ips);
+ setup_stack_trace (mono_ex, dynamic_methods, &trace_ips);
g_slist_free (dynamic_methods);
/* mono_debugger_agent_handle_exception () needs this */
mini_set_abort_threshold (ctx);
}
MonoError isinst_error;
- mono_error_init (&isinst_error);
+ error_init (&isinst_error);
if (ei->flags == MONO_EXCEPTION_CLAUSE_NONE && mono_object_isinst_checked (ex_obj, catch_class, &error)) {
- setup_stack_trace (mono_ex, dynamic_methods, initial_trace_ips, &trace_ips);
+ setup_stack_trace (mono_ex, dynamic_methods, &trace_ips);
g_slist_free (dynamic_methods);
if (out_ji)
filter_idx ++;
}
- mono_error_init (&error);
+ error_init (&error);
if ((ei->flags == MONO_EXCEPTION_CLAUSE_NONE &&
mono_object_isinst_checked (ex_obj, catch_class, &error)) || filtered) {
/*
if (is_outside) {
jit_tls->handler_block_return_address = NULL;
jit_tls->handler_block = NULL;
- mono_thread_resume_interruption (); /*We ignore the exception here, it will be raised later*/
+ mono_thread_resume_interruption (TRUE); /*We ignore the exception here, it will be raised later*/
}
}
#ifndef MONO_CROSS_COMPILE
-static void print_process_map ()
+static void print_process_map (void)
{
#ifdef __linux__
FILE *fp = fopen ("/proc/self/maps", "r");
if (handling_sigsegv && is_sigsegv)
return;
- if (mini_get_debug_options ()->suspend_on_sigsegv && is_sigsegv) {
+ if (mini_get_debug_options ()->suspend_on_native_crash) {
mono_runtime_printf_err ("Received %s, suspending...", signal);
#ifdef HOST_WIN32
while (1)
MonoThreadInfo *thread = mono_thread_info_current_unchecked ();
if (!thread) {
ctx->valid = FALSE;
- g_error ("Invoked mono_thread_state_init_from_sigctx from non-Mono thread");
return FALSE;
}