From fc92c2d8942cf466aa6dbc422f2e798801b18408 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 5 Jan 2020 16:05:14 +0100 Subject: [PATCH] Also print function data when printing module functions. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This is especially useful in cases where modules only use a single entry point and use the data to dispatch to the actual function. Such a design is common for languages such as Go and C++. * src/emacs-module.c (module_function_data): New function. * src/print.c (print_vectorlike): Use it to print module function data if not NULL. (print_object): Adapt size of buffer. * test/data/emacs-module/mod-test.c (emacs_module_init): Pass some non-NULL data to ‘mod-test-sum’. (Fmod_test_sum): Check that correct data is passed through. * test/src/emacs-module-tests.el (mod-test-sum-test) (module-function-object): Adapt unit tests. --- src/emacs-module.c | 6 ++++++ src/lisp.h | 1 + src/print.c | 18 ++++++++++++++++-- test/data/emacs-module/mod-test.c | 5 ++++- test/src/emacs-module-tests.el | 6 ++++-- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/emacs-module.c b/src/emacs-module.c index 3855a33f254..f40ca931fa9 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -1098,6 +1098,12 @@ module_function_address (const struct Lisp_Module_Function *function) return (module_funcptr) function->subr; } +void * +module_function_data (const struct Lisp_Module_Function *function) +{ + return function->data; +} + /* Helper functions. */ diff --git a/src/lisp.h b/src/lisp.h index 9be7bfec5c0..e1bbb53ad49 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4245,6 +4245,7 @@ extern Lisp_Object module_function_documentation (struct Lisp_Module_Function const *); extern module_funcptr module_function_address (struct Lisp_Module_Function const *); +extern void *module_function_data (const struct Lisp_Module_Function *); extern void module_finalize_function (const struct Lisp_Module_Function *); extern void mark_modules (void); extern void init_module_assertions (bool); diff --git a/src/print.c b/src/print.c index 425b0dc4ee3..b373aaf6551 100644 --- a/src/print.c +++ b/src/print.c @@ -1796,7 +1796,8 @@ print_vectorlike (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag, case PVEC_MODULE_FUNCTION: { print_c_string ("#stack_top = buf; diff --git a/test/data/emacs-module/mod-test.c b/test/data/emacs-module/mod-test.c index 1a0a879a1bc..ec6948921f2 100644 --- a/test/data/emacs-module/mod-test.c +++ b/test/data/emacs-module/mod-test.c @@ -24,6 +24,7 @@ along with GNU Emacs. If not, see . */ #include #include +#include #include #include #include @@ -86,6 +87,7 @@ static emacs_value Fmod_test_sum (emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data) { assert (nargs == 2); + assert ((uintptr_t) data == 0x1234); intmax_t a = env->extract_integer (env, args[0]); intmax_t b = env->extract_integer (env, args[1]); @@ -587,7 +589,8 @@ emacs_module_init (struct emacs_runtime *ert) env->make_function (env, amin, amax, csym, doc, data)) DEFUN ("mod-test-return-t", Fmod_test_return_t, 1, 1, NULL, NULL); - DEFUN ("mod-test-sum", Fmod_test_sum, 2, 2, "Return A + B\n\n(fn a b)", NULL); + DEFUN ("mod-test-sum", Fmod_test_sum, 2, 2, "Return A + B\n\n(fn a b)", + (void *) (uintptr_t) 0x1234); DEFUN ("mod-test-signal", Fmod_test_signal, 0, 0, NULL, NULL); DEFUN ("mod-test-throw", Fmod_test_throw, 0, 0, NULL, NULL); DEFUN ("mod-test-non-local-exit-funcall", Fmod_test_non_local_exit_funcall, diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el index c61abfdf683..48d2e86a605 100644 --- a/test/src/emacs-module-tests.el +++ b/test/src/emacs-module-tests.el @@ -60,8 +60,9 @@ (should (eq 0 (string-match (concat "#") + "\\(at \\(0x\\)?[[:xdigit:]]+ " + "with data 0x1234\\( from .*\\)?" + "\\|Fmod_test_sum with data 0x1234 from .*\\)>") (prin1-to-string (nth 1 descr))))) (should (= (nth 2 descr) 3))) (should-error (mod-test-sum "1" 2) :type 'wrong-type-argument) @@ -97,6 +98,7 @@ changes." (rx bos "#" eos) (prin1-to-string func))))) -- 2.39.2