| 931 | } |
| 932 | |
| 933 | static int write_primitive_sequence(PyObject **items, Py_ssize_t size, |
| 934 | Buffer *buffer, uint8_t type_id) { |
| 935 | switch (static_cast<TypeId>(type_id)) { |
| 936 | case TypeId::STRING: |
| 937 | for (Py_ssize_t i = 0; i < size; ++i) { |
| 938 | if (FORY_PREDICT_FALSE(write_python_string(buffer, items[i]) != 0)) { |
| 939 | return -1; |
| 940 | } |
| 941 | } |
| 942 | return 0; |
| 943 | case TypeId::VARINT64: |
| 944 | if (FORY_PREDICT_FALSE(static_cast<uint64_t>(size) > |
| 945 | std::numeric_limits<uint32_t>::max() / 9ULL)) { |
| 946 | PyErr_SetString(PyExc_OverflowError, "varint64 collection too large"); |
| 947 | return -1; |
| 948 | } |
| 949 | { |
| 950 | const uint32_t max_byte_size = static_cast<uint32_t>(size) * 9U; |
| 951 | const uint32_t writer_index = buffer->writer_index(); |
| 952 | buffer->grow(max_byte_size); |
| 953 | uint32_t offset = writer_index; |
| 954 | for (Py_ssize_t i = 0; i < size; ++i) { |
| 955 | int64_t v = 0; |
| 956 | if (FORY_PREDICT_FALSE(!py_long_to_int64(items[i], &v))) { |
| 957 | return -1; |
| 958 | } |
| 959 | const uint64_t zigzag = |
| 960 | (static_cast<uint64_t>(v) << 1) ^ static_cast<uint64_t>(v >> 63); |
| 961 | offset += buffer->put_var_uint64(offset, zigzag); |
| 962 | } |
| 963 | buffer->increase_writer_index(offset - writer_index); |
| 964 | } |
| 965 | return 0; |
| 966 | case TypeId::VARINT32: |
| 967 | if (FORY_PREDICT_FALSE(static_cast<uint64_t>(size) > |
| 968 | std::numeric_limits<uint32_t>::max() / 5ULL)) { |
| 969 | PyErr_SetString(PyExc_OverflowError, "varint32 collection too large"); |
| 970 | return -1; |
| 971 | } |
| 972 | { |
| 973 | const uint32_t max_byte_size = static_cast<uint32_t>(size) * 5U; |
| 974 | const uint32_t writer_index = buffer->writer_index(); |
| 975 | buffer->grow(max_byte_size); |
| 976 | uint32_t offset = writer_index; |
| 977 | for (Py_ssize_t i = 0; i < size; ++i) { |
| 978 | int32_t v = 0; |
| 979 | if (FORY_PREDICT_FALSE( |
| 980 | !py_long_to_integral_range<int32_t>(items[i], "int32", &v))) { |
| 981 | return -1; |
| 982 | } |
| 983 | const uint32_t zigzag = |
| 984 | (static_cast<uint32_t>(v) << 1) ^ static_cast<uint32_t>(v >> 31); |
| 985 | offset += buffer->put_var_uint32(offset, zigzag); |
| 986 | } |
| 987 | buffer->increase_writer_index(offset - writer_index); |
| 988 | } |
| 989 | return 0; |
| 990 | case TypeId::BOOL: { |
no test coverage detected