PyAPI: support different int sizes for PyC_AsArray

This commit is contained in:
Campbell Barton 2021-07-27 22:35:01 +10:00
parent 58eacb8e7c
commit e37c876cd7
1 changed files with 44 additions and 2 deletions

View File

@ -103,6 +103,13 @@ int PyC_AsArray_FAST(void *array,
}
else if (type == &PyLong_Type) {
switch (array_item_size) {
case sizeof(int64_t): {
int64_t *array_int = array;
for (i = 0; i < length; i++) {
array_int[i] = PyC_Long_AsI64(value_fast_items[i]);
}
break;
}
case sizeof(int32_t): {
int32_t *array_int = array;
for (i = 0; i < length; i++) {
@ -110,6 +117,20 @@ int PyC_AsArray_FAST(void *array,
}
break;
}
case sizeof(int16_t): {
int16_t *array_int = array;
for (i = 0; i < length; i++) {
array_int[i] = PyC_Long_AsI16(value_fast_items[i]);
}
break;
}
case sizeof(int8_t): {
int8_t *array_int = array;
for (i = 0; i < length; i++) {
array_int[i] = PyC_Long_AsI8(value_fast_items[i]);
}
break;
}
default: {
/* Internal error. */
BLI_assert_unreachable();
@ -118,8 +139,29 @@ int PyC_AsArray_FAST(void *array,
}
else if (type == &PyBool_Type) {
switch (array_item_size) {
case sizeof(bool): {
bool *array_bool = array;
case sizeof(int64_t): {
int64_t *array_bool = array;
for (i = 0; i < length; i++) {
array_bool[i] = (PyLong_AsLong(value_fast_items[i]) != 0);
}
break;
}
case sizeof(int32_t): {
int32_t *array_bool = array;
for (i = 0; i < length; i++) {
array_bool[i] = (PyLong_AsLong(value_fast_items[i]) != 0);
}
break;
}
case sizeof(int16_t): {
int16_t *array_bool = array;
for (i = 0; i < length; i++) {
array_bool[i] = (PyLong_AsLong(value_fast_items[i]) != 0);
}
break;
}
case sizeof(int8_t): {
int8_t *array_bool = array;
for (i = 0; i < length; i++) {
array_bool[i] = (PyLong_AsLong(value_fast_items[i]) != 0);
}