diff --git a/include/boost/python/slice.hpp b/include/boost/python/slice.hpp index 99d8d8b0..6c54ad7b 100644 --- a/include/boost/python/slice.hpp +++ b/include/boost/python/slice.hpp @@ -18,22 +18,26 @@ namespace boost { namespace python { class slice : public object { + private: + // Helper function to work around bugs in MSVC 6 + BOOST_PYTHON_DECL + static object new_slice(PyObject*, PyObject*, PyObject*); + public: // Equivalent to slice(::) + BOOST_PYTHON_DECL slice(); // Each argument must be int, slice_nil, or implicitly convertable to int template slice( Integer1 start, Integer2 stop) - : object( boost::python::detail::new_reference( - PySlice_New( object(start).ptr(), object(stop).ptr(), NULL))) + : object( new_slice( object(start).ptr(), object(stop).ptr(), NULL)) {} template slice( Integer1 start, Integer2 stop, Integer3 stride) - : object( boost::python::detail::new_reference( - PySlice_New( object(start).ptr(), object(stop).ptr(), - object(stride).ptr()))) + : object( + new_slice( object(start).ptr(), object(stop).ptr(), object(stride).ptr())) {} // Get the Python objects associated with the slice. In principle, these diff --git a/src/slice.cpp b/src/slice.cpp index 273c8924..55f8e865 100644 --- a/src/slice.cpp +++ b/src/slice.cpp @@ -8,6 +8,12 @@ namespace boost { namespace python { +object +slice::new_slice(PyObject* start, PyObject* stop, PyObject* step) +{ + return object(detail::new_reference( PySlice_New(start, stop, step))); +} + slice::slice() : object( boost::python::detail::new_reference( PySlice_New( NULL, NULL, NULL))) diff --git a/test/slice.cpp b/test/slice.cpp index 99b633cd..37d9e83d 100644 --- a/test/slice.cpp +++ b/test/slice.cpp @@ -37,17 +37,17 @@ bool check_string_rich_slice() bool check_numeric_array_rich_slice() { using numeric::array; - object original = array( make_tuple( make_tuple( 11, 12, 13, 14), + array original = array( make_tuple( make_tuple( 11, 12, 13, 14), make_tuple( 21, 22, 23, 24), make_tuple( 31, 32, 33, 34), make_tuple( 41, 42, 43, 44))); - object upper_left_quadrant = array( make_tuple( make_tuple( 11, 12), + array upper_left_quadrant = array( make_tuple( make_tuple( 11, 12), make_tuple( 21, 22))); - object odd_cells = array( make_tuple( make_tuple( 11, 13), + array odd_cells = array( make_tuple( make_tuple( 11, 13), make_tuple( 31, 33))); - object even_cells = array( make_tuple( make_tuple( 22, 24), + array even_cells = array( make_tuple( make_tuple( 22, 24), make_tuple( 42, 44))); - object lower_right_quadrant_reversed = array( + array lower_right_quadrant_reversed = array( make_tuple( make_tuple(44, 43), make_tuple(34, 33)));