private static string duk_get_stacktrace(IntPtr ctx) { var stacktrace = "stacktrace:\n"; for (int i = -2; ; i--) { DuktapeDLL.duk_inspect_callstack_entry(ctx, i); if (!DuktapeDLL.duk_is_undefined(ctx, -1)) { DuktapeDLL.duk_get_prop_string(ctx, -1, "lineNumber"); var lineNumber = DuktapeDLL.duk_to_int(ctx, -1); DuktapeDLL.duk_get_prop_string(ctx, -2, "function"); DuktapeDLL.duk_get_prop_string(ctx, -1, "name"); var funcName = DuktapeDLL.duk_safe_to_string(ctx, -1); DuktapeDLL.duk_get_prop_string(ctx, -2, "fileName"); var fileName = DuktapeDLL.duk_safe_to_string(ctx, -1); DuktapeDLL.duk_pop_n(ctx, 4); stacktrace += (duk_source_position ?? default_duk_source_position)(ctx, funcName, fileName, lineNumber); stacktrace += "\n"; } else { DuktapeDLL.duk_pop(ctx); break; } } return(stacktrace); }
private static string duk_get_stacktrace(IntPtr ctx) { var stacktrace = "\n"; uint malloc_count = 0; uint malloc_size = 0; var vm = DuktapeVM.GetVM(ctx); if (vm != null) { vm.GetMemoryState(out malloc_count, out malloc_size); if (malloc_count != 0) { stacktrace += $"allocations: {malloc_count} [{malloc_size}]\n"; } } stacktrace += "stacktrace:\n"; for (int i = -2; ; i--) { DuktapeDLL.duk_inspect_callstack_entry(ctx, i); if (!DuktapeDLL.duk_is_undefined(ctx, -1)) { DuktapeDLL.duk_get_prop_string(ctx, -1, "lineNumber"); var lineNumber = DuktapeDLL.duk_to_int(ctx, -1); DuktapeDLL.duk_get_prop_string(ctx, -2, "function"); DuktapeDLL.duk_get_prop_string(ctx, -1, "name"); var funcName = DuktapeDLL.duk_safe_to_string(ctx, -1); DuktapeDLL.duk_get_prop_string(ctx, -2, "fileName"); var fileName = DuktapeDLL.duk_safe_to_string(ctx, -1); DuktapeDLL.duk_pop_n(ctx, 4); stacktrace += (duk_source_position ?? default_duk_source_position)(ctx, funcName, fileName, lineNumber); stacktrace += "\n"; } else { DuktapeDLL.duk_pop(ctx); break; } } return(stacktrace); }