diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2022-08-31 14:31:31 +0200 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2022-09-01 10:11:53 +0200 |
commit | e7193902b23deb842f55c1cd9100b807e199f4bd (patch) | |
tree | afad58ebcd441b7ce52c418db25eb7e4d0145f4a /src/fns.c | |
parent | 941627f8d03ddf4cd0039902e494d0feabc88c85 (diff) | |
download | emacs-e7193902b23deb842f55c1cd9100b807e199f4bd.tar.gz emacs-e7193902b23deb842f55c1cd9100b807e199f4bd.tar.bz2 emacs-e7193902b23deb842f55c1cd9100b807e199f4bd.zip |
Better `take` and `ntake` bignum argument handling
* src/fns.c (Ftake, Fntake): Treat positive bignum arguments
as most-positive-fixnum which results in better error checking
of improper lists.
Diffstat (limited to 'src/fns.c')
-rw-r--r-- | src/fns.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/fns.c b/src/fns.c index 07102256fed..2f4808be3d0 100644 --- a/src/fns.c +++ b/src/fns.c @@ -1563,18 +1563,21 @@ If N is zero or negative, return nil. If N is greater or equal to the length of LIST, return LIST (or a copy). */) (Lisp_Object n, Lisp_Object list) { - if (BIGNUMP (n)) + EMACS_INT m; + if (FIXNUMP (n)) + { + m = XFIXNUM (n); + if (m <= 0) + return Qnil; + } + else if (BIGNUMP (n)) { if (mpz_sgn (*xbignum_val (n)) < 0) return Qnil; - CHECK_LIST (list); - return list; + m = MOST_POSITIVE_FIXNUM; } - if (!FIXNUMP (n)) + else wrong_type_argument (Qintegerp, n); - EMACS_INT m = XFIXNUM (n); - if (m <= 0) - return Qnil; CHECK_LIST (list); if (NILP (list)) return Qnil; @@ -1602,18 +1605,21 @@ If N is greater or equal to the length of LIST, return LIST unmodified. Otherwise, return LIST after truncating it. */) (Lisp_Object n, Lisp_Object list) { - if (BIGNUMP (n)) + EMACS_INT m; + if (FIXNUMP (n)) + { + m = XFIXNUM (n); + if (m <= 0) + return Qnil; + } + else if (BIGNUMP (n)) { if (mpz_sgn (*xbignum_val (n)) < 0) return Qnil; - CHECK_LIST (list); - return list; + m = MOST_POSITIVE_FIXNUM; } - if (!FIXNUMP (n)) + else wrong_type_argument (Qintegerp, n); - EMACS_INT m = XFIXNUM (n); - if (m <= 0) - return Qnil; CHECK_LIST (list); Lisp_Object tail = list; --m; |