diff options
author | Philipp Stephani <phst@google.com> | 2017-05-13 16:29:40 +0200 |
---|---|---|
committer | Philipp Stephani <phst@google.com> | 2017-05-20 15:32:52 +0200 |
commit | 31fded0370c3aa6d2c4370cae21cdb7475873483 (patch) | |
tree | acf2a7fda2d1b801b3aaf4cc9f168d3b6da77ec0 /src/doc.c | |
parent | 6c7bf039e9c2e6daf548a95204740eeaf4c61abd (diff) | |
download | emacs-31fded0370c3aa6d2c4370cae21cdb7475873483.tar.gz |
Reimplement module functions
Instead of a lambda, create a new type containing all data required to
call the function, and support it in the evaluator. Because this type
now also needs to store the function documentation, it is too big for
Lisp_Misc; use a pseudovector instead. That also has the nice benefit
that we don't have to add special support to the garbage collector.
Since the new type is user-visible, give it a predicate.
Now we can easily support 'help-function-args' and 'func-arity'; add
unit tests for these.
* src/lisp.h (allocate_module_function, MODULE_FUNCTIONP)
(XMODULE_FUNCTION): New pseudovector type 'module function'.
* src/eval.c (FUNCTIONP): Also treat module functions as functions.
(funcall_lambda, Ffuncall, eval_sub): Add support for calling module
functions.
(Ffunc_arity): Add support for detecting the arity of module
functions.
* src/emacs-module.c (module_make_function): Adapt to new structure.
Return module function object directly instead of wrapping it in a
lambda; remove FIXME.
(funcall_module): New function to call module functions. Replaces
`internal--module-call' and is called directly from eval.c.
(syms_of_module): Remove internal helper function, which is no longer
needed.
(module_function_arity): New helper function.
* src/data.c (Ftype_of): Adapt to new implementation.
(Fmodule_function_p, syms_of_data): New user-visible function. Now
that module functions are first-class objects, they deserve a
predicate. Define it even if not compiled with --enable-modules so
that Lisp code doesn't have to check for the function's existence.
* src/doc.c (Fdocumentation): Support module functions.
* src/print.c (print_object): Adapt to new implementation.
* src/alloc.c (mark_object): Specialized garbage collector support is
no longer needed.
* lisp/help.el (help-function-arglist): Support module functions.
While there, simplify the arity calculation by using `func-arity',
which does the right thing for all kinds of functions.
* test/data/emacs-module/mod-test.c: Amend docstring so we can test
the argument list.
* test/src/emacs-module-tests.el (mod-test-sum-docstring): Adapt to
new docstring.
(mod-test-non-local-exit-signal-test): Because `internal--module-call'
is gone, the backtrace has changed and no longer leaks the
implementation.
(module--func-arity): New test for `func-arity'.
(module--help-function-arglist): New test for `help-function-arglist'.
Diffstat (limited to 'src/doc.c')
-rw-r--r-- | src/doc.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/doc.c b/src/doc.c index dd674e3bc05..345e18b9186 100644 --- a/src/doc.c +++ b/src/doc.c @@ -340,6 +340,8 @@ string is passed through `substitute-command-keys'. */) fun = XCDR (fun); if (SUBRP (fun)) doc = make_number (XSUBR (fun)->doc); + else if (MODULE_FUNCTIONP (fun)) + doc = XMODULE_FUNCTION (fun)->documentation; else if (COMPILEDP (fun)) { if (PVSIZE (fun) <= COMPILED_DOC_STRING) |