aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2017-05-20 13:43:19 -0700
committerPaul Eggert2017-05-20 13:43:56 -0700
commit848c90e3d43ed7baebab5f2d02d0a9601c6a142b (patch)
treecfed760dee64a5d4e7185b897e73e29ad52d9ab3 /src
parent31fded0370c3aa6d2c4370cae21cdb7475873483 (diff)
downloademacs-848c90e3d43ed7baebab5f2d02d0a9601c6a142b.tar.gz
emacs-848c90e3d43ed7baebab5f2d02d0a9601c6a142b.zip
Minor fixes for arity ranges in emacs modules
* src/emacs-module.c (module_make_function): Check that arities fit into fixnums, for func-arity’s benefit. (funcall_module): Avoid unnecessary conversion to EMACS_INT. (module_function_arity): Allow arities greater than SHRT_MAX.
Diffstat (limited to 'src')
-rw-r--r--src/emacs-module.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 99be4a748ee..5ab69135952 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -358,8 +358,9 @@ module_make_function (emacs_env *env, ptrdiff_t min_arity, ptrdiff_t max_arity,
358 358
359 if (! (0 <= min_arity 359 if (! (0 <= min_arity
360 && (max_arity < 0 360 && (max_arity < 0
361 ? max_arity == emacs_variadic_function 361 ? (min_arity <= MOST_POSITIVE_FIXNUM
362 : min_arity <= max_arity))) 362 && max_arity == emacs_variadic_function)
363 : min_arity <= max_arity && max_arity <= MOST_POSITIVE_FIXNUM)))
363 xsignal2 (Qinvalid_arity, make_number (min_arity), make_number (max_arity)); 364 xsignal2 (Qinvalid_arity, make_number (min_arity), make_number (max_arity));
364 365
365 struct Lisp_Module_Function *envptr = allocate_module_function (); 366 struct Lisp_Module_Function *envptr = allocate_module_function ();
@@ -646,12 +647,11 @@ Lisp_Object
646funcall_module (const struct Lisp_Module_Function *const envptr, 647funcall_module (const struct Lisp_Module_Function *const envptr,
647 ptrdiff_t nargs, Lisp_Object *arglist) 648 ptrdiff_t nargs, Lisp_Object *arglist)
648{ 649{
649 EMACS_INT len = nargs;
650 eassume (0 <= envptr->min_arity); 650 eassume (0 <= envptr->min_arity);
651 if (! (envptr->min_arity <= len 651 if (! (envptr->min_arity <= nargs
652 && len <= (envptr->max_arity < 0 ? PTRDIFF_MAX : envptr->max_arity))) 652 && (envptr->max_arity < 0 || nargs <= envptr->max_arity)))
653 xsignal2 (Qwrong_number_of_arguments, module_format_fun_env (envptr), 653 xsignal2 (Qwrong_number_of_arguments, module_format_fun_env (envptr),
654 make_number (len)); 654 make_number (nargs));
655 655
656 emacs_env pub; 656 emacs_env pub;
657 struct emacs_env_private priv; 657 struct emacs_env_private priv;
@@ -663,12 +663,12 @@ funcall_module (const struct Lisp_Module_Function *const envptr,
663 args = (emacs_value *) arglist; 663 args = (emacs_value *) arglist;
664 else 664 else
665 { 665 {
666 args = SAFE_ALLOCA (len * sizeof *args); 666 args = SAFE_ALLOCA (nargs * sizeof *args);
667 for (ptrdiff_t i = 0; i < len; i++) 667 for (ptrdiff_t i = 0; i < nargs; i++)
668 args[i] = lisp_to_value (arglist[i]); 668 args[i] = lisp_to_value (arglist[i]);
669 } 669 }
670 670
671 emacs_value ret = envptr->subr (&pub, len, args, envptr->data); 671 emacs_value ret = envptr->subr (&pub, nargs, args, envptr->data);
672 SAFE_FREE (); 672 SAFE_FREE ();
673 673
674 eassert (&priv == pub.private_members); 674 eassert (&priv == pub.private_members);
@@ -700,8 +700,8 @@ funcall_module (const struct Lisp_Module_Function *const envptr,
700Lisp_Object 700Lisp_Object
701module_function_arity (const struct Lisp_Module_Function *const function) 701module_function_arity (const struct Lisp_Module_Function *const function)
702{ 702{
703 const short minargs = function->min_arity; 703 ptrdiff_t minargs = function->min_arity;
704 const short maxargs = function->max_arity; 704 ptrdiff_t maxargs = function->max_arity;
705 return Fcons (make_number (minargs), 705 return Fcons (make_number (minargs),
706 maxargs == MANY ? Qmany : make_number (maxargs)); 706 maxargs == MANY ? Qmany : make_number (maxargs));
707} 707}