]> granicus.if.org Git - python/commitdiff
Issue #14478: Cache the hash of a Decimal in the C version.
authorStefan Krah <skrah@bytereef.org>
Tue, 10 Apr 2012 14:27:58 +0000 (16:27 +0200)
committerStefan Krah <skrah@bytereef.org>
Tue, 10 Apr 2012 14:27:58 +0000 (16:27 +0200)
Modules/_decimal/_decimal.c

index d5bb52f71d50d2da5bf40d9d5cc7cfdc873e9542..168e8ec69a9952521f5b5f0c380829fb8a493c4c 100644 (file)
@@ -60,6 +60,7 @@
 
 typedef struct {
     PyObject_HEAD
+    Py_hash_t hash;
     mpd_t dec;
     mpd_uint_t data[_Py_DEC_MINALLOC];
 } PyDecObject;
@@ -1805,6 +1806,8 @@ PyDecType_New(PyTypeObject *type)
         return NULL;
     }
 
+    dec->hash = -1;
+
     MPD(dec)->flags = MPD_STATIC|MPD_STATIC_DATA;
     MPD(dec)->exp = 0;
     MPD(dec)->digits = 0;
@@ -4210,7 +4213,7 @@ dec_floor(PyObject *self, PyObject *dummy UNUSED)
 
 /* Always uses the module context */
 static Py_hash_t
-dec_hash(PyObject *v)
+_dec_hash(PyDecObject *v)
 {
 #if defined(CONFIG_64) && _PyHASH_BITS == 61
     /* 2**61 - 1 */
@@ -4323,6 +4326,16 @@ malloc_error:
     goto finish;
 }
 
+static Py_hash_t
+dec_hash(PyDecObject *self)
+{
+    if (self->hash == -1) {
+        self->hash = _dec_hash(self);
+    }
+
+    return self->hash;
+}
+
 /* __reduce__ */
 static PyObject *
 dec_reduce(PyObject *self, PyObject *dummy UNUSED)