diff --git a/src/_contour.cpp b/src/_contour.cpp index 0856a043afd7..0f5176b84041 100644 --- a/src/_contour.cpp +++ b/src/_contour.cpp @@ -396,7 +396,7 @@ void QuadContourGenerator::append_contour_line_to_vertices( line(i, 0) = point->x; line(i, 1) = point->y; } - if (PyList_Append(vertices_list, line.pyobj())) { + if (PyList_Append(vertices_list, line.pyobj_steal())) { Py_XDECREF(vertices_list); throw "Unable to add contour line to vertices_list"; } @@ -470,8 +470,8 @@ void QuadContourGenerator::append_contour_to_vertices_and_codes( child.clear_parent(); // To indicate it can be deleted. } - if (PyList_Append(vertices_list, vertices.pyobj()) || - PyList_Append(codes_list, codes.pyobj())) { + if (PyList_Append(vertices_list, vertices.pyobj_steal()) || + PyList_Append(codes_list, codes.pyobj_steal())) { Py_XDECREF(vertices_list); Py_XDECREF(codes_list); contour.delete_contour_lines(); diff --git a/src/numpy_cpp.h b/src/numpy_cpp.h index d68a637bc117..26cba4fbf2fd 100644 --- a/src/numpy_cpp.h +++ b/src/numpy_cpp.h @@ -525,12 +525,19 @@ class array_view : public detail::array_view_accessors return (T *)m_data; } + // Return a new reference. PyObject *pyobj() { Py_XINCREF(m_arr); return (PyObject *)m_arr; } + // Steal a reference. + PyObject *pyobj_steal() + { + return (PyObject *)m_arr; + } + static int converter(PyObject *obj, void *arrp) { array_view *arr = (array_view *)arrp;