MCPcopy Index your code
hub / github.com/apache/fory / write_primitive_sequence

Function write_primitive_sequence

python/pyfory/cpp/pyfory.cc:933–1113  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

931}
932
933static 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: {

Calls 10

write_python_stringFunction · 0.85
py_long_to_int64Function · 0.85
write_primitive_itemFunction · 0.85
writer_indexMethod · 0.80
put_var_uint64Method · 0.80
increase_writer_indexMethod · 0.80
put_var_uint32Method · 0.80
unsafe_put_byteMethod · 0.80
unsafe_putMethod · 0.80
growMethod · 0.65

Tested by

no test coverage detected