Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 29 additions & 18 deletions Modules/_datetimemodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "pycore_time.h" // _PyTime_ObjectToTime_t()
#include "pycore_unicodeobject.h" // _PyUnicode_Copy()
#include "pycore_initconfig.h" // _PyStatus_OK()
#include "pycore_pyatomic_ft_wrappers.h"

#include "datetime.h"

Expand Down Expand Up @@ -2533,14 +2534,16 @@ static Py_hash_t
delta_hash(PyObject *op)
{
PyDateTime_Delta *self = PyDelta_CAST(op);
if (self->hashcode == -1) {
Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->hashcode);
if (hash == -1) {
PyObject *temp = delta_getstate(self);
if (temp != NULL) {
self->hashcode = PyObject_Hash(temp);
hash = PyObject_Hash(temp);
FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash);
Py_DECREF(temp);
}
}
return self->hashcode;
return hash;
}

static PyObject *
Expand Down Expand Up @@ -3860,12 +3863,14 @@ static Py_hash_t
date_hash(PyObject *op)
{
PyDateTime_Date *self = PyDate_CAST(op);
if (self->hashcode == -1) {
self->hashcode = generic_hash(
Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->hashcode);
if (hash == -1) {
hash = generic_hash(
(unsigned char *)self->data, _PyDateTime_DATE_DATASIZE);
FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash);
}

return self->hashcode;
return hash;
}

static PyObject *
Expand Down Expand Up @@ -4944,7 +4949,8 @@ static Py_hash_t
time_hash(PyObject *op)
{
PyDateTime_Time *self = PyTime_CAST(op);
if (self->hashcode == -1) {
Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->hashcode);
if (hash == -1) {
PyObject *offset, *self0;
if (TIME_GET_FOLD(self)) {
self0 = new_time_ex2(TIME_GET_HOUR(self),
Expand All @@ -4966,10 +4972,11 @@ time_hash(PyObject *op)
return -1;

/* Reduce this to a hash of another object. */
if (offset == Py_None)
self->hashcode = generic_hash(
if (offset == Py_None) {
hash = generic_hash(
(unsigned char *)self->data, _PyDateTime_TIME_DATASIZE);
else {
FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash);
} else {
PyObject *temp1, *temp2;
int seconds, microseconds;
assert(HASTZINFO(self));
Expand All @@ -4988,12 +4995,13 @@ time_hash(PyObject *op)
Py_DECREF(offset);
return -1;
}
self->hashcode = PyObject_Hash(temp2);
hash = PyObject_Hash(temp2);
FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash);
Py_DECREF(temp2);
}
Py_DECREF(offset);
}
return self->hashcode;
return hash;
}

/*[clinic input]
Expand Down Expand Up @@ -6451,7 +6459,8 @@ static Py_hash_t
datetime_hash(PyObject *op)
{
PyDateTime_DateTime *self = PyDateTime_CAST(op);
if (self->hashcode == -1) {
Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->hashcode);
if (hash == -1) {
PyObject *offset, *self0;
if (DATE_GET_FOLD(self)) {
self0 = new_datetime_ex2(GET_YEAR(self),
Expand All @@ -6476,10 +6485,11 @@ datetime_hash(PyObject *op)
return -1;

/* Reduce this to a hash of another object. */
if (offset == Py_None)
self->hashcode = generic_hash(
if (offset == Py_None) {
hash = generic_hash(
(unsigned char *)self->data, _PyDateTime_DATETIME_DATASIZE);
else {
FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash);
} else {
PyObject *temp1, *temp2;
int days, seconds;

Expand All @@ -6503,12 +6513,13 @@ datetime_hash(PyObject *op)
Py_DECREF(offset);
return -1;
}
self->hashcode = PyObject_Hash(temp2);
hash = PyObject_Hash(temp2);
FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash);
Py_DECREF(temp2);
}
Py_DECREF(offset);
}
return self->hashcode;
return hash;
}

/*[clinic input]
Expand Down
Loading