|
20 | 20 | * should be used to speed up BSON encoding and decoding.
|
21 | 21 | */
|
22 | 22 |
|
| 23 | +#define PY_SSIZE_T_CLEAN |
23 | 24 | #include "Python.h"
|
24 | 25 | #include "datetime.h"
|
25 | 26 |
|
@@ -1818,13 +1819,8 @@ static PyObject* _cbson_dict_to_bson(PyObject* self, PyObject* args) {
|
1818 | 1819 | }
|
1819 | 1820 |
|
1820 | 1821 | /* objectify buffer */
|
1821 |
| -#if PY_MAJOR_VERSION >= 3 |
1822 |
| - result = Py_BuildValue("y#", buffer_get_buffer(buffer), |
1823 |
| - buffer_get_position(buffer)); |
1824 |
| -#else |
1825 |
| - result = Py_BuildValue("s#", buffer_get_buffer(buffer), |
1826 |
| - buffer_get_position(buffer)); |
1827 |
| -#endif |
| 1822 | + result = Py_BuildValue(BYTES_FORMAT_STRING, buffer_get_buffer(buffer), |
| 1823 | + (Py_ssize_t)buffer_get_position(buffer)); |
1828 | 1824 | destroy_codec_options(&options);
|
1829 | 1825 | buffer_free(buffer);
|
1830 | 1826 | return result;
|
@@ -1896,7 +1892,7 @@ static PyObject* get_value(PyObject* self, PyObject* name, const char* buffer,
|
1896 | 1892 | if (options->is_raw_bson) {
|
1897 | 1893 | value = PyObject_CallFunction(
|
1898 | 1894 | options->document_class, BYTES_FORMAT_STRING "O",
|
1899 |
| - buffer + *position, size, options->options_obj); |
| 1895 | + buffer + *position, (Py_ssize_t)size, options->options_obj); |
1900 | 1896 | if (!value) {
|
1901 | 1897 | goto invalid;
|
1902 | 1898 | }
|
@@ -2175,11 +2171,8 @@ static PyObject* get_value(PyObject* self, PyObject* name, const char* buffer,
|
2175 | 2171 | goto invalid;
|
2176 | 2172 | }
|
2177 | 2173 | if ((objectid_type = _get_object(state->ObjectId, "bson.objectid", "ObjectId"))) {
|
2178 |
| -#if PY_MAJOR_VERSION >= 3 |
2179 |
| - value = PyObject_CallFunction(objectid_type, "y#", buffer + *position, 12); |
2180 |
| -#else |
2181 |
| - value = PyObject_CallFunction(objectid_type, "s#", buffer + *position, 12); |
2182 |
| -#endif |
| 2174 | + value = PyObject_CallFunction(objectid_type, BYTES_FORMAT_STRING, |
| 2175 | + buffer + *position, (Py_ssize_t)12); |
2183 | 2176 | Py_DECREF(objectid_type);
|
2184 | 2177 | }
|
2185 | 2178 | *position += 12;
|
@@ -2365,11 +2358,8 @@ static PyObject* get_value(PyObject* self, PyObject* name, const char* buffer,
|
2365 | 2358 | *position += coll_length;
|
2366 | 2359 |
|
2367 | 2360 | if ((objectid_type = _get_object(state->ObjectId, "bson.objectid", "ObjectId"))) {
|
2368 |
| -#if PY_MAJOR_VERSION >= 3 |
2369 |
| - id = PyObject_CallFunction(objectid_type, "y#", buffer + *position, 12); |
2370 |
| -#else |
2371 |
| - id = PyObject_CallFunction(objectid_type, "s#", buffer + *position, 12); |
2372 |
| -#endif |
| 2361 | + id = PyObject_CallFunction(objectid_type, BYTES_FORMAT_STRING, |
| 2362 | + buffer + *position, (Py_ssize_t)12); |
2373 | 2363 | Py_DECREF(objectid_type);
|
2374 | 2364 | }
|
2375 | 2365 | if (!id) {
|
@@ -2556,13 +2546,9 @@ static PyObject* get_value(PyObject* self, PyObject* name, const char* buffer,
|
2556 | 2546 | "Decimal128"))) {
|
2557 | 2547 | value = PyObject_CallMethod(dec128,
|
2558 | 2548 | "from_bid",
|
2559 |
| -#if PY_MAJOR_VERSION >= 3 |
2560 |
| - "y#", |
2561 |
| -#else |
2562 |
| - "s#", |
2563 |
| -#endif |
| 2549 | + BYTES_FORMAT_STRING, |
2564 | 2550 | buffer + *position,
|
2565 |
| - 16); |
| 2551 | + (Py_ssize_t)16); |
2566 | 2552 | Py_DECREF(dec128);
|
2567 | 2553 | }
|
2568 | 2554 | *position += 16;
|
@@ -2939,7 +2925,7 @@ static PyObject* _cbson_bson_to_dict(PyObject* self, PyObject* args) {
|
2939 | 2925 | /* No need to decode fields if using RawBSONDocument */
|
2940 | 2926 | if (options.is_raw_bson) {
|
2941 | 2927 | result = PyObject_CallFunction(
|
2942 |
| - options.document_class, BYTES_FORMAT_STRING "O", string, size, |
| 2928 | + options.document_class, BYTES_FORMAT_STRING "O", string, (Py_ssize_t)size, |
2943 | 2929 | options_obj);
|
2944 | 2930 | }
|
2945 | 2931 | else {
|
@@ -3031,7 +3017,7 @@ static PyObject* _cbson_decode_all(PyObject* self, PyObject* args) {
|
3031 | 3017 | /* No need to decode fields if using RawBSONDocument. */
|
3032 | 3018 | if (options.is_raw_bson) {
|
3033 | 3019 | dict = PyObject_CallFunction(
|
3034 |
| - options.document_class, BYTES_FORMAT_STRING "O", string, size, |
| 3020 | + options.document_class, BYTES_FORMAT_STRING "O", string, (Py_ssize_t)size, |
3035 | 3021 | options_obj);
|
3036 | 3022 | } else {
|
3037 | 3023 | dict = elements_to_dict(self, string + 4, (unsigned)size - 5, &options);
|
@@ -3143,6 +3129,7 @@ init_cbson(void)
|
3143 | 3129 | _cbson_API[_cbson_buffer_write_int64_INDEX] = (void *) buffer_write_int64;
|
3144 | 3130 | _cbson_API[_cbson_buffer_write_int32_at_position_INDEX] =
|
3145 | 3131 | (void *) buffer_write_int32_at_position;
|
| 3132 | + _cbson_API[_cbson_downcast_and_check_INDEX] = (void *) _downcast_and_check; |
3146 | 3133 |
|
3147 | 3134 | #if PY_VERSION_HEX >= 0x03010000
|
3148 | 3135 | /* PyCapsule is new in python 3.1 */
|
|
0 commit comments