From 4eb286a0347afb14067ec16242c536071bd1e108 Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Tue, 26 Sep 2006 00:48:44 +0000 Subject: [PATCH] ssize_t patches merged from HEAD [SVN r35327] --- doc/v2/reference.html | 10 +++++++++ .../python/converter/builtin_converters.hpp | 5 +++-- include/boost/python/list.hpp | 9 ++++---- include/boost/python/object.hpp | 6 ++--- src/list.cpp | 5 +++-- src/object/class.cpp | 6 +++-- src/object/function.cpp | 9 +++++--- src/object_protocol.cpp | 5 +++-- src/str.cpp | 22 +++++++++++++++++-- 9 files changed, 57 insertions(+), 20 deletions(-) diff --git a/doc/v2/reference.html b/doc/v2/reference.html index 5c3a9366..61dca9c6 100644 --- a/doc/v2/reference.html +++ b/doc/v2/reference.html @@ -1094,6 +1094,16 @@ + +
ssize_t.hpp
+ +
+
+
Typedefs
+ +
Constants
+
+

Topics

diff --git a/include/boost/python/converter/builtin_converters.hpp b/include/boost/python/converter/builtin_converters.hpp index 3ae45c37..dddb154c 100644 --- a/include/boost/python/converter/builtin_converters.hpp +++ b/include/boost/python/converter/builtin_converters.hpp @@ -7,6 +7,7 @@ # include # include # include +# include # include # include # include @@ -115,9 +116,9 @@ BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned BOOST_PYTHON_LONG_LONG, ::PyLong_FromUn BOOST_PYTHON_TO_PYTHON_BY_VALUE(char, converter::do_return_to_python(x)) BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const*, converter::do_return_to_python(x)) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyString_FromStringAndSize(x.data(),implicit_cast(x.size()))) +BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyString_FromStringAndSize(x.data(),implicit_cast(x.size()))) #if defined(Py_USING_UNICODE) && !defined(BOOST_NO_STD_WSTRING) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast(x.size()))) +BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast(x.size()))) # endif BOOST_PYTHON_TO_PYTHON_BY_VALUE(float, ::PyFloat_FromDouble(x)) BOOST_PYTHON_TO_PYTHON_BY_VALUE(double, ::PyFloat_FromDouble(x)) diff --git a/include/boost/python/list.hpp b/include/boost/python/list.hpp index 793cd08a..0f6d1e8e 100644 --- a/include/boost/python/list.hpp +++ b/include/boost/python/list.hpp @@ -9,6 +9,7 @@ # include # include +# include namespace boost { namespace python { @@ -24,11 +25,11 @@ namespace detail long index(object_cref value) const; // return index of first occurrence of value - void insert(int index, object_cref); // insert object before index + void insert(ssize_t index, object_cref); // insert object before index void insert(object const& index, object_cref); object pop(); // remove and return item at index (default last) - object pop(long index); + object pop(ssize_t index); object pop(object const& index); void remove(object_cref value); // remove first occurrence of value @@ -86,7 +87,7 @@ class list : public detail::list_base } template - void insert(int index, T const& x) // insert object before index + void insert(ssize_t index, T const& x) // insert object before index { base::insert(index, object(x)); } @@ -98,7 +99,7 @@ class list : public detail::list_base } object pop() { return base::pop(); } - object pop(long index) { return base::pop(index); } + object pop(ssize_t index) { return base::pop(index); } template object pop(T const& index) diff --git a/include/boost/python/object.hpp b/include/boost/python/object.hpp index 677ffb42..9adec90f 100755 --- a/include/boost/python/object.hpp +++ b/include/boost/python/object.hpp @@ -5,7 +5,7 @@ #ifndef OBJECT_DWA2002612_HPP # define OBJECT_DWA2002612_HPP -# include +# include # include # include # include @@ -15,9 +15,9 @@ namespace boost { namespace python { - inline long len(object const& obj) + inline ssize_t len(object const& obj) { - long result = PyObject_Length(obj.ptr()); + ssize_t result = PyObject_Length(obj.ptr()); if (PyErr_Occurred()) throw_error_already_set(); return result; } diff --git a/src/list.cpp b/src/list.cpp index 79f758a9..b8f31fb8 100644 --- a/src/list.cpp +++ b/src/list.cpp @@ -3,6 +3,7 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include +#include namespace boost { namespace python { namespace detail { @@ -53,7 +54,7 @@ long list_base::index(object_cref value) const return result; } -void list_base::insert(int index, object_cref item) +void list_base::insert(ssize_t index, object_cref item) { if (PyList_CheckExact(this->ptr())) { @@ -79,7 +80,7 @@ object list_base::pop() return this->attr("pop")(); } -object list_base::pop(long index) +object list_base::pop(ssize_t index) { return this->pop(object(index)); } diff --git a/src/object/class.cpp b/src/object/class.cpp index efc492c6..58234bbb 100644 --- a/src/object/class.cpp +++ b/src/object/class.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -506,13 +507,14 @@ namespace objects // were declared, we'll use our class_type() as the single base // class. std::size_t const num_bases = (std::max)(num_types - 1, static_cast(1)); - handle<> bases(PyTuple_New(num_bases)); + assert(num_bases <= ssize_t_max); + handle<> bases(PyTuple_New(static_cast(num_bases))); for (std::size_t i = 1; i <= num_bases; ++i) { type_handle c = (i >= num_types) ? class_type() : get_class(types[i]); // PyTuple_SET_ITEM steals this reference - PyTuple_SET_ITEM(bases.get(), i - 1, upcast(c.release())); + PyTuple_SET_ITEM(bases.get(), static_cast(i - 1), upcast(c.release())); } // Call the class metatype to create a new class diff --git a/src/object/function.cpp b/src/object/function.cpp index 653343b9..1f094f42 100644 --- a/src/object/function.cpp +++ b/src/object/function.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -64,7 +65,7 @@ function::function( = max_arity > num_keywords ? max_arity - num_keywords : 0; - unsigned tuple_size = num_keywords ? max_arity : 0; + ssize_t tuple_size = num_keywords ? max_arity : 0; m_arg_names = object(handle<>(PyTuple_New(tuple_size))); if (num_keywords != 0) @@ -158,7 +159,9 @@ PyObject* function::call(PyObject* args, PyObject* keywords) const else { // build a new arg tuple, will adjust its size later - inner_args = handle<>(PyTuple_New(max_arity)); + assert(max_arity <= ssize_t_max); + inner_args = handle<>( + PyTuple_New(static_cast(max_arity))); // Fill in the positional arguments for (std::size_t i = 0; i < n_unnamed_actual; ++i) @@ -293,7 +296,7 @@ void function::argument_error(PyObject* args, PyObject* /*keywords*/) const % make_tuple(this->m_namespace, this->m_name); list actual_args; - for (int i = 0; i < PyTuple_Size(args); ++i) + for (ssize_t i = 0; i < PyTuple_Size(args); ++i) { char const* name = PyTuple_GetItem(args, i)->ob_type->tp_name; actual_args.append(str(name)); diff --git a/src/object_protocol.cpp b/src/object_protocol.cpp index c23b8bb3..8606fa2b 100755 --- a/src/object_protocol.cpp +++ b/src/object_protocol.cpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace boost { namespace python { namespace api { @@ -106,7 +107,7 @@ namespace // slicing code copied directly out of the Python implementation PySequenceMethods *sq = tp->tp_as_sequence; if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { - int ilow = 0, ihigh = INT_MAX; + ssize_t ilow = 0, ihigh = ssize_t_max; if (!_PyEval_SliceIndex(v, &ilow)) return NULL; if (!_PyEval_SliceIndex(w, &ihigh)) @@ -133,7 +134,7 @@ namespace // slicing code copied directly out of the Python implementation PySequenceMethods *sq = tp->tp_as_sequence; if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { - int ilow = 0, ihigh = INT_MAX; + ssize_t ilow = 0, ihigh = ssize_t_max; if (!_PyEval_SliceIndex(v, &ilow)) return -1; if (!_PyEval_SliceIndex(w, &ihigh)) diff --git a/src/str.cpp b/src/str.cpp index c452a285..5216cf54 100644 --- a/src/str.cpp +++ b/src/str.cpp @@ -3,6 +3,7 @@ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include +#include namespace boost { namespace python { namespace detail { @@ -21,10 +22,25 @@ str_base::str_base(const char* s) : object(detail::new_reference(::PyString_FromString(s))) {} +namespace { + + ssize_t str_size_as_py_ssize_t(std::size_t n) + { + if (n > ssize_t_max) + { + throw std::range_error("str size > ssize_t_max"); + } + return static_cast(n); + } + +} // namespace + str_base::str_base(char const* start, char const* finish) : object( detail::new_reference( - ::PyString_FromStringAndSize(start, finish - start) + ::PyString_FromStringAndSize( + start, str_size_as_py_ssize_t(finish - start) + ) ) ) {} @@ -32,7 +48,9 @@ str_base::str_base(char const* start, char const* finish) str_base::str_base(char const* start, std::size_t length) // new str : object( detail::new_reference( - ::PyString_FromStringAndSize(start, length) + ::PyString_FromStringAndSize( + start, str_size_as_py_ssize_t(length) + ) ) ) {}