Skip to content

Commit e369e84

Browse files
authored
Raise error consistently from inside ImagingNewArrow (#9571)
2 parents e55c000 + f110e99 commit e369e84

2 files changed

Lines changed: 20 additions & 17 deletions

File tree

src/_imaging.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,13 +323,9 @@ _new_arrow(PyObject *self, PyObject *args) {
323323
mode_id = findModeID(mode);
324324

325325
// ImagingBorrowArrow is responsible for retaining the array_capsule
326-
ret = PyImagingNew(
326+
return PyImagingNew(
327327
ImagingNewArrow(mode_id, xsize, ysize, schema_capsule, array_capsule)
328328
);
329-
if (!ret) {
330-
return ImagingError_ValueError("Invalid Arrow array mode or size mismatch");
331-
}
332-
return ret;
333329
}
334330

335331
/* -------------------------------------------------------------------- */

src/libImaging/Storage.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ ImagingDestroyArrow(Imaging im) {
548548
}
549549
}
550550

551-
Imaging
551+
int
552552
ImagingBorrowArrow(
553553
Imaging im,
554554
struct ArrowArray *external_array,
@@ -571,9 +571,8 @@ ImagingBorrowArrow(
571571
}
572572

573573
if (!borrowed_buffer) {
574-
return (Imaging)ImagingError_ValueError(
575-
"Arrow Array, exactly 2 buffers required"
576-
);
574+
ImagingError_ValueError("Arrow Array, exactly 2 buffers required");
575+
return 0;
577576
}
578577

579578
for (y = i = 0; y < im->ysize; y++) {
@@ -585,7 +584,7 @@ ImagingBorrowArrow(
585584
im->arrow_array_capsule = arrow_capsule;
586585
im->destroy = ImagingDestroyArrow;
587586

588-
return im;
587+
return 1;
589588
}
590589

591590
/* --------------------------------------------------------------------
@@ -709,9 +708,11 @@ ImagingNewArrow(
709708
&& im->bands == 1)) // Single band match
710709
&& pixels == external_array->length) {
711710
// one arrow element per, and it matches a pixelsize*char
712-
if (ImagingBorrowArrow(im, external_array, im->pixelsize, array_capsule)) {
713-
return im;
711+
if (!ImagingBorrowArrow(im, external_array, im->pixelsize, array_capsule)) {
712+
ImagingDelete(im);
713+
return NULL;
714714
}
715+
return im;
715716
}
716717
// Stored as [[r,g,b,a],...]
717718
if (strcmp(schema->format, "+w:4") == 0 // 4 up array
@@ -725,9 +726,11 @@ ImagingNewArrow(
725726
&& external_array->children // array is well formed
726727
&& 4 * pixels == external_array->children[0]->length) {
727728
// 4 up element of char into pixelsize == 4
728-
if (ImagingBorrowArrow(im, external_array, 1, array_capsule)) {
729-
return im;
729+
if (!ImagingBorrowArrow(im, external_array, 1, array_capsule)) {
730+
ImagingDelete(im);
731+
return NULL;
730732
}
733+
return im;
731734
}
732735
// Stored as [r,g,b,a,r,g,b,a,...]
733736
if (strcmp(schema->format, "C") == 0 // uint8
@@ -736,13 +739,17 @@ ImagingNewArrow(
736739
&& strcmp(im->arrow_band_format, "C") == 0 // expected format
737740
&& 4 * pixels == external_array->length) { // expected length
738741
// single flat array, interleaved storage.
739-
if (ImagingBorrowArrow(im, external_array, 1, array_capsule)) {
740-
return im;
742+
if (!ImagingBorrowArrow(im, external_array, 1, array_capsule)) {
743+
ImagingDelete(im);
744+
return NULL;
741745
}
746+
return im;
742747
}
743748
// fmt: on
744749
ImagingDelete(im);
745-
return NULL;
750+
return (Imaging)ImagingError_ValueError(
751+
"Invalid Arrow array mode or size mismatch"
752+
);
746753
}
747754

748755
Imaging

0 commit comments

Comments
 (0)