summaryrefslogtreecommitdiff
path: root/src/emacs-module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emacs-module.c')
-rw-r--r--src/emacs-module.c50
1 files changed, 22 insertions, 28 deletions
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 0bc1b6c384b..99be4a748ee 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -362,30 +362,24 @@ module_make_function (emacs_env *env, ptrdiff_t min_arity, ptrdiff_t max_arity,
: min_arity <= max_arity)))
xsignal2 (Qinvalid_arity, make_number (min_arity), make_number (max_arity));
- Lisp_Object envobj = make_module_function ();
- struct Lisp_Module_Function *envptr = XMODULE_FUNCTION (envobj);
+ struct Lisp_Module_Function *envptr = allocate_module_function ();
envptr->min_arity = min_arity;
envptr->max_arity = max_arity;
envptr->subr = subr;
envptr->data = data;
- Lisp_Object doc = Qnil;
if (documentation)
{
AUTO_STRING (unibyte_doc, documentation);
- doc = code_convert_string_norecord (unibyte_doc, Qutf_8, false);
+ envptr->documentation =
+ code_convert_string_norecord (unibyte_doc, Qutf_8, false);
}
- /* FIXME: Use a bytecompiled object, or even better a subr. */
- Lisp_Object ret = list4 (Qlambda,
- list2 (Qand_rest, Qargs),
- doc,
- list4 (Qapply,
- list2 (Qfunction, Qinternal__module_call),
- envobj,
- Qargs));
+ Lisp_Object envobj;
+ XSET_MODULE_FUNCTION (envobj, envptr);
+ eassert (MODULE_FUNCTIONP (envobj));
- return lisp_to_value (ret);
+ return lisp_to_value (envobj);
}
static emacs_value
@@ -648,17 +642,11 @@ DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0,
return Qt;
}
-DEFUN ("internal--module-call", Finternal_module_call, Sinternal_module_call, 1, MANY, 0,
- doc: /* Internal function to call a module function.
-ENVOBJ is a save pointer to a module_fun_env structure.
-ARGLIST is a list of arguments passed to SUBRPTR.
-usage: (module-call ENVOBJ &rest ARGLIST) */)
- (ptrdiff_t nargs, Lisp_Object *arglist)
+Lisp_Object
+funcall_module (const struct Lisp_Module_Function *const envptr,
+ ptrdiff_t nargs, Lisp_Object *arglist)
{
- Lisp_Object envobj = arglist[0];
- CHECK_TYPE (MODULE_FUNCTIONP (envobj), Qmodule_function_p, envobj);
- struct Lisp_Module_Function *envptr = XMODULE_FUNCTION (envobj);
- EMACS_INT len = nargs - 1;
+ EMACS_INT len = nargs;
eassume (0 <= envptr->min_arity);
if (! (envptr->min_arity <= len
&& len <= (envptr->max_arity < 0 ? PTRDIFF_MAX : envptr->max_arity)))
@@ -672,12 +660,12 @@ usage: (module-call ENVOBJ &rest ARGLIST) */)
USE_SAFE_ALLOCA;
emacs_value *args;
if (plain_values)
- args = (emacs_value *) arglist + 1;
+ args = (emacs_value *) arglist;
else
{
args = SAFE_ALLOCA (len * sizeof *args);
for (ptrdiff_t i = 0; i < len; i++)
- args[i] = lisp_to_value (arglist[i + 1]);
+ args[i] = lisp_to_value (arglist[i]);
}
emacs_value ret = envptr->subr (&pub, len, args, envptr->data);
@@ -709,6 +697,15 @@ usage: (module-call ENVOBJ &rest ARGLIST) */)
}
}
+Lisp_Object
+module_function_arity (const struct Lisp_Module_Function *const function)
+{
+ const short minargs = function->min_arity;
+ const short maxargs = function->max_arity;
+ return Fcons (make_number (minargs),
+ maxargs == MANY ? Qmany : make_number (maxargs));
+}
+
/* Helper functions. */
@@ -1025,7 +1022,4 @@ syms_of_module (void)
DEFSYM (Qmodule_function_p, "module-function-p");
defsubr (&Smodule_load);
-
- DEFSYM (Qinternal__module_call, "internal--module-call");
- defsubr (&Sinternal_module_call);
}