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

Skip to content

Commit 3db5fe2

Browse files
committed
Don't use C++ exceptions in Py_affine_transform
1 parent 8b6229c commit 3db5fe2

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
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 */

0 commit comments

Comments
 (0)