From 62879799ea0272f2ed3067252f20afb910bce352 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Sat, 25 Apr 2015 12:07:12 +0200 Subject: [PATCH] Fix a false negative in `map-elt' with alists and values being nil * lisp/emacs-lisp/map.el (map-elt): If map is an alist and key is found but its associated value is nil, do not return the default value. * test/automated/map-tests.el: Add a regression test. --- lisp/emacs-lisp/map.el | 13 +++++++++++-- test/automated/map-tests.el | 6 ++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/map.el b/lisp/emacs-lisp/map.el index 3984b08c44e..ebf1fe9589a 100644 --- a/lisp/emacs-lisp/map.el +++ b/lisp/emacs-lisp/map.el @@ -50,7 +50,7 @@ If KEY is not found, return DEFAULT which defaults to nil. If MAP is a list, `equal' is used to lookup KEY." (map--dispatch map - :list (or (cdr (assoc key map)) default) + :list (map--elt-list map key default) :hash-table (gethash key map default) :array (map--elt-array map key default))) @@ -253,8 +253,17 @@ form. (setq index (1+ index)))) map))) +(defun map--elt-list (map key &optional default) + "Return the element of the list MAP at the index KEY. +If KEY is not found, return DEFAULT which defaults to nil." + (let ((pair (assoc key map))) + (if pair + (cdr (assoc key map)) + default))) + (defun map--elt-array (map key &optional default) - "Return the element of the arary MAP at the index KEY, or DEFAULT if nil." + "Return the element of the array MAP at the index KEY. +If KEY is not found, return DEFAULT which defaults to nil." (let ((len (seq-length map))) (or (and (>= key 0) (<= key len) diff --git a/test/automated/map-tests.el b/test/automated/map-tests.el index 5201116613e..e65af894275 100644 --- a/test/automated/map-tests.el +++ b/test/automated/map-tests.el @@ -66,6 +66,12 @@ Evaluate BODY for each created map. (with-maps-do map (assert (= 5 (map-elt map 7 5))))) +(ert-deftest test-map-elt-with-nil-value () + (assert (null (map-elt '((a . 1) + (b)) + 'b + '2)))) + (ert-deftest test-map-put () (with-maps-do map (map-put map 2 'hello) -- 2.11.4.GIT