Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5619354

Browse files
authored
Merge pull request #11282 from mdboom/reduce-cpp-exceptions
Reduce the use of C++ exceptions
2 parents 2fd9b85 + 3db5fe2 commit 5619354

File tree

3 files changed

+71
-70
lines changed

3 files changed

+71
-70
lines changed

src/_path_wrapper.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -437,23 +437,25 @@ static PyObject *Py_affine_transform(PyObject *self, PyObject *args, PyObject *k
437437
return NULL;
438438
}
439439

440-
try {
441-
numpy::array_view<double, 2> vertices(vertices_obj);
440+
PyArrayObject* vertices_arr = (PyArrayObject *)PyArray_ContiguousFromAny(vertices_obj, NPY_DOUBLE, 1, 2);
441+
if (vertices_arr == NULL) {
442+
return NULL;
443+
}
444+
445+
if (PyArray_NDIM(vertices_arr) == 2) {
446+
numpy::array_view<double, 2> vertices(vertices_arr);
442447
npy_intp dims[] = { (npy_intp)vertices.size(), 2 };
443448
numpy::array_view<double, 2> result(dims);
444449
CALL_CPP("affine_transform", (affine_transform_2d(vertices, trans, result)));
450+
Py_DECREF(vertices_arr);
451+
return result.pyobj();
452+
} else { // PyArray_NDIM(vertices_arr) == 1
453+
numpy::array_view<double, 1> vertices(vertices_arr);
454+
npy_intp dims[] = { (npy_intp)vertices.size() };
455+
numpy::array_view<double, 1> result(dims);
456+
CALL_CPP("affine_transform", (affine_transform_1d(vertices, trans, result)));
457+
Py_DECREF(vertices_arr);
445458
return result.pyobj();
446-
} catch (py::exception &) {
447-
PyErr_Clear();
448-
try {
449-
numpy::array_view<double, 1> vertices(vertices_obj);
450-
npy_intp dims[] = { (npy_intp)vertices.size() };
451-
numpy::array_view<double, 1> result(dims);
452-
CALL_CPP("affine_transform", (affine_transform_1d(vertices, trans, result)));
453-
return result.pyobj();
454-
} catch (py::exception &) {
455-
return NULL;
456-
}
457459
}
458460
}
459461

src/numpy_cpp.h

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,15 @@ class array_view : public detail::array_view_accessors<array_view, T, ND>
398398
m_strides = strides;
399399
}
400400

401+
array_view(PyArrayObject *arr)
402+
{
403+
m_arr = arr;
404+
Py_XINCREF(arr);
405+
m_shape = PyArray_DIMS(m_arr);
406+
m_strides = PyArray_STRIDES(m_arr);
407+
m_data = (char *)PyArray_BYTES(m_arr);
408+
}
409+
401410
array_view(npy_intp shape[ND]) : m_arr(NULL), m_shape(NULL), m_strides(NULL), m_data(NULL)
402411
{
403412
PyObject *arr = PyArray_SimpleNew(ND, shape, type_num_of<T>::value);
@@ -456,18 +465,18 @@ class array_view : public detail::array_view_accessors<array_view, T, ND>
456465
m_data = NULL;
457466
m_shape = zeros;
458467
m_strides = zeros;
459-
if (PyArray_NDIM(tmp) == 0 && ND == 0) {
460-
m_arr = tmp;
461-
return 1;
462-
}
468+
if (PyArray_NDIM(tmp) == 0 && ND == 0) {
469+
m_arr = tmp;
470+
return 1;
471+
}
463472
}
464-
if (PyArray_NDIM(tmp) != ND) {
465-
PyErr_Format(PyExc_ValueError,
466-
"Expected %d-dimensional array, got %d",
467-
ND,
468-
PyArray_NDIM(tmp));
469-
Py_DECREF(tmp);
470-
return 0;
473+
if (PyArray_NDIM(tmp) != ND) {
474+
PyErr_Format(PyExc_ValueError,
475+
"Expected %d-dimensional array, got %d",
476+
ND,
477+
PyArray_NDIM(tmp));
478+
Py_DECREF(tmp);
479+
return 0;
471480
}
472481

473482
/* Copy some of the data to the view object for faster access */

src/py_converters.cpp

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -158,45 +158,36 @@ int convert_rect(PyObject *rectobj, void *rectp)
158158
rect->x2 = 0.0;
159159
rect->y2 = 0.0;
160160
} else {
161-
try
162-
{
163-
numpy::array_view<const double, 2> rect_arr(rectobj);
161+
PyArrayObject *rect_arr = (PyArrayObject *)PyArray_ContiguousFromAny(
162+
rectobj, NPY_DOUBLE, 1, 2);
163+
if (rect_arr == NULL) {
164+
return 0;
165+
}
164166

165-
if (rect_arr.dim(0) != 2 || rect_arr.dim(1) != 2) {
167+
if (PyArray_NDIM(rect_arr) == 2) {
168+
if (PyArray_DIM(rect_arr, 0) != 2 ||
169+
PyArray_DIM(rect_arr, 1) != 2) {
166170
PyErr_SetString(PyExc_ValueError, "Invalid bounding box");
171+
Py_DECREF(rect_arr);
167172
return 0;
168173
}
169174

170-
rect->x1 = rect_arr(0, 0);
171-
rect->y1 = rect_arr(0, 1);
172-
rect->x2 = rect_arr(1, 0);
173-
rect->y2 = rect_arr(1, 1);
174-
}
175-
catch (py::exception &)
176-
{
177-
PyErr_Clear();
178-
179-
try
180-
{
181-
numpy::array_view<const double, 1> rect_arr(rectobj);
182-
183-
if (rect_arr.dim(0) != 4) {
184-
PyErr_SetString(PyExc_ValueError, "Invalid bounding box");
185-
return 0;
186-
}
187-
188-
rect->x1 = rect_arr(0);
189-
rect->y1 = rect_arr(1);
190-
rect->x2 = rect_arr(2);
191-
rect->y2 = rect_arr(3);
192-
}
193-
catch (py::exception &)
194-
{
175+
} else { // PyArray_NDIM(rect_arr) == 1
176+
if (PyArray_DIM(rect_arr, 0) != 4) {
177+
PyErr_SetString(PyExc_ValueError, "Invalid bounding box");
178+
Py_DECREF(rect_arr);
195179
return 0;
196180
}
197181
}
198-
}
199182

183+
double *buff = (double *)PyArray_DATA(rect_arr);
184+
rect->x1 = buff[0];
185+
rect->y1 = buff[1];
186+
rect->x2 = buff[2];
187+
rect->y2 = buff[3];
188+
189+
Py_DECREF(rect_arr);
190+
}
200191
return 1;
201192
}
202193

@@ -336,27 +327,26 @@ int convert_trans_affine(PyObject *obj, void *transp)
336327
return 1;
337328
}
338329

339-
try
340-
{
341-
numpy::array_view<const double, 2> matrix(obj);
330+
PyArrayObject *array = (PyArrayObject *)PyArray_ContiguousFromAny(obj, NPY_DOUBLE, 2, 2);
331+
if (array == NULL) {
332+
return 0;
333+
}
342334

343-
if (matrix.dim(0) == 3 && matrix.dim(1) == 3) {
344-
trans->sx = matrix(0, 0);
345-
trans->shx = matrix(0, 1);
346-
trans->tx = matrix(0, 2);
335+
if (PyArray_DIM(array, 0) == 3 && PyArray_DIM(array, 1) == 3) {
336+
double *buffer = (double *)PyArray_DATA(array);
337+
trans->sx = buffer[0];
338+
trans->shx = buffer[1];
339+
trans->tx = buffer[2];
347340

348-
trans->shy = matrix(1, 0);
349-
trans->sy = matrix(1, 1);
350-
trans->ty = matrix(1, 2);
341+
trans->shy = buffer[3];
342+
trans->sy = buffer[4];
343+
trans->ty = buffer[5];
351344

352-
return 1;
353-
}
354-
}
355-
catch (py::exception &)
356-
{
357-
return 0;
345+
Py_DECREF(array);
346+
return 1;
358347
}
359348

349+
Py_DECREF(array);
360350
PyErr_SetString(PyExc_ValueError, "Invalid affine transformation matrix");
361351
return 0;
362352
}

0 commit comments

Comments
 (0)