# HG changeset patch # User David Demelier # Date 1635862934 -3600 # Node ID d83b686dcf634426a76028ff11be745f1b6f1a53 # Parent 76ecec33dc9b06dc016b7c7a656e3ac6d60a14c5 js: add Mlk.setTrace function diff -r 76ecec33dc9b -r d83b686dcf63 src/libmlk-core-js/core/js-trace.c --- a/src/libmlk-core-js/core/js-trace.c Mon Oct 25 21:17:30 2021 +0200 +++ b/src/libmlk-core-js/core/js-trace.c Tue Nov 02 15:22:14 2021 +0100 @@ -22,6 +22,27 @@ #include "js-trace.h" +#define TRACE_CB DUK_HIDDEN_SYMBOL("Mlk.traceHandler") + +static void +handler(const char *msg) +{ + duk_context *ctx = trace_data; + + duk_push_global_stash(ctx); + duk_get_prop_string(ctx, -1, TRACE_CB); + duk_remove(ctx, -2); + + if (duk_is_callable(ctx, -1)) { + duk_push_string(ctx, msg); + duk_call(ctx, 1); + duk_pop(ctx); + } else { + fprintf(stderr, "abort: javascript panic handler not callable\n"); + exit(1); + } +} + static duk_ret_t Mlk_trace(duk_context *ctx) { @@ -30,8 +51,26 @@ return 0; } +static duk_ret_t +Mlk_setTrace(duk_context *ctx) +{ + if (!duk_is_callable(ctx, 0)) + return duk_error(ctx, DUK_ERR_TYPE_ERROR, "handler not callable"); + + duk_push_global_stash(ctx); + duk_dup(ctx, 0); + duk_put_prop_string(ctx, -2, TRACE_CB); + duk_pop(ctx); + + trace_handler = handler; + trace_data = ctx; + + return 0; +} + static const duk_function_list_entry functions[] = { { "trace", Mlk_trace, 1 }, + { "setTrace", Mlk_setTrace, 1 }, { NULL, NULL, 0 } }; diff -r 76ecec33dc9b -r d83b686dcf63 src/libmlk-core/core/trace.c --- a/src/libmlk-core/core/trace.c Mon Oct 25 21:17:30 2021 +0200 +++ b/src/libmlk-core/core/trace.c Tue Nov 02 15:22:14 2021 +0100 @@ -30,6 +30,7 @@ } void (*trace_handler)(const char *) = default_handler; +void *trace_data = NULL; void tracef(const char *fmt, ...) diff -r 76ecec33dc9b -r d83b686dcf63 src/libmlk-core/core/trace.h --- a/src/libmlk-core/core/trace.h Mon Oct 25 21:17:30 2021 +0200 +++ b/src/libmlk-core/core/trace.h Tue Nov 02 15:22:14 2021 +0100 @@ -26,6 +26,7 @@ #define TRACE_LINE_MAX (1024) extern void (*trace_handler)(const char *); +extern void *trace_data; CORE_BEGIN_DECLS