@@ -6335,7 +6335,7 @@ static PyTypeObject PyDateTime_DateTimeType = {
6335
6335
* Module methods and initialization.
6336
6336
*/
6337
6337
6338
- static PyMethodDef module_methods [] = {
6338
+ static PyMethodDef datetimemodule_methods [] = {
6339
6339
{NULL , NULL }
6340
6340
};
6341
6341
@@ -6360,32 +6360,13 @@ static PyDateTime_CAPI CAPI = {
6360
6360
new_time_ex2
6361
6361
};
6362
6362
6363
-
6364
-
6365
- static struct PyModuleDef datetimemodule = {
6366
- PyModuleDef_HEAD_INIT ,
6367
- "_datetime" ,
6368
- "Fast implementation of the datetime type." ,
6369
- -1 ,
6370
- module_methods ,
6371
- NULL ,
6372
- NULL ,
6373
- NULL ,
6374
- NULL
6375
- };
6376
-
6377
- PyMODINIT_FUNC
6378
- PyInit__datetime (void )
6363
+ static int
6364
+ datetimemodule_exec (PyObject * module )
6379
6365
{
6380
- PyObject * m ; /* a module object */
6381
6366
PyObject * d ; /* its dict */
6382
6367
PyObject * x ;
6383
6368
PyObject * delta ;
6384
6369
6385
- m = PyModule_Create (& datetimemodule );
6386
- if (m == NULL )
6387
- return NULL ;
6388
-
6389
6370
PyTypeObject * types [] = {
6390
6371
& PyDateTime_DateType ,
6391
6372
& PyDateTime_DateTimeType ,
@@ -6396,8 +6377,8 @@ PyInit__datetime(void)
6396
6377
};
6397
6378
6398
6379
for (size_t i = 0 ; i < Py_ARRAY_LENGTH (types ); i ++ ) {
6399
- if (PyModule_AddType (m , types [i ]) < 0 ) {
6400
- return NULL ;
6380
+ if (PyModule_AddType (module , types [i ]) < 0 ) {
6381
+ return -1 ;
6401
6382
}
6402
6383
}
6403
6384
@@ -6406,83 +6387,83 @@ PyInit__datetime(void)
6406
6387
6407
6388
x = new_delta (0 , 0 , 1 , 0 );
6408
6389
if (x == NULL || PyDict_SetItemString (d , "resolution" , x ) < 0 )
6409
- return NULL ;
6390
+ return -1 ;
6410
6391
Py_DECREF (x );
6411
6392
6412
6393
x = new_delta (- MAX_DELTA_DAYS , 0 , 0 , 0 );
6413
6394
if (x == NULL || PyDict_SetItemString (d , "min" , x ) < 0 )
6414
- return NULL ;
6395
+ return -1 ;
6415
6396
Py_DECREF (x );
6416
6397
6417
6398
x = new_delta (MAX_DELTA_DAYS , 24 * 3600 - 1 , 1000000 - 1 , 0 );
<
A3E2
/td>6418
6399
if (x == NULL || PyDict_SetItemString (d , "max" , x ) < 0 )
6419
- return NULL ;
6400
+ return -1 ;
6420
6401
Py_DECREF (x );
6421
6402
6422
6403
/* date values */
6423
6404
d = PyDateTime_DateType .tp_dict ;
6424
6405
6425
6406
x = new_date (1 , 1 , 1 );
6426
6407
if (x == NULL || PyDict_SetItemString (d , "min" , x ) < 0 )
6427
- return NULL ;
6408
+ return -1 ;
6428
6409
Py_DECREF (x );
6429
6410
6430
6411
x = new_date (MAXYEAR , 12 , 31 );
6431
6412
if (x == NULL || PyDict_SetItemString (d , "max" , x ) < 0 )
6432
- return NULL ;
6413
+ return -1 ;
6433
6414
Py_DECREF (x );
6434
6415
6435
6416
x = new_delta (1 , 0 , 0 , 0 );
6436
6417
if (x == NULL || PyDict_SetItemString (d , "resolution" , x ) < 0 )
6437
- return NULL ;
6418
+ return -1 ;
6438
6419
Py_DECREF (x );
6439
6420
6440
6421
/* time values */
6441
6422
d = PyDateTime_TimeType .tp_dict ;
6442
6423
6443
6424
x = new_time (0 , 0 , 0 , 0 , Py_None , 0 );
6444
6425
if (x == NULL || PyDict_SetItemString (d , "min" , x ) < 0 )
6445
- return NULL ;
6426
+ return -1 ;
6446
6427
Py_DECREF (x );
6447
6428
6448
6429
x = new_time (23 , 59 , 59 , 999999 , Py_None , 0 );
6449
6430
if (x == NULL || PyDict_SetItemString (d , "max" , x ) < 0 )
6450
- return NULL ;
6431
+ return -1 ;
6451
6432
Py_DECREF (x );
6452
6433
6453
6434
x = new_delta (0 , 0 , 1 , 0 );
6454
6435
if (x == NULL || PyDict_SetItemString (d , "resolution" , x ) < 0 )
6455
- return NULL ;
6436
+ return -1 ;
6456
6437
Py_DECREF (x );
6457
6438
6458
6439
/* datetime values */
6459
6440
d = PyDateTime_DateTimeType .tp_dict ;
6460
6441
6461
6442
x = new_datetime (1 , 1 , 1 , 0 , 0 , 0 , 0 , Py_None , 0 );
6462
6443
if (x == NULL || PyDict_SetItemString (d , "min" , x ) < 0 )
6463
- return NULL ;
6444
+ return -1 ;
6464
6445
Py_DECREF (x );
6465
6446
6466
6447
x = new_datetime (MAXYEAR , 12 , 31 , 23 , 59 , 59 , 999999 , Py_None , 0 );
6467
6448
if (x == NULL || PyDict_SetItemString (d , "max" , x ) < 0 )
6468
- return NULL ;
6449
+ return -1 ;
6469
6450
Py_DECREF (x );
6470
6451
6471
6452
x = new_delta (0 , 0 , 1 , 0 );
6472
6453
if (x == NULL || PyDict_SetItemString (d , "resolution" , x ) < 0 )
6473
- return NULL ;
6454
+ return -1 ;
6474
6455
Py_DECREF (x );
6475
6456
6476
6457
/* timezone values */
6477
6458
d = PyDateTime_TimeZoneType .tp_dict ;
6478
6459
6479
6460
delta = new_delta (0 , 0 , 0 , 0 );
6480
6461
if (delta == NULL )
6481
- return NULL ;
6462
+ return -1 ;
6482
6463
x = create_timezone (delta , NULL );
6483
6464
Py_DECREF (delta );
6484
6465
if (x == NULL || PyDict_SetItemString (d , "utc" , x ) < 0 )
6485
- return NULL ;
6466
+ return -1 ;
6486
6467
PyDateTime_TimeZone_UTC = x ;
6487
6468
CAPI .TimeZone_UTC = PyDateTime_TimeZone_UTC ;
6488
6469
@@ -6491,36 +6472,36 @@ PyInit__datetime(void)
6491
6472
* values. This may change in the future.*/
6492
6473
delta = new_delta (-1 , 60 , 0 , 1 ); /* -23:59 */
6493
6474
if (delta == NULL )
6494
- return NULL ;
6475
+ return -1 ;
6495
6476
x = create_timezone (delta , NULL );
6496
6477
Py_DECREF (delta );
6497
6478
if (x == NULL || PyDict_SetItemString (d , "min" , x ) < 0 )
6498
- return NULL ;
6479
+ return -1 ;
6499
6480
Py_DECREF (x );
6500
6481
6501
6482
delta = new_delta (0 , (23 * 60 + 59 ) * 60 , 0 , 0 ); /* +23:59 */
6502
6483
if (delta == NULL )
6503
- return NULL ;
6484
+ return -1 ;
6504
6485
x = create_timezone (delta , NULL );
6505
6486
Py_DECREF (delta );
6506
6487
if (x == NULL || PyDict_SetItemString (d , "max" , x ) < 0 )
6507
- return NULL ;
6488
+ return -1 ;
6508
6489
Py_DECREF (x );
6509
6490
6510
6491
/* Epoch */
6511
6492
PyDateTime_Epoch = new_datetime (1970 , 1 , 1 , 0 , 0 , 0 , 0 ,
6512
6493
PyDateTime_TimeZone_UTC , 0 );
6513
6494
if (PyDateTime_Epoch == NULL )
6514
- return NULL ;
6495
+ return -1 ;
6515
6496
6516
6497
/* module initialization */
6517
- PyModule_AddIntMacro (m , MINYEAR );
6518
- PyModule_AddIntMacro (m , MAXYEAR );
6498
+ PyModule_AddIntMacro (module , MINYEAR );
6499
+ PyModule_AddIntMacro (module , MAXYEAR );
6519
6500
6520
6501
x = PyCapsule_New (& CAPI , PyDateTime_CAPSULE_NAME , NULL );
6521
6502
if (x == NULL )
6522
- return NULL ;
6523
- PyModule_AddObject (m , "datetime_CAPI" , x );
6503
+ return -1 ;
6504
+ PyModule_AddObject (module , "datetime_CAPI" , x );
6524
6505
6525
6506
/* A 4-year cycle has an extra leap day over what we'd get from
6526
6507
* pasting together 4 single years.
@@ -6540,23 +6521,65 @@ PyInit__datetime(void)
6540
6521
Py_BUILD_ASSERT (DI100Y == 25 * DI4Y - 1 );
6541
6522
assert (DI100Y == days_before_year (100 + 1 ));
6542
6523
6543
- us_per_ms = PyLong_FromLong (1000 );
6544
- us_per_second = PyLong_FromLong (1000000 );
6545
- us_per_minute = PyLong_FromLong (60000000 );
6546
- seconds_per_day = PyLong_FromLong (24 * 3600 );
6524
+ if (!us_per_ms ) {
6525
+ us_per_ms = PyLong_FromLong (1000 );
6526
+ }
6527
+ if (!us_per_second ) {
6528
+ us_per_second = PyLong_FromLong (1000000 );
6529
+ }
6530
+ if (!us_per_minute ) {
6531
+ us_per_minute = PyLong_FromLong (60000000 );
6532
+ }
6533
+ if (!seconds_per_day ) {
6534
+ seconds_per_day = PyLong_FromLong (24 * 3600 );
6535
+ }
6547
6536
if (us_per_ms == NULL || us_per_second == NULL ||
6548
6537
us_per_minute == NULL || seconds_per_day == NULL )
6549
- return NULL ;
6538
+ return -1 ;
6550
6539
6551
6540
/* The rest are too big for 32-bit ints, but even
6552
6541
* us_per_week fits in 40 bits, so doubles should be exact.
6553
6542
*/
6554
- us_per_hour = PyLong_FromDouble (3600000000.0 );
6555
- us_per_day = PyLong_FromDouble (86400000000.0 );
6556
- us_per_week = PyLong_FromDouble (604800000000.0 );
6543
+ if (!us_per_hour ) {
6544
+ us_per_hour = PyLong_FromDouble (3600000000.0 );
6545
+ }
6546
+ if (!us_per_day ) {
6547
+ us_per_day = PyLong_FromDouble (86400000000.0 );
6548
+ }
6549
+ if (!us_per_week ) {
6550
+ us_per_week = PyLong_FromDouble (604800000000.0 );
6551
+ }
6557
6552
if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL )
6558
- return NULL ;
6559
- return m ;
6553
+ return -1 ;
6554
+
6555
+ // Workaround to allow static PyTypeObjects to have they dict redefined.
6556
+ // XXX: to be removed once _datetime moves to heap allocated PyTypeObjects.
6557
+ PyType_ClearCache ();
6558
+
6559
+ return 0 ;
6560
+ }
6561
+
6562
+ static PyModuleDef_Slot datetimemodule_slots [] = {
6563
+ {Py_mod_exec , datetimemodule_exec },
6564
+ {0 , NULL }
6565
+ };
6566
+
6567
+ static struct PyModuleDef datetimemodule = {
6568
+ PyModuleDef_HEAD_INIT ,
6569
+ "_datetime" ,
6570
+ "Fast implementation of the datetime type." ,
6571
+ 0 ,
6572
+ datetimemodule_methods ,
6573
+ datetimemodule_slots ,
6574
+ NULL ,
6575
+ NULL ,
6576
+ NULL
6577
+ };
6578
+
6579
+ PyMODINIT_FUNC
6580
+ PyInit__datetime (void )
6581
+ {
6582
+ return PyModuleDef_Init (& datetimemodule );
6560
6583
}
6561
6584
6562
6585
/* ---------------------------------------------------------------------------
0 commit comments