]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix printing of hash tables with removed elements
authorPip Cet <pipcet@gmail.com>
Sun, 20 Sep 2020 10:24:16 +0000 (12:24 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 20 Sep 2020 10:24:16 +0000 (12:24 +0200)
* src/print.c (print_vectorlike): Keep track of the actual number
of elements printed rather than attempting to use hash bucket
indices (bug#38892).

src/print.c
test/src/print-tests.el

index bd1769144e039696b08054d4119f24db14f8cd98..0ecc98f37bf0f3fe9e1795fd53ae748d8175d398 100644 (file)
@@ -1590,27 +1590,34 @@ print_vectorlike (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag,
 
        /* Print the data here as a plist. */
        ptrdiff_t real_size = HASH_TABLE_SIZE (h);
-       ptrdiff_t size = real_size;
+       ptrdiff_t size = h->count;
 
        /* Don't print more elements than the specified maximum.  */
        if (FIXNATP (Vprint_length) && XFIXNAT (Vprint_length) < size)
          size = XFIXNAT (Vprint_length);
 
        printchar ('(', printcharfun);
-       for (ptrdiff_t i = 0; i < size; i++)
+       ptrdiff_t j = 0;
+       for (ptrdiff_t i = 0; i < real_size; i++)
           {
             Lisp_Object key = HASH_KEY (h, i);
            if (!EQ (key, Qunbound))
              {
-               if (i) printchar (' ', printcharfun);
+               if (j++) printchar (' ', printcharfun);
                print_object (key, printcharfun, escapeflag);
                printchar (' ', printcharfun);
                print_object (HASH_VALUE (h, i), printcharfun, escapeflag);
+               if (j == size)
+                 break;
              }
           }
 
-       if (size < real_size)
-         print_c_string (" ...", printcharfun);
+       if (j < h->count)
+         {
+           if (j)
+             printchar (' ', printcharfun);
+           print_c_string ("...", printcharfun);
+         }
 
        print_c_string ("))", printcharfun);
       }
index 42e5962137c344f866b594b1be0ef494cbe43b53..51ef16dd85a3fd31b4fc58599ed7bf19de4cec8b 100644 (file)
@@ -355,5 +355,33 @@ otherwise, use a different charset."
     (setcdr err err)
     (should-error (error-message-string err) :type 'circular-list)))
 
+(print-tests--deftest print-hash-table-test ()
+  (should
+   (string-match
+    "data (2 3)"
+    (let ((h (make-hash-table)))
+      (puthash 1 2 h)
+      (puthash 2 3 h)
+      (remhash 1 h)
+      (format "%S" h))))
+
+  (should
+   (string-match
+    "data ()"
+    (let ((h (make-hash-table)))
+      (let ((print-length 0))
+        (format "%S" h)))))
+
+  (should
+   (string-match
+    "data (99 99"
+    (let ((h (make-hash-table)))
+      (dotimes (i 100)
+        (puthash i i h))
+      (dotimes (i 99)
+        (remhash i h))
+      (let ((print-length 1))
+        (format "%S" h))))))
+
 (provide 'print-tests)
 ;;; print-tests.el ends here