summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2014-01-12 07:11:44 -0500
committerMark H Weaver <mhw@netris.org>2014-01-12 07:38:04 -0500
commit63d869e74c183faf8e73c73908ef912fdb20198e (patch)
tree3a142f5bc1b39cab7f9926a1e2bbff1e47fa3502
parentf974224d97bce334b6dcf20ecd8ffa84d270e0cd (diff)
downloadguile-63d869e74c183faf8e73c73908ef912fdb20198e.tar.gz
Fix hashing of empty vectors.
Fixes a bug introduced in cc1cd04f8111c306cf48b93e131d5c1765c808a3 "Fix hashing of vectors to run in bounded time." * libguile/hash.c (scm_hasher): Avoid division by zero. * test-suite/tests/hash.test ("hash"): Add tests.
-rw-r--r--libguile/hash.c2
-rw-r--r--test-suite/tests/hash.test15
2 files changed, 14 insertions, 3 deletions
diff --git a/libguile/hash.c b/libguile/hash.c
index c0a6109b4..342931051 100644
--- a/libguile/hash.c
+++ b/libguile/hash.c
@@ -245,7 +245,7 @@ scm_hasher(SCM obj, unsigned long n, size_t d)
{
i = len;
h = n - 1;
- d2 = (d - 1) / len;
+ d2 = len > 0 ? (d - 1) / len : 0;
}
while (i--)
diff --git a/test-suite/tests/hash.test b/test-suite/tests/hash.test
index ad247f50a..64d10bb38 100644
--- a/test-suite/tests/hash.test
+++ b/test-suite/tests/hash.test
@@ -1,6 +1,7 @@
;;;; hash.test --- test guile hashing -*- scheme -*-
;;;;
-;;;; Copyright (C) 2004, 2005, 2006, 2008, 2011, 2012 Free Software Foundation, Inc.
+;;;; Copyright (C) 2004, 2005, 2006, 2008, 2011, 2012,
+;;;; 2014 Free Software Foundation, Inc.
;;;;
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
@@ -36,7 +37,17 @@
(pass-if (= 0 (hash noop 1)))
(pass-if (= 0 (hash +inf.0 1)))
(pass-if (= 0 (hash -inf.0 1)))
- (pass-if (= 0 (hash +nan.0 1))))
+ (pass-if (= 0 (hash +nan.0 1)))
+ (pass-if (= 0 (hash '#() 1)))
+
+ (pass-if "cyclic vectors"
+ (let ()
+ (define (cyclic-vector n)
+ (let ((v (make-vector n)))
+ (vector-fill! v v)
+ v))
+ (and (= 0 (hash (cyclic-vector 3) 1))
+ (= 0 (hash (cyclic-vector 10) 1))))))
;;;
;;; hashv