From e1e60e51bf324aaa2137075827c4d08a331a7bef Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mattias=20Engdeg=C3=A5rd?= Date: Tue, 30 Aug 2022 16:44:51 +0200 Subject: [PATCH] Accept bignum arguments in `take` and `ntake` * src/fns.c (Ftake, Fntake): Accept any integer as first argument, for completeness. * test/src/fns-tests.el (fns--take-ntake): Add test cases. --- src/fns.c | 20 ++++++++++++++++++-- test/src/fns-tests.el | 10 +++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/fns.c b/src/fns.c index 7e78bba3a04..07102256fed 100644 --- a/src/fns.c +++ b/src/fns.c @@ -1563,7 +1563,15 @@ 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) { - CHECK_FIXNUM (n); + if (BIGNUMP (n)) + { + if (mpz_sgn (*xbignum_val (n)) < 0) + return Qnil; + CHECK_LIST (list); + return list; + } + if (!FIXNUMP (n)) + wrong_type_argument (Qintegerp, n); EMACS_INT m = XFIXNUM (n); if (m <= 0) return Qnil; @@ -1594,7 +1602,15 @@ 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) { - CHECK_FIXNUM (n); + if (BIGNUMP (n)) + { + if (mpz_sgn (*xbignum_val (n)) < 0) + return Qnil; + CHECK_LIST (list); + return list; + } + if (!FIXNUMP (n)) + wrong_type_argument (Qintegerp, n); EMACS_INT m = XFIXNUM (n); if (m <= 0) return Qnil; diff --git a/test/src/fns-tests.el b/test/src/fns-tests.el index a84cce3ad4e..4ef428af03e 100644 --- a/test/src/fns-tests.el +++ b/test/src/fns-tests.el @@ -1412,6 +1412,14 @@ (should (equal (take 5 list) '(a b c b c))) (should (equal (take 10 list) '(a b c b c b c b c b))) - (should (equal (ntake 10 list) '(a b))))) + (should (equal (ntake 10 list) '(a b)))) + + ;; Bignum N argument. + (let ((list (list 'a 'b 'c))) + (should (equal (take (+ most-positive-fixnum 1) list) '(a b c))) + (should (equal (take (- most-negative-fixnum 1) list) nil)) + (should (equal (ntake (+ most-positive-fixnum 1) list) '(a b c))) + (should (equal (ntake (- most-negative-fixnum 1) list) nil)) + (should (equal list '(a b c))))) ;;; fns-tests.el ends here -- 2.39.2