@@ -23,39 +23,11 @@ This file is derived from NumPy 1.7. See NUMPY_LICENSE.txt
2323#include "pandas/vendored/numpy/datetime/np_datetime.h"
2424#define NO_IMPORT_ARRAY
2525#define PY_ARRAY_UNIQUE_SYMBOL PANDAS_DATETIME_NUMPY
26+ #include "pandas/portable.h"
2627#include <numpy/ndarrayobject.h>
2728#include <numpy/npy_common.h>
2829#include <stdbool.h>
2930
30- #if defined(_WIN32 )
31- #ifndef ENABLE_INTSAFE_SIGNED_FUNCTIONS
32- #define ENABLE_INTSAFE_SIGNED_FUNCTIONS
33- #endif
34- #include <intsafe.h>
35- #define checked_int64_add (a , b , res ) LongLongAdd(a, b, res)
36- #define checked_int64_sub (a , b , res ) LongLongSub(a, b, res)
37- #define checked_int64_mul (a , b , res ) LongLongMult(a, b, res)
38- #else
39- #if defined __has_builtin
40- #if __has_builtin (__builtin_add_overflow )
41- #define checked_int64_add (a , b , res ) __builtin_add_overflow(a, b, res)
42- #define checked_int64_sub (a , b , res ) __builtin_sub_overflow(a, b, res)
43- #define checked_int64_mul (a , b , res ) __builtin_mul_overflow(a, b, res)
44- #else
45- _Static_assert (0 ,
46- "Overflow checking not detected; please try a newer compiler" );
47- #endif
48- // __has_builtin was added in gcc 10, but our muslinux_1_1 build environment
49- // only has gcc-9.3, so fall back to __GNUC__ macro as long as we have that
50- #elif __GNUC__ > 7
51- #define checked_int64_add (a , b , res ) __builtin_add_overflow(a, b, res)
52- #define checked_int64_sub (a , b , res ) __builtin_sub_overflow(a, b, res)
53- #define checked_int64_mul (a , b , res ) __builtin_mul_overflow(a, b, res)
54- #else
55- _Static_assert (0 , "__has_builtin not detected; please try a newer compiler" );
56- #endif
57- #endif
58-
5931#define XSTR (a ) STR(a)
6032#define STR (a ) #a
6133
@@ -140,53 +112,53 @@ npy_int64 get_datetimestruct_days(const npy_datetimestruct *dts) {
140112 npy_int64 year , days = 0 ;
141113 const int * month_lengths ;
142114
143- PD_CHECK_OVERFLOW (checked_int64_sub (dts -> year , 1970 , & year ));
144- PD_CHECK_OVERFLOW (checked_int64_mul (year , 365 , & days ));
115+ PD_CHECK_OVERFLOW (checked_sub (dts -> year , 1970 , & year ));
116+ PD_CHECK_OVERFLOW (checked_mul (year , 365 , & days ));
145117
146118 /* Adjust for leap years */
147119 if (days >= 0 ) {
148120 /*
149121 * 1968 is the closest leap year before 1970.
150122 * Exclude the current year, so add 1.
151123 */
152- PD_CHECK_OVERFLOW (checked_int64_add (year , 1 , & year ));
124+ PD_CHECK_OVERFLOW (checked_add (year , 1 , & year ));
153125 /* Add one day for each 4 years */
154- PD_CHECK_OVERFLOW (checked_int64_add (days , year / 4 , & days ));
126+ PD_CHECK_OVERFLOW (checked_add (days , year / 4 , & days ));
155127 /* 1900 is the closest previous year divisible by 100 */
156- PD_CHECK_OVERFLOW (checked_int64_add (year , 68 , & year ));
128+ PD_CHECK_OVERFLOW (checked_add (year , 68 , & year ));
157129 /* Subtract one day for each 100 years */
158- PD_CHECK_OVERFLOW (checked_int64_sub (days , year / 100 , & days ));
130+ PD_CHECK_OVERFLOW (checked_sub (days , year / 100 , & days ));
159131 /* 1600 is the closest previous year divisible by 400 */
160- PD_CHECK_OVERFLOW (checked_int64_add (year , 300 , & year ));
132+ PD_CHECK_OVERFLOW (checked_add (year , 300 , & year ));
161133 /* Add one day for each 400 years */
162- PD_CHECK_OVERFLOW (checked_int64_add (days , year / 400 , & days ));
134+ PD_CHECK_OVERFLOW (checked_add (days , year / 400 , & days ));
163135 } else {
164136 /*
165137 * 1972 is the closest later year after 1970.
166138 * Include the current year, so subtract 2.
167139 */
168- PD_CHECK_OVERFLOW (checked_int64_sub (year , 2 , & year ));
140+ PD_CHECK_OVERFLOW (checked_sub (year , 2 , & year ));
169141 /* Subtract one day for each 4 years */
170- PD_CHECK_OVERFLOW (checked_int64_add (days , year / 4 , & days ));
142+ PD_CHECK_OVERFLOW (checked_add (days , year / 4 , & days ));
171143 /* 2000 is the closest later year divisible by 100 */
172- PD_CHECK_OVERFLOW (checked_int64_sub (year , 28 , & year ));
144+ PD_CHECK_OVERFLOW (checked_sub (year , 28 , & year ));
173145 /* Add one day for each 100 years */
174- PD_CHECK_OVERFLOW (checked_int64_sub (days , year / 100 , & days ));
146+ PD_CHECK_OVERFLOW (checked_sub (days , year / 100 , & days ));
175147 /* 2000 is also the closest later year divisible by 400 */
176148 /* Subtract one day for each 400 years */
177- PD_CHECK_OVERFLOW (checked_int64_add (days , year / 400 , & days ));
149+ PD_CHECK_OVERFLOW (checked_add (days , year / 400 , & days ));
178150 }
179151
180152 month_lengths = days_per_month_table [is_leapyear (dts -> year )];
181153 month = dts -> month - 1 ;
182154
183155 /* Add the months */
184156 for (i = 0 ; i < month ; ++ i ) {
185- PD_CHECK_OVERFLOW (checked_int64_add (days , month_lengths [i ], & days ));
157+ PD_CHECK_OVERFLOW (checked_add (days , month_lengths [i ], & days ));
186158 }
187159
188160 /* Add the days */
189- PD_CHECK_OVERFLOW (checked_int64_add (days , dts -> day - 1 , & days ));
161+ PD_CHECK_OVERFLOW (checked_add (days , dts -> day - 1 , & days ));
190162
191163 return days ;
192164}
@@ -341,11 +313,11 @@ PyObject *extract_utc_offset(PyObject *obj) {
341313}
342314
343315static inline int scaleYearToEpoch (int64_t year , int64_t * result ) {
344- return checked_int64_sub (year , 1970 , result );
316+ return checked_sub (year , 1970 , result );
345317}
346318
347319static inline int scaleYearsToMonths (int64_t years , int64_t * result ) {
348- return checked_int64_mul (years , 12 , result );
320+ return checked_mul (years , 12 , result );
349321}
350322
351323static inline int scaleDaysToWeeks (int64_t days , int64_t * result ) {
@@ -355,7 +327,7 @@ static inline int scaleDaysToWeeks(int64_t days, int64_t *result) {
355327 } else {
356328 int res ;
357329 int64_t checked_days ;
358- if ((res = checked_int64_sub (days , 6 , & checked_days ))) {
330+ if ((res = checked_sub (days , 6 , & checked_days ))) {
359331 return res ;
360332 }
361333
@@ -365,43 +337,43 @@ static inline int scaleDaysToWeeks(int64_t days, int64_t *result) {
365337}
366338
367339static inline int scaleDaysToHours (int64_t days , int64_t * result ) {
368- return checked_int64_mul (days , 24 , result );
340+ return checked_mul (days , 24 , result );
369341}
370342
371343static inline int scaleHoursToMinutes (int64_t hours , int64_t * result ) {
372- return checked_int64_mul (hours , 60 , result );
344+ return checked_mul (hours , 60 , result );
373345}
374346
375347static inline int scaleMinutesToSeconds (int64_t minutes , int64_t * result ) {
376- return checked_int64_mul (minutes , 60 , result );
348+ return checked_mul (minutes , 60 , result );
377349}
378350
379351static inline int scaleSecondsToMilliseconds (int64_t seconds , int64_t * result ) {
380- return checked_int64_mul (seconds , 1000 , result );
352+ return checked_mul (seconds , 1000 , result );
381353}
382354
383355static inline int scaleSecondsToMicroseconds (int64_t seconds , int64_t * result ) {
384- return checked_int64_mul (seconds , 1000000 , result );
356+ return checked_mul (seconds , 1000000 , result );
385357}
386358
387359static inline int scaleMicrosecondsToNanoseconds (int64_t microseconds ,
388360 int64_t * result ) {
389- return checked_int64_mul (microseconds , 1000 , result );
361+ return checked_mul (microseconds , 1000 , result );
390362}
391363
392364static inline int scaleMicrosecondsToPicoseconds (int64_t microseconds ,
393365 int64_t * result ) {
394- return checked_int64_mul (microseconds , 1000000 , result );
366+ return checked_mul (microseconds , 1000000 , result );
395367}
396368
397369static inline int64_t scalePicosecondsToFemtoseconds (int64_t picoseconds ,
398370 int64_t * result ) {
399- return checked_int64_mul (picoseconds , 1000 , result );
371+ return checked_mul (picoseconds , 1000 , result );
400372}
401373
402374static inline int64_t scalePicosecondsToAttoseconds (int64_t picoseconds ,
403375 int64_t * result ) {
404- return checked_int64_mul (picoseconds , 1000000 , result );
376+ return checked_mul (picoseconds , 1000000 , result );
405377}
406378
407379/*
@@ -422,8 +394,8 @@ npy_datetime npy_datetimestruct_to_datetime(NPY_DATETIMEUNIT base,
422394 PD_CHECK_OVERFLOW (scaleYearsToMonths (years , & months ));
423395
424396 int64_t months_adder ;
425- PD_CHECK_OVERFLOW (checked_int64_sub (dts -> month , 1 , & months_adder ));
426- PD_CHECK_OVERFLOW (checked_int64_add (months , months_adder , & months ));
397+ PD_CHECK_OVERFLOW (checked_sub (dts -> month , 1 , & months_adder ));
398+ PD_CHECK_OVERFLOW (checked_add (months , months_adder , & months ));
427399
428400 if (base == NPY_FR_M ) {
429401 return months ;
@@ -452,23 +424,23 @@ npy_datetime npy_datetimestruct_to_datetime(NPY_DATETIMEUNIT base,
452424
453425 int64_t hours ;
454426 PD_CHECK_OVERFLOW (scaleDaysToHours (days , & hours ));
455- PD_CHECK_OVERFLOW (checked_int64_add (hours , dts -> hour , & hours ));
427+ PD_CHECK_OVERFLOW (checked_add (hours , dts -> hour , & hours ));
456428
457429 if (base == NPY_FR_h ) {
458430 return hours ;
459431 }
460432
461433 int64_t minutes ;
462434 PD_CHECK_OVERFLOW (scaleHoursToMinutes (hours , & minutes ));
463- PD_CHECK_OVERFLOW (checked_int64_add (minutes , dts -> min , & minutes ));
435+ PD_CHECK_OVERFLOW (checked_add (minutes , dts -> min , & minutes ));
464436
465437 if (base == NPY_FR_m ) {
466438 return minutes ;
467439 }
468440
469441 int64_t seconds ;
470442 PD_CHECK_OVERFLOW (scaleMinutesToSeconds (minutes , & seconds ));
471- PD_CHECK_OVERFLOW (checked_int64_add (seconds , dts -> sec , & seconds ));
443+ PD_CHECK_OVERFLOW (checked_add (seconds , dts -> sec , & seconds ));
472444
473445 if (base == NPY_FR_s ) {
474446 return seconds ;
@@ -477,15 +449,14 @@ npy_datetime npy_datetimestruct_to_datetime(NPY_DATETIMEUNIT base,
477449 if (base == NPY_FR_ms ) {
478450 int64_t milliseconds ;
479451 PD_CHECK_OVERFLOW (scaleSecondsToMilliseconds (seconds , & milliseconds ));
480- PD_CHECK_OVERFLOW (
481- checked_int64_add (milliseconds , dts -> us / 1000 , & milliseconds ));
452+ PD_CHECK_OVERFLOW (checked_add (milliseconds , dts -> us / 1000 , & milliseconds ));
482453
483454 return milliseconds ;
484455 }
485456
486457 int64_t microseconds ;
487458 PD_CHECK_OVERFLOW (scaleSecondsToMicroseconds (seconds , & microseconds ));
488- PD_CHECK_OVERFLOW (checked_int64_add (microseconds , dts -> us , & microseconds ));
459+ PD_CHECK_OVERFLOW (checked_add (microseconds , dts -> us , & microseconds ));
489460
490461 if (base == NPY_FR_us ) {
491462 return microseconds ;
@@ -499,21 +470,20 @@ npy_datetime npy_datetimestruct_to_datetime(NPY_DATETIMEUNIT base,
499470 if (microseconds == min_nanoseconds / 1000 - 1 ) {
500471 // For values within one microsecond of min_nanoseconds, use it as base
501472 // and offset it with nanosecond delta to avoid overflow during scaling.
502- PD_CHECK_OVERFLOW (checked_int64_add (
473+ PD_CHECK_OVERFLOW (checked_add (
503474 min_nanoseconds , (dts -> ps - _NS_MIN_DTS .ps ) / 1000 , & nanoseconds ));
504475 } else {
505476 PD_CHECK_OVERFLOW (
506477 scaleMicrosecondsToNanoseconds (microseconds , & nanoseconds ));
507- PD_CHECK_OVERFLOW (
508- checked_int64_add (nanoseconds , dts -> ps / 1000 , & nanoseconds ));
478+ PD_CHECK_OVERFLOW (checked_add (nanoseconds , dts -> ps / 1000 , & nanoseconds ));
509479 }
510480
511481 return nanoseconds ;
512482 }
513483
514484 int64_t picoseconds ;
515485 PD_CHECK_OVERFLOW (scaleMicrosecondsToPicoseconds (microseconds , & picoseconds ));
516- PD_CHECK_OVERFLOW (checked_int64_add (picoseconds , dts -> ps , & picoseconds ));
486+ PD_CHECK_OVERFLOW (checked_add (picoseconds , dts -> ps , & picoseconds ));
517487
518488 if (base == NPY_FR_ps ) {
519489 return picoseconds ;
@@ -523,15 +493,14 @@ npy_datetime npy_datetimestruct_to_datetime(NPY_DATETIMEUNIT base,
523493 int64_t femtoseconds ;
524494 PD_CHECK_OVERFLOW (
525495 scalePicosecondsToFemtoseconds (picoseconds , & femtoseconds ));
526- PD_CHECK_OVERFLOW (
527- checked_int64_add (femtoseconds , dts -> as / 1000 , & femtoseconds ));
496+ PD_CHECK_OVERFLOW (checked_add (femtoseconds , dts -> as / 1000 , & femtoseconds ));
528497 return femtoseconds ;
529498 }
530499
531500 if (base == NPY_FR_as ) {
532501 int64_t attoseconds ;
533502 PD_CHECK_OVERFLOW (scalePicosecondsToAttoseconds (picoseconds , & attoseconds ));
534- PD_CHECK_OVERFLOW (checked_int64_add (attoseconds , dts -> as , & attoseconds ));
503+ PD_CHECK_OVERFLOW (checked_add (attoseconds , dts -> as , & attoseconds ));
535504 return attoseconds ;
536505 }
537506
0 commit comments