* bug#38892: 28.0.50: Hash table printing oddities
@ 2020-01-03 12:13 Pip Cet
2020-01-11 9:42 ` Eli Zaretskii
0 siblings, 1 reply; 3+ messages in thread
From: Pip Cet @ 2020-01-03 12:13 UTC (permalink / raw)
To: 38892
[-- Attachment #1: Type: text/plain, Size: 959 bytes --]
The hash table printing code has some oddities: it will print extra
spaces sometimes, won't print as many elements as requested under all
circumstances, and behave oddly for empty hash tables when
print-length is 0.
Currently, this code will result in extra spaces in the hash table output:
(let ((h (make-hash-table)))
(puthash 1 2 h)
(puthash 2 3 h)
(remhash 1 h)
(format "%S" h))
(let ((h (make-hash-table)))
(let ((print-length 0))
(format "%S" h)))
In the latter case, the output actually includes "data ( ...)", though
"data ()" would be shorter and more accurate.
Also, the current code contains an oddity that would make it print
fewer than print-length hash cells in the data list:
(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)))
will produce "data ( ...)", when it should produce "data (99 99)".
Proposed patch attached.
[-- Attachment #2: 0001-Fix-hash-table-printing.patch --]
[-- Type: text/x-patch, Size: 1851 bytes --]
From 29feb0fa194fb1ea9fe651428b6fbe01d218aa75 Mon Sep 17 00:00:00 2001
From: Pip Cet <pipcet@gmail.com>
Date: Fri, 3 Jan 2020 12:00:44 +0000
Subject: [PATCH] Fix hash table printing
Previously, the output would sometimes contain extra spaces or fewer
elements than were requested.
* src/print.c (print_vectorlike): Keep track of the actual number of
elements printed rather than attempting to use hash bucket indices.
---
src/print.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/src/print.c b/src/print.c
index 425b0dc4ee..14b5f19d6e 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1578,27 +1578,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);
}
--
2.24.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* bug#38892: 28.0.50: Hash table printing oddities
2020-01-03 12:13 bug#38892: 28.0.50: Hash table printing oddities Pip Cet
@ 2020-01-11 9:42 ` Eli Zaretskii
2020-09-20 10:24 ` Lars Ingebrigtsen
0 siblings, 1 reply; 3+ messages in thread
From: Eli Zaretskii @ 2020-01-11 9:42 UTC (permalink / raw)
To: Pip Cet; +Cc: 38892
> From: Pip Cet <pipcet@gmail.com>
> Date: Fri, 3 Jan 2020 12:13:28 +0000
>
> Proposed patch attached.
Thanks. Can you add a few tests to make sure this works as expected?
^ permalink raw reply [flat|nested] 3+ messages in thread
* bug#38892: 28.0.50: Hash table printing oddities
2020-01-11 9:42 ` Eli Zaretskii
@ 2020-09-20 10:24 ` Lars Ingebrigtsen
0 siblings, 0 replies; 3+ messages in thread
From: Lars Ingebrigtsen @ 2020-09-20 10:24 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 38892, Pip Cet
Eli Zaretskii <eliz@gnu.org> writes:
>> Proposed patch attached.
>
> Thanks. Can you add a few tests to make sure this works as expected?
I've now applied Pip's patch and added the examples from the bug report
as tests.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-09-20 10:24 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-01-03 12:13 bug#38892: 28.0.50: Hash table printing oddities Pip Cet
2020-01-11 9:42 ` Eli Zaretskii
2020-09-20 10:24 ` Lars Ingebrigtsen
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).