@@ -767,14 +767,15 @@ typedef struct
767767 PyObject * name ;
768768} PyDateTime_TimeZone ;
769769
770- PyObject * PyDateTime_TimeZone_UTC ;
770+ /* The interned UTC timezone instance */
771+ static PyObject * PyDateTime_TimeZone_UTC ;
771772
772773/* Create new timezone instance checking offset range. This
773774 function does not check the name argument. Caller must assure
774775 that offset is a timedelta instance and name is either NULL
775776 or a unicode object. */
776777static PyObject *
777- new_timezone (PyObject * offset , PyObject * name )
778+ create_timezone (PyObject * offset , PyObject * name )
778779{
779780 PyDateTime_TimeZone * self ;
780781 PyTypeObject * type = & PyDateTime_TimeZoneType ;
@@ -783,6 +784,30 @@ new_timezone(PyObject *offset, PyObject *name)
783784 assert (PyDelta_Check (offset ));
784785 assert (name == NULL || PyUnicode_Check (name ));
785786
787+ self = (PyDateTime_TimeZone * )(type -> tp_alloc (type , 0 ));
788+ if (self == NULL ) {
789+ return NULL ;
790+ }
791+ Py_INCREF (offset );
792+ self -> offset = offset ;
793+ Py_XINCREF (name );
794+ self -> name = name ;
795+ return (PyObject * )self ;
796+ }
797+
798+ static int delta_bool (PyDateTime_Delta * self );
799+
800+ static PyObject *
801+ new_timezone (PyObject * offset , PyObject * name )
802+ {
803+ assert (offset != NULL );
804+ assert (PyDelta_Check (offset ));
805+ assert (name == NULL || PyUnicode_Check (name ));
806+
807+ if (name == NULL && delta_bool ((PyDateTime_Delta * )offset ) == 0 ) {
808+ Py_INCREF (PyDateTime_TimeZone_UTC );
809+ return PyDateTime_TimeZone_UTC ;
810+ }
786811 if (GET_TD_MICROSECONDS (offset ) != 0 || GET_TD_SECONDS (offset ) % 60 != 0 ) {
787812 PyErr_Format (PyExc_ValueError , "offset must be a timedelta"
788813 " representing a whole number of minutes" );
@@ -796,15 +821,7 @@ new_timezone(PyObject *offset, PyObject *name)
796821 return NULL ;
797822 }
798823
799- self = (PyDateTime_TimeZone * )(type -> tp_alloc (type , 0 ));
800- if (self == NULL ) {
801- return NULL ;
802- }
803- Py_INCREF (offset );
804- self -> offset = offset ;
805- Py_XINCREF (name );
806- self -> name = name ;
807- return (PyObject * )self ;
824+ return create_timezone (offset , name );
808825}
809826
810827/* ---------------------------------------------------------------------------
@@ -5156,7 +5173,7 @@ PyInit__datetime(void)
51565173 delta = new_delta (0 , 0 , 0 , 0 );
51575174 if (delta == NULL )
51585175 return NULL ;
5159- x = new_timezone (delta , NULL );
5176+ x = create_timezone (delta , NULL );
51605177 Py_DECREF (delta );
51615178 if (x == NULL || PyDict_SetItemString (d , "utc" , x ) < 0 )
51625179 return NULL ;
@@ -5165,7 +5182,7 @@ PyInit__datetime(void)
51655182 delta = new_delta (-1 , 60 , 0 , 1 ); /* -23:59 */
51665183 if (delta == NULL )
51675184 return NULL ;
5168- x = new_timezone (delta , NULL );
5185+ x = create_timezone (delta , NULL );
51695186 Py_DECREF (delta );
51705187 if (x == NULL || PyDict_SetItemString (d , "min" , x ) < 0 )
51715188 return NULL ;
@@ -5174,7 +5191,7 @@ PyInit__datetime(void)
51745191 delta = new_delta (0 , (23 * 60 + 59 ) * 60 , 0 , 0 ); /* +23:59 */
51755192 if (delta == NULL )
51765193 return NULL ;
5177- x = new_timezone (delta , NULL );
5194+ x = create_timezone (delta , NULL );
51785195 Py_DECREF (delta );
51795196 if (x == NULL || PyDict_SetItemString (d , "max" , x ) < 0 )
51805197 return NULL ;
0 commit comments