Skip to content

Commit 705c442

Browse files
jbrockmendeljreback
authored andcommitted
fix segfault when running with cython coverage enabled, xref cython#2879 (#25529)
1 parent bd49d2f commit 705c442

File tree

1 file changed

+48
-48
lines changed

1 file changed

+48
-48
lines changed

pandas/_libs/tslibs/period.pyx

+48-48
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,11 @@ cdef int64_t get_daytime_conversion_factor(int from_index, int to_index) nogil:
138138
return daytime_conversion_factor_matrix[row - 6][col - 6]
139139

140140

141-
cdef int64_t nofunc(int64_t ordinal, asfreq_info *af_info):
142-
return np.iinfo(np.int32).min
141+
cdef int64_t nofunc(int64_t ordinal, asfreq_info *af_info) nogil:
142+
return INT32_MIN
143143

144144

145-
cdef int64_t no_op(int64_t ordinal, asfreq_info *af_info):
145+
cdef int64_t no_op(int64_t ordinal, asfreq_info *af_info) nogil:
146146
return ordinal
147147

148148

@@ -270,7 +270,8 @@ cdef int64_t DtoB_weekday(int64_t unix_date) nogil:
270270
return ((unix_date + 4) // 7) * 5 + ((unix_date + 4) % 7) - 4
271271

272272

273-
cdef int64_t DtoB(npy_datetimestruct *dts, int roll_back, int64_t unix_date):
273+
cdef int64_t DtoB(npy_datetimestruct *dts, int roll_back,
274+
int64_t unix_date) nogil:
274275
cdef:
275276
int day_of_week = dayofweek(dts.year, dts.month, dts.day)
276277

@@ -286,21 +287,23 @@ cdef int64_t DtoB(npy_datetimestruct *dts, int roll_back, int64_t unix_date):
286287
return DtoB_weekday(unix_date)
287288

288289

289-
cdef inline int64_t upsample_daytime(int64_t ordinal, asfreq_info *af_info):
290+
cdef inline int64_t upsample_daytime(int64_t ordinal,
291+
asfreq_info *af_info) nogil:
290292
if (af_info.is_end):
291293
return (ordinal + 1) * af_info.intraday_conversion_factor - 1
292294
else:
293295
return ordinal * af_info.intraday_conversion_factor
294296

295297

296-
cdef inline int64_t downsample_daytime(int64_t ordinal, asfreq_info *af_info):
298+
cdef inline int64_t downsample_daytime(int64_t ordinal,
299+
asfreq_info *af_info) nogil:
297300
return ordinal // (af_info.intraday_conversion_factor)
298301

299302

300303
cdef inline int64_t transform_via_day(int64_t ordinal,
301304
asfreq_info *af_info,
302305
freq_conv_func first_func,
303-
freq_conv_func second_func):
306+
freq_conv_func second_func) nogil:
304307
cdef:
305308
int64_t result
306309

@@ -313,7 +316,7 @@ cdef inline int64_t transform_via_day(int64_t ordinal,
313316
# Conversion _to_ Daily Freq
314317

315318
cdef void AtoD_ym(int64_t ordinal, int64_t *year,
316-
int *month, asfreq_info *af_info):
319+
int *month, asfreq_info *af_info) nogil:
317320
year[0] = ordinal + 1970
318321
month[0] = 1
319322

@@ -327,7 +330,7 @@ cdef void AtoD_ym(int64_t ordinal, int64_t *year,
327330
year[0] -= 1
328331

329332

330-
cdef int64_t asfreq_AtoDT(int64_t ordinal, asfreq_info *af_info):
333+
cdef int64_t asfreq_AtoDT(int64_t ordinal, asfreq_info *af_info) nogil:
331334
cdef:
332335
int64_t unix_date, year
333336
int month
@@ -341,7 +344,7 @@ cdef int64_t asfreq_AtoDT(int64_t ordinal, asfreq_info *af_info):
341344

342345

343346
cdef void QtoD_ym(int64_t ordinal, int *year,
344-
int *month, asfreq_info *af_info):
347+
int *month, asfreq_info *af_info) nogil:
345348
year[0] = ordinal // 4 + 1970
346349
month[0] = (ordinal % 4) * 3 + 1
347350

@@ -353,7 +356,7 @@ cdef void QtoD_ym(int64_t ordinal, int *year,
353356
year[0] -= 1
354357

355358

356-
cdef int64_t asfreq_QtoDT(int64_t ordinal, asfreq_info *af_info):
359+
cdef int64_t asfreq_QtoDT(int64_t ordinal, asfreq_info *af_info) nogil:
357360
cdef:
358361
int64_t unix_date
359362
int year, month
@@ -366,12 +369,12 @@ cdef int64_t asfreq_QtoDT(int64_t ordinal, asfreq_info *af_info):
366369
return upsample_daytime(unix_date, af_info)
367370

368371

369-
cdef void MtoD_ym(int64_t ordinal, int *year, int *month):
372+
cdef void MtoD_ym(int64_t ordinal, int *year, int *month) nogil:
370373
year[0] = ordinal // 12 + 1970
371374
month[0] = ordinal % 12 + 1
372375

373376

374-
cdef int64_t asfreq_MtoDT(int64_t ordinal, asfreq_info *af_info):
377+
cdef int64_t asfreq_MtoDT(int64_t ordinal, asfreq_info *af_info) nogil:
375378
cdef:
376379
int64_t unix_date
377380
int year, month
@@ -384,7 +387,7 @@ cdef int64_t asfreq_MtoDT(int64_t ordinal, asfreq_info *af_info):
384387
return upsample_daytime(unix_date, af_info)
385388

386389

387-
cdef int64_t asfreq_WtoDT(int64_t ordinal, asfreq_info *af_info):
390+
cdef int64_t asfreq_WtoDT(int64_t ordinal, asfreq_info *af_info) nogil:
388391
ordinal = (ordinal * 7 + af_info.from_end - 4 +
389392
(7 - 1) * (af_info.is_end - 1))
390393
return upsample_daytime(ordinal, af_info)
@@ -393,7 +396,7 @@ cdef int64_t asfreq_WtoDT(int64_t ordinal, asfreq_info *af_info):
393396
# --------------------------------------------------------------------
394397
# Conversion _to_ BusinessDay Freq
395398

396-
cdef int64_t asfreq_AtoB(int64_t ordinal, asfreq_info *af_info):
399+
cdef int64_t asfreq_AtoB(int64_t ordinal, asfreq_info *af_info) nogil:
397400
cdef:
398401
int roll_back
399402
npy_datetimestruct dts
@@ -404,7 +407,7 @@ cdef int64_t asfreq_AtoB(int64_t ordinal, asfreq_info *af_info):
404407
return DtoB(&dts, roll_back, unix_date)
405408

406409

407-
cdef int64_t asfreq_QtoB(int64_t ordinal, asfreq_info *af_info):
410+
cdef int64_t asfreq_QtoB(int64_t ordinal, asfreq_info *af_info) nogil:
408411
cdef:
409412
int roll_back
410413
npy_datetimestruct dts
@@ -415,7 +418,7 @@ cdef int64_t asfreq_QtoB(int64_t ordinal, asfreq_info *af_info):
415418
return DtoB(&dts, roll_back, unix_date)
416419

417420

418-
cdef int64_t asfreq_MtoB(int64_t ordinal, asfreq_info *af_info):
421+
cdef int64_t asfreq_MtoB(int64_t ordinal, asfreq_info *af_info) nogil:
419422
cdef:
420423
int roll_back
421424
npy_datetimestruct dts
@@ -426,7 +429,7 @@ cdef int64_t asfreq_MtoB(int64_t ordinal, asfreq_info *af_info):
426429
return DtoB(&dts, roll_back, unix_date)
427430

428431

429-
cdef int64_t asfreq_WtoB(int64_t ordinal, asfreq_info *af_info):
432+
cdef int64_t asfreq_WtoB(int64_t ordinal, asfreq_info *af_info) nogil:
430433
cdef:
431434
int roll_back
432435
npy_datetimestruct dts
@@ -437,7 +440,7 @@ cdef int64_t asfreq_WtoB(int64_t ordinal, asfreq_info *af_info):
437440
return DtoB(&dts, roll_back, unix_date)
438441

439442

440-
cdef int64_t asfreq_DTtoB(int64_t ordinal, asfreq_info *af_info):
443+
cdef int64_t asfreq_DTtoB(int64_t ordinal, asfreq_info *af_info) nogil:
441444
cdef:
442445
int roll_back
443446
npy_datetimestruct dts
@@ -452,7 +455,7 @@ cdef int64_t asfreq_DTtoB(int64_t ordinal, asfreq_info *af_info):
452455
# ----------------------------------------------------------------------
453456
# Conversion _from_ Daily Freq
454457

455-
cdef int64_t asfreq_DTtoA(int64_t ordinal, asfreq_info *af_info):
458+
cdef int64_t asfreq_DTtoA(int64_t ordinal, asfreq_info *af_info) nogil:
456459
cdef:
457460
npy_datetimestruct dts
458461

@@ -464,7 +467,7 @@ cdef int64_t asfreq_DTtoA(int64_t ordinal, asfreq_info *af_info):
464467
return <int64_t>(dts.year - 1970)
465468

466469

467-
cdef int DtoQ_yq(int64_t ordinal, asfreq_info *af_info, int *year):
470+
cdef int DtoQ_yq(int64_t ordinal, asfreq_info *af_info, int *year) nogil:
468471
cdef:
469472
npy_datetimestruct dts
470473
int quarter
@@ -485,7 +488,7 @@ cdef int DtoQ_yq(int64_t ordinal, asfreq_info *af_info, int *year):
485488
return quarter
486489

487490

488-
cdef int64_t asfreq_DTtoQ(int64_t ordinal, asfreq_info *af_info):
491+
cdef int64_t asfreq_DTtoQ(int64_t ordinal, asfreq_info *af_info) nogil:
489492
cdef:
490493
int year, quarter
491494

@@ -495,7 +498,7 @@ cdef int64_t asfreq_DTtoQ(int64_t ordinal, asfreq_info *af_info):
495498
return <int64_t>((year - 1970) * 4 + quarter - 1)
496499

497500

498-
cdef int64_t asfreq_DTtoM(int64_t ordinal, asfreq_info *af_info):
501+
cdef int64_t asfreq_DTtoM(int64_t ordinal, asfreq_info *af_info) nogil:
499502
cdef:
500503
npy_datetimestruct dts
501504

@@ -504,38 +507,38 @@ cdef int64_t asfreq_DTtoM(int64_t ordinal, asfreq_info *af_info):
504507
return <int64_t>((dts.year - 1970) * 12 + dts.month - 1)
505508

506509

507-
cdef int64_t asfreq_DTtoW(int64_t ordinal, asfreq_info *af_info):
510+
cdef int64_t asfreq_DTtoW(int64_t ordinal, asfreq_info *af_info) nogil:
508511
ordinal = downsample_daytime(ordinal, af_info)
509512
return (ordinal + 3 - af_info.to_end) // 7 + 1
510513

511514

512515
# --------------------------------------------------------------------
513516
# Conversion _from_ BusinessDay Freq
514517

515-
cdef int64_t asfreq_BtoDT(int64_t ordinal, asfreq_info *af_info):
518+
cdef int64_t asfreq_BtoDT(int64_t ordinal, asfreq_info *af_info) nogil:
516519
ordinal = ((ordinal + 3) // 5) * 7 + (ordinal + 3) % 5 -3
517520
return upsample_daytime(ordinal, af_info)
518521

519522

520-
cdef int64_t asfreq_BtoA(int64_t ordinal, asfreq_info *af_info):
523+
cdef int64_t asfreq_BtoA(int64_t ordinal, asfreq_info *af_info) nogil:
521524
return transform_via_day(ordinal, af_info,
522525
<freq_conv_func>asfreq_BtoDT,
523526
<freq_conv_func>asfreq_DTtoA)
524527

525528

526-
cdef int64_t asfreq_BtoQ(int64_t ordinal, asfreq_info *af_info):
529+
cdef int64_t asfreq_BtoQ(int64_t ordinal, asfreq_info *af_info) nogil:
527530
return transform_via_day(ordinal, af_info,
528531
<freq_conv_func>asfreq_BtoDT,
529532
<freq_conv_func>asfreq_DTtoQ)
530533

531534

532-
cdef int64_t asfreq_BtoM(int64_t ordinal, asfreq_info *af_info):
535+
cdef int64_t asfreq_BtoM(int64_t ordinal, asfreq_info *af_info) nogil:
533536
return transform_via_day(ordinal, af_info,
534537
<freq_conv_func>asfreq_BtoDT,
535538
<freq_conv_func>asfreq_DTtoM)
536539

537540

538-
cdef int64_t asfreq_BtoW(int64_t ordinal, asfreq_info *af_info):
541+
cdef int64_t asfreq_BtoW(int64_t ordinal, asfreq_info *af_info) nogil:
539542
return transform_via_day(ordinal, af_info,
540543
<freq_conv_func>asfreq_BtoDT,
541544
<freq_conv_func>asfreq_DTtoW)
@@ -544,25 +547,25 @@ cdef int64_t asfreq_BtoW(int64_t ordinal, asfreq_info *af_info):
544547
# ----------------------------------------------------------------------
545548
# Conversion _from_ Annual Freq
546549

547-
cdef int64_t asfreq_AtoA(int64_t ordinal, asfreq_info *af_info):
550+
cdef int64_t asfreq_AtoA(int64_t ordinal, asfreq_info *af_info) nogil:
548551
return transform_via_day(ordinal, af_info,
549552
<freq_conv_func>asfreq_AtoDT,
550553
<freq_conv_func>asfreq_DTtoA)
551554

552555

553-
cdef int64_t asfreq_AtoQ(int64_t ordinal, asfreq_info *af_info):
556+
cdef int64_t asfreq_AtoQ(int64_t ordinal, asfreq_info *af_info) nogil:
554557
return transform_via_day(ordinal, af_info,
555558
<freq_conv_func>asfreq_AtoDT,
556559
<freq_conv_func>asfreq_DTtoQ)
557560

558561

559-
cdef int64_t asfreq_AtoM(int64_t ordinal, asfreq_info *af_info):
562+
cdef int64_t asfreq_AtoM(int64_t ordinal, asfreq_info *af_info) nogil:
560563
return transform_via_day(ordinal, af_info,
561564
<freq_conv_func>asfreq_AtoDT,
562565
<freq_conv_func>asfreq_DTtoM)
563566

564567

565-
cdef int64_t asfreq_AtoW(int64_t ordinal, asfreq_info *af_info):
568+
cdef int64_t asfreq_AtoW(int64_t ordinal, asfreq_info *af_info) nogil:
566569
return transform_via_day(ordinal, af_info,
567570
<freq_conv_func>asfreq_AtoDT,
568571
<freq_conv_func>asfreq_DTtoW)
@@ -571,25 +574,25 @@ cdef int64_t asfreq_AtoW(int64_t ordinal, asfreq_info *af_info):
571574
# ----------------------------------------------------------------------
572575
# Conversion _from_ Quarterly Freq
573576

574-
cdef int64_t asfreq_QtoQ(int64_t ordinal, asfreq_info *af_info):
577+
cdef int64_t asfreq_QtoQ(int64_t ordinal, asfreq_info *af_info) nogil:
575578
return transform_via_day(ordinal, af_info,
576579
<freq_conv_func>asfreq_QtoDT,
577580
<freq_conv_func>asfreq_DTtoQ)
578581

579582

580-
cdef int64_t asfreq_QtoA(int64_t ordinal, asfreq_info *af_info):
583+
cdef int64_t asfreq_QtoA(int64_t ordinal, asfreq_info *af_info) nogil:
581584
return transform_via_day(ordinal, af_info,
582585
<freq_conv_func>asfreq_QtoDT,
583586
<freq_conv_func>asfreq_DTtoA)
584587

585588

586-
cdef int64_t asfreq_QtoM(int64_t ordinal, asfreq_info *af_info):
589+
cdef int64_t asfreq_QtoM(int64_t ordinal, asfreq_info *af_info) nogil:
587590
return transform_via_day(ordinal, af_info,
588591
<freq_conv_func>asfreq_QtoDT,
589592
<freq_conv_func>asfreq_DTtoM)
590593

591594

592-
cdef int64_t asfreq_QtoW(int64_t ordinal, asfreq_info *af_info):
595+
cdef int64_t asfreq_QtoW(int64_t ordinal, asfreq_info *af_info) nogil:
593596
return transform_via_day(ordinal, af_info,
594597
<freq_conv_func>asfreq_QtoDT,
595598
<freq_conv_func>asfreq_DTtoW)
@@ -598,19 +601,19 @@ cdef int64_t asfreq_QtoW(int64_t ordinal, asfreq_info *af_info):
598601
# ----------------------------------------------------------------------
599602
# Conversion _from_ Monthly Freq
600603

601-
cdef int64_t asfreq_MtoA(int64_t ordinal, asfreq_info *af_info):
604+
cdef int64_t asfreq_MtoA(int64_t ordinal, asfreq_info *af_info) nogil:
602605
return transform_via_day(ordinal, af_info,
603606
<freq_conv_func>asfreq_MtoDT,
604607
<freq_conv_func>asfreq_DTtoA)
605608

606609

607-
cdef int64_t asfreq_MtoQ(int64_t ordinal, asfreq_info *af_info):
610+
cdef int64_t asfreq_MtoQ(int64_t ordinal, asfreq_info *af_info) nogil:
608611
return transform_via_day(ordinal, af_info,
609612
<freq_conv_func>asfreq_MtoDT,
610613
<freq_conv_func>asfreq_DTtoQ)
611614

612615

613-
cdef int64_t asfreq_MtoW(int64_t ordinal, asfreq_info *af_info):
616+
cdef int64_t asfreq_MtoW(int64_t ordinal, asfreq_info *af_info) nogil:
614617
return transform_via_day(ordinal, af_info,
615618
<freq_conv_func>asfreq_MtoDT,
616619
<freq_conv_func>asfreq_DTtoW)
@@ -619,25 +622,25 @@ cdef int64_t asfreq_MtoW(int64_t ordinal, asfreq_info *af_info):
619622
# ----------------------------------------------------------------------
620623
# Conversion _from_ Weekly Freq
621624

622-
cdef int64_t asfreq_WtoA(int64_t ordinal, asfreq_info *af_info):
625+
cdef int64_t asfreq_WtoA(int64_t ordinal, asfreq_info *af_info) nogil:
623626
return transform_via_day(ordinal, af_info,
624627
<freq_conv_func>asfreq_WtoDT,
625628
<freq_conv_func>asfreq_DTtoA)
626629

627630

628-
cdef int64_t asfreq_WtoQ(int64_t ordinal, asfreq_info *af_info):
631+
cdef int64_t asfreq_WtoQ(int64_t ordinal, asfreq_info *af_info) nogil:
629632
return transform_via_day(ordinal, af_info,
630633
<freq_conv_func>asfreq_WtoDT,
631634
<freq_conv_func>asfreq_DTtoQ)
632635

633636

634-
cdef int64_t asfreq_WtoM(int64_t ordinal, asfreq_info *af_info):
637+
cdef int64_t asfreq_WtoM(int64_t ordinal, asfreq_info *af_info) nogil:
635638
return transform_via_day(ordinal, af_info,
636639
<freq_conv_func>asfreq_WtoDT,
637640
<freq_conv_func>asfreq_DTtoM)
638641

639642

640-
cdef int64_t asfreq_WtoW(int64_t ordinal, asfreq_info *af_info):
643+
cdef int64_t asfreq_WtoW(int64_t ordinal, asfreq_info *af_info) nogil:
641644
return transform_via_day(ordinal, af_info,
642645
<freq_conv_func>asfreq_WtoDT,
643646
<freq_conv_func>asfreq_DTtoW)
@@ -971,7 +974,7 @@ cdef int get_yq(int64_t ordinal, int freq, int *quarter, int *year):
971974
return qtr_freq
972975

973976

974-
cdef inline int month_to_quarter(int month):
977+
cdef inline int month_to_quarter(int month) nogil:
975978
return (month - 1) // 3 + 1
976979

977980

@@ -1024,9 +1027,6 @@ def periodarr_to_dt64arr(int64_t[:] periodarr, int freq):
10241027

10251028
with nogil:
10261029
for i in range(l):
1027-
if periodarr[i] == NPY_NAT:
1028-
out[i] = NPY_NAT
1029-
continue
10301030
out[i] = period_ordinal_to_dt64(periodarr[i], freq)
10311031

10321032
return out.base # .base to access underlying np.ndarray

0 commit comments

Comments
 (0)