🌐 AI搜索 & 代理 主页
Skip to content

Commit 48b536d

Browse files
authored
Merge pull request #29839 from charris/backport-29811
BUG: linalg: emit a MemoryError on a malloc failure (#29811)
2 parents 23a0d2c + ec10e23 commit 48b536d

File tree

1 file changed

+73
-36
lines changed

1 file changed

+73
-36
lines changed

numpy/linalg/umath_linalg.cpp

Lines changed: 73 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,15 @@ set_fp_invalid_or_clear(int error_occurred)
448448
}
449449
}
450450

451+
static inline void
452+
report_no_memory()
453+
{
454+
NPY_ALLOW_C_API_DEF
455+
NPY_ALLOW_C_API;
456+
PyErr_NoMemory();
457+
NPY_DISABLE_C_API;
458+
}
459+
451460
/*
452461
*****************************************************************************
453462
** Some handy constants **
@@ -1199,10 +1208,7 @@ slogdet(char **args,
11991208
}
12001209
else {
12011210
/* TODO: Requires use of new ufunc API to indicate error return */
1202-
NPY_ALLOW_C_API_DEF
1203-
NPY_ALLOW_C_API;
1204-
PyErr_NoMemory();
1205-
NPY_DISABLE_C_API;
1211+
report_no_memory();
12061212
}
12071213
}
12081214

@@ -1255,10 +1261,7 @@ det(char **args,
12551261
}
12561262
else {
12571263
/* TODO: Requires use of new ufunc API to indicate error return */
1258-
NPY_ALLOW_C_API_DEF
1259-
NPY_ALLOW_C_API;
1260-
PyErr_NoMemory();
1261-
NPY_DISABLE_C_API;
1264+
report_no_memory();
12621265
}
12631266
}
12641267

@@ -1331,7 +1334,7 @@ init_evd(EIGH_PARAMS_t<typ>* params, char JOBZ, char UPLO,
13311334
mem_buff = (npy_uint8 *)malloc(alloc_size);
13321335

13331336
if (!mem_buff) {
1334-
goto error;
1337+
goto no_memory;
13351338
}
13361339
a = mem_buff;
13371340
w = mem_buff + safe_N * safe_N * sizeof(typ);
@@ -1365,7 +1368,7 @@ init_evd(EIGH_PARAMS_t<typ>* params, char JOBZ, char UPLO,
13651368

13661369
mem_buff2 = (npy_uint8 *)malloc(lwork*sizeof(typ) + liwork*sizeof(fortran_int));
13671370
if (!mem_buff2) {
1368-
goto error;
1371+
goto no_memory;
13691372
}
13701373

13711374
work = mem_buff2;
@@ -1378,6 +1381,9 @@ init_evd(EIGH_PARAMS_t<typ>* params, char JOBZ, char UPLO,
13781381

13791382
return 1;
13801383

1384+
no_memory:
1385+
report_no_memory();
1386+
13811387
error:
13821388
/* something failed */
13831389
memset(params, 0, sizeof(*params));
@@ -1440,7 +1446,7 @@ using fbasetyp = fortran_type_t<basetyp>;
14401446
mem_buff = (npy_uint8 *)malloc(safe_N * safe_N * sizeof(typ) +
14411447
safe_N * sizeof(basetyp));
14421448
if (!mem_buff) {
1443-
goto error;
1449+
goto no_memory;
14441450
}
14451451
a = mem_buff;
14461452
w = mem_buff + safe_N * safe_N * sizeof(typ);
@@ -1478,7 +1484,7 @@ using fbasetyp = fortran_type_t<basetyp>;
14781484
lrwork*sizeof(basetyp) +
14791485
liwork*sizeof(fortran_int));
14801486
if (!mem_buff2) {
1481-
goto error;
1487+
goto no_memory;
14821488
}
14831489

14841490
work = mem_buff2;
@@ -1495,6 +1501,8 @@ using fbasetyp = fortran_type_t<basetyp>;
14951501
return 1;
14961502

14971503
/* something failed */
1504+
no_memory:
1505+
report_no_memory();
14981506
error:
14991507
memset(params, 0, sizeof(*params));
15001508
free(mem_buff2);
@@ -1733,7 +1741,10 @@ init_gesv(GESV_PARAMS_t<ftyp> *params, fortran_int N, fortran_int NRHS)
17331741
params->LDB = ld;
17341742

17351743
return 1;
1744+
17361745
error:
1746+
report_no_memory();
1747+
17371748
free(mem_buff);
17381749
memset(params, 0, sizeof(*params));
17391750

@@ -1977,6 +1988,8 @@ init_potrf(POTR_PARAMS_t<ftyp> *params, char UPLO, fortran_int N)
19771988

19781989
return 1;
19791990
error:
1991+
report_no_memory();
1992+
19801993
free(mem_buff);
19811994
memset(params, 0, sizeof(*params));
19821995

@@ -2175,7 +2188,7 @@ scalar_trait)
21752188
vlr_size + vrr_size +
21762189
w_size + vl_size + vr_size);
21772190
if (!mem_buff) {
2178-
goto error;
2191+
goto no_memory;
21792192
}
21802193

21812194
a = mem_buff;
@@ -2218,14 +2231,18 @@ scalar_trait)
22182231

22192232
mem_buff2 = (npy_uint8 *)malloc(work_count*sizeof(typ));
22202233
if (!mem_buff2) {
2221-
goto error;
2234+
goto no_memory;
22222235
}
22232236
work = mem_buff2;
22242237

22252238
params->LWORK = (fortran_int)work_count;
22262239
params->WORK = (typ*)work;
22272240

22282241
return 1;
2242+
2243+
no_memory:
2244+
report_no_memory();
2245+
22292246
error:
22302247
free(mem_buff2);
22312248
free(mem_buff);
@@ -2392,7 +2409,7 @@ using realtyp = basetype_t<ftyp>;
23922409

23932410
mem_buff = (npy_uint8 *)malloc(total_size);
23942411
if (!mem_buff) {
2395-
goto error;
2412+
goto no_memory;
23962413
}
23972414

23982415
a = mem_buff;
@@ -2434,7 +2451,7 @@ using realtyp = basetype_t<ftyp>;
24342451

24352452
mem_buff2 = (npy_uint8 *)malloc(work_count*sizeof(ftyp));
24362453
if (!mem_buff2) {
2437-
goto error;
2454+
goto no_memory;
24382455
}
24392456

24402457
work = mem_buff2;
@@ -2443,6 +2460,9 @@ using realtyp = basetype_t<ftyp>;
24432460
params->WORK = (ftyp*)work;
24442461

24452462
return 1;
2463+
2464+
no_memory:
2465+
report_no_memory();
24462466
error:
24472467
free(mem_buff2);
24482468
free(mem_buff);
@@ -2754,7 +2774,7 @@ init_gesdd(GESDD_PARAMS_t<ftyp> *params,
27542774
mem_buff = (npy_uint8 *)malloc(a_size + s_size + u_size + vt_size + iwork_size);
27552775

27562776
if (!mem_buff) {
2757-
goto error;
2777+
goto no_memory;
27582778
}
27592779

27602780
a = mem_buff;
@@ -2798,7 +2818,7 @@ init_gesdd(GESDD_PARAMS_t<ftyp> *params,
27982818

27992819
mem_buff2 = (npy_uint8 *)malloc(work_size);
28002820
if (!mem_buff2) {
2801-
goto error;
2821+
goto no_memory;
28022822
}
28032823

28042824
work = mem_buff2;
@@ -2807,6 +2827,9 @@ init_gesdd(GESDD_PARAMS_t<ftyp> *params,
28072827
params->WORK = (ftyp*)work;
28082828

28092829
return 1;
2830+
2831+
no_memory:
2832+
report_no_memory();
28102833
error:
28112834
TRACE_TXT("%s failed init\n", __FUNCTION__);
28122835
free(mem_buff);
@@ -2894,7 +2917,7 @@ using frealtyp = basetype_t<ftyp>;
28942917
rwork_size +
28952918
iwork_size);
28962919
if (!mem_buff) {
2897-
goto error;
2920+
goto no_memory;
28982921
}
28992922

29002923
a = mem_buff;
@@ -2939,7 +2962,7 @@ using frealtyp = basetype_t<ftyp>;
29392962

29402963
mem_buff2 = (npy_uint8 *)malloc(work_size);
29412964
if (!mem_buff2) {
2942-
goto error;
2965+
goto no_memory;
29432966
}
29442967

29452968
work = mem_buff2;
@@ -2948,6 +2971,10 @@ using frealtyp = basetype_t<ftyp>;
29482971
params->WORK = (ftyp*)work;
29492972

29502973
return 1;
2974+
2975+
no_memory:
2976+
report_no_memory();
2977+
29512978
error:
29522979
TRACE_TXT("%s failed init\n", __FUNCTION__);
29532980
free(mem_buff2);
@@ -3186,7 +3213,7 @@ using ftyp = fortran_doublereal;
31863213
mem_buff = (npy_uint8 *)malloc(a_size + tau_size);
31873214

31883215
if (!mem_buff)
3189-
goto error;
3216+
goto no_memory;
31903217

31913218
a = mem_buff;
31923219
tau = a + a_size;
@@ -3219,13 +3246,17 @@ using ftyp = fortran_doublereal;
32193246
work_size = (size_t) params->LWORK * sizeof(ftyp);
32203247
mem_buff2 = (npy_uint8 *)malloc(work_size);
32213248
if (!mem_buff2)
3222-
goto error;
3249+
goto no_memory;
32233250

32243251
work = mem_buff2;
32253252

32263253
params->WORK = (ftyp*)work;
32273254

32283255
return 1;
3256+
3257+
no_memory:
3258+
report_no_memory();
3259+
32293260
error:
32303261
TRACE_TXT("%s failed init\n", __FUNCTION__);
32313262
free(mem_buff);
@@ -3260,7 +3291,7 @@ using ftyp = fortran_doublecomplex;
32603291
mem_buff = (npy_uint8 *)malloc(a_size + tau_size);
32613292

32623293
if (!mem_buff)
3263-
goto error;
3294+
goto no_memory;
32643295

32653296
a = mem_buff;
32663297
tau = a + a_size;
@@ -3295,13 +3326,17 @@ using ftyp = fortran_doublecomplex;
32953326

32963327
mem_buff2 = (npy_uint8 *)malloc(work_size);
32973328
if (!mem_buff2)
3298-
goto error;
3329+
goto no_memory;
32993330

33003331
work = mem_buff2;
33013332

33023333
params->WORK = (ftyp*)work;
33033334

33043335
return 1;
3336+
3337+
no_memory:
3338+
report_no_memory();
3339+
33053340
error:
33063341
TRACE_TXT("%s failed init\n", __FUNCTION__);
33073342
free(mem_buff);
@@ -3433,7 +3468,7 @@ using ftyp = fortran_doublereal;
34333468
mem_buff = (npy_uint8 *)malloc(q_size + tau_size + a_size);
34343469

34353470
if (!mem_buff)
3436-
goto error;
3471+
goto no_memory;
34373472

34383473
q = mem_buff;
34393474
tau = q + q_size;
@@ -3468,13 +3503,17 @@ using ftyp = fortran_doublereal;
34683503

34693504
mem_buff2 = (npy_uint8 *)malloc(work_size);
34703505
if (!mem_buff2)
3471-
goto error;
3506+
goto no_memory;
34723507

34733508
work = mem_buff2;
34743509

34753510
params->WORK = (ftyp*)work;
34763511

34773512
return 1;
3513+
3514+
no_memory:
3515+
report_no_memory();
3516+
34783517
error:
34793518
TRACE_TXT("%s failed init\n", __FUNCTION__);
34803519
free(mem_buff);
@@ -3512,7 +3551,7 @@ using ftyp=fortran_doublecomplex;
35123551
mem_buff = (npy_uint8 *)malloc(q_size + tau_size + a_size);
35133552

35143553
if (!mem_buff)
3515-
goto error;
3554+
goto no_memory;
35163555

35173556
q = mem_buff;
35183557
tau = q + q_size;
@@ -3548,14 +3587,18 @@ using ftyp=fortran_doublecomplex;
35483587

35493588
mem_buff2 = (npy_uint8 *)malloc(work_size);
35503589
if (!mem_buff2)
3551-
goto error;
3590+
goto no_memory;
35523591

35533592
work = mem_buff2;
35543593

35553594
params->WORK = (ftyp*)work;
35563595
params->LWORK = work_count;
35573596

35583597
return 1;
3598+
3599+
no_memory:
3600+
report_no_memory();
3601+
35593602
error:
35603603
TRACE_TXT("%s failed init\n", __FUNCTION__);
35613604
free(mem_buff);
@@ -3898,10 +3941,7 @@ scalar_trait)
38983941
return 1;
38993942

39003943
no_memory:
3901-
NPY_ALLOW_C_API_DEF
3902-
NPY_ALLOW_C_API;
3903-
PyErr_NoMemory();
3904-
NPY_DISABLE_C_API;
3944+
report_no_memory();
39053945

39063946
error:
39073947
TRACE_TXT("%s failed init\n", __FUNCTION__);
@@ -4034,10 +4074,7 @@ using frealtyp = basetype_t<ftyp>;
40344074
return 1;
40354075

40364076
no_memory:
4037-
NPY_ALLOW_C_API_DEF
4038-
NPY_ALLOW_C_API;
4039-
PyErr_NoMemory();
4040-
NPY_DISABLE_C_API;
4077+
report_no_memory();
40414078

40424079
error:
40434080
TRACE_TXT("%s failed init\n", __FUNCTION__);

0 commit comments

Comments
 (0)