changeset 375:d83b686dcf63

js: add Mlk.setTrace function
author David Demelier <markand@malikania.fr>
date Tue, 02 Nov 2021 15:22:14 +0100
parents 76ecec33dc9b
children b75fa5f47bf0
files src/libmlk-core-js/core/js-trace.c src/libmlk-core/core/trace.c src/libmlk-core/core/trace.h
diffstat 3 files changed, 41 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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       }
 };
 
--- 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, ...)
--- 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