diff options
| author | Paul Eggert | 2017-05-20 13:43:19 -0700 |
|---|---|---|
| committer | Paul Eggert | 2017-05-20 13:43:56 -0700 |
| commit | 848c90e3d43ed7baebab5f2d02d0a9601c6a142b (patch) | |
| tree | cfed760dee64a5d4e7185b897e73e29ad52d9ab3 /src | |
| parent | 31fded0370c3aa6d2c4370cae21cdb7475873483 (diff) | |
| download | emacs-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.c | 22 |
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 | |||
| 646 | funcall_module (const struct Lisp_Module_Function *const envptr, | 647 | funcall_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, | |||
| 700 | Lisp_Object | 700 | Lisp_Object |
| 701 | module_function_arity (const struct Lisp_Module_Function *const function) | 701 | module_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 | } |