From ddee0931b8687d01186f1941d483c6b3622d1833 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 1 Jul 2018 15:47:09 +0200 Subject: RNA: use bool for boolean RNA types We were using int's for bool arguments in BKE, just to avoid having wrapper functions. --- source/blender/python/generic/py_capi_utils.c | 2 +- source/blender/python/intern/bpy_props.c | 21 +++++++----- source/blender/python/intern/bpy_rna.c | 25 ++++++++------ source/blender/python/intern/bpy_rna_array.c | 47 ++++++++++++++++++++++----- 4 files changed, 66 insertions(+), 29 deletions(-) (limited to 'source/blender/python') diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index cee9ad3b477..d2d78167fae 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -91,7 +91,7 @@ int PyC_AsArray_FAST( } } else if (type == &PyBool_Type) { - int *array_bool = array; + bool *array_bool = array; for (i = 0; i < length; i++) { array_bool[i] = (PyLong_AsLong(value_fast_items[i]) != 0); } diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index d0b0331430d..a7f55116cd4 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -263,7 +263,7 @@ static void bpy_prop_update_cb(struct bContext *C, struct PointerRNA *ptr, struc } } -static int bpy_prop_boolean_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop) +static bool bpy_prop_boolean_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop) { PyObject **py_data = RNA_property_py_data_get(prop); PyObject *py_func; @@ -273,7 +273,7 @@ static int bpy_prop_boolean_get_cb(struct PointerRNA *ptr, struct PropertyRNA *p PyGILState_STATE gilstate; bool use_gil; const bool is_write_ok = pyrna_write_check(); - int value; + bool value; BLI_assert(py_data != NULL); @@ -301,12 +301,15 @@ static int bpy_prop_boolean_get_cb(struct PointerRNA *ptr, struct PropertyRNA *p value = false; } else { - value = PyC_Long_AsI32(ret); + int value_i = PyC_Long_AsBool(ret); - if (value == -1 && PyErr_Occurred()) { + if (value_i == -1 && PyErr_Occurred()) { PyC_Err_PrintWithFunc(py_func); value = false; } + else { + value = (bool)value_i; + } Py_DECREF(ret); } @@ -321,7 +324,7 @@ static int bpy_prop_boolean_get_cb(struct PointerRNA *ptr, struct PropertyRNA *p return value; } -static void bpy_prop_boolean_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, int value) +static void bpy_prop_boolean_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, bool value) { PyObject **py_data = RNA_property_py_data_get(prop); PyObject *py_func; @@ -420,7 +423,7 @@ static int bpy_prop_poll_cb(struct PointerRNA *self, PointerRNA candidate, struc return result; } -static void bpy_prop_boolean_array_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, int *values) +static void bpy_prop_boolean_array_get_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, bool *values) { PyObject **py_data = RNA_property_py_data_get(prop); PyObject *py_func; @@ -481,7 +484,7 @@ static void bpy_prop_boolean_array_get_cb(struct PointerRNA *ptr, struct Propert } } -static void bpy_prop_boolean_array_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, const int *values) +static void bpy_prop_boolean_array_set_cb(struct PointerRNA *ptr, struct PropertyRNA *prop, const bool *values) { PyObject **py_data = RNA_property_py_data_get(prop); PyObject *py_func; @@ -511,7 +514,7 @@ static void bpy_prop_boolean_array_set_cb(struct PointerRNA *ptr, struct Propert self = pyrna_struct_as_instance(ptr); PyTuple_SET_ITEM(args, 0, self); - py_values = PyC_Tuple_PackArray_I32FromBool(values, len); + py_values = PyC_Tuple_PackArray_Bool(values, len); PyTuple_SET_ITEM(args, 1, py_values); ret = PyObject_CallObject(py_func, args); @@ -2097,7 +2100,7 @@ static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject if (srna) { const char *id = NULL, *name = NULL, *description = ""; int id_len; - int def[PYRNA_STACK_ARRAY] = {0}; + bool def[PYRNA_STACK_ARRAY] = {0}; int size = 3; PropertyRNA *prop; PyObject *pydef = NULL; diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 8c47ba3c2c5..9052b6f580a 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -1667,7 +1667,7 @@ static int pyrna_py_to_prop( return -1; } else { - if (data) *((int *)data) = param; + if (data) *((bool *)data) = param; else RNA_property_boolean_set(ptr, prop, param); } break; @@ -2477,9 +2477,9 @@ static PyObject *pyrna_prop_array_subscript_slice( } case PROP_BOOLEAN: { - int values_stack[PYRNA_STACK_ARRAY]; - int *values; - if (length > PYRNA_STACK_ARRAY) { values = PyMem_MALLOC(sizeof(int) * length); } + bool values_stack[PYRNA_STACK_ARRAY]; + bool *values; + if (length > PYRNA_STACK_ARRAY) { values = PyMem_MALLOC(sizeof(bool) * length); } else { values = values_stack; } RNA_property_boolean_get_array(ptr, prop, values); @@ -2860,7 +2860,7 @@ static int prop_subscript_ass_array_slice__int_recursive( } static int prop_subscript_ass_array_slice__bool_recursive( - PyObject **value_items, int *value, + PyObject **value_items, bool *value, int totdim, const int dimsize[]) { const int length = dimsize[0]; @@ -2983,9 +2983,9 @@ static int prop_subscript_ass_array_slice( } case PROP_BOOLEAN: { - int values_stack[PYRNA_STACK_ARRAY]; - int *values = (length_flat > PYRNA_STACK_ARRAY) ? - (values_alloc = PyMem_MALLOC(sizeof(*values) * length_flat)) : values_stack; + bool values_stack[PYRNA_STACK_ARRAY]; + bool *values = (length_flat > PYRNA_STACK_ARRAY) ? + (values_alloc = PyMem_MALLOC(sizeof(bool) * length_flat)) : values_stack; if (start != 0 || stop != length) { /* partial assignment? - need to get the array */ @@ -4915,6 +4915,8 @@ static bool foreach_compat_buffer(RawPropertyType raw_type, int attr_signed, con case PROP_RAW_INT: if (attr_signed) return (f == 'i') ? 1 : 0; else return (f == 'I') ? 1 : 0; + case PROP_RAW_BOOLEAN: + return (f == '?') ? 1 : 0; case PROP_RAW_FLOAT: return (f == 'f') ? 1 : 0; case PROP_RAW_DOUBLE: @@ -4981,6 +4983,9 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set) case PROP_RAW_INT: ((int *)array)[i] = (int)PyLong_AsLong(item); break; + case PROP_RAW_BOOLEAN: + ((bool *)array)[i] = (int)PyLong_AsLong(item) != 0; + break; case PROP_RAW_FLOAT: ((float *)array)[i] = (float)PyFloat_AsDouble(item); break; @@ -5313,7 +5318,7 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat case PROP_BOOLEAN: ret = PyTuple_New(len); for (a = 0; a < len; a++) - PyTuple_SET_ITEM(ret, a, PyBool_FromLong(((int *)data)[a])); + PyTuple_SET_ITEM(ret, a, PyBool_FromLong(((bool *)data)[a])); break; case PROP_INT: ret = PyTuple_New(len); @@ -5356,7 +5361,7 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat /* see if we can coerce into a python type - PropertyType */ switch (type) { case PROP_BOOLEAN: - ret = PyBool_FromLong(*(int *)data); + ret = PyBool_FromLong(*(bool *)data); break; case PROP_INT: ret = PyLong_FromLong(*(int *)data); diff --git a/source/blender/python/intern/bpy_rna_array.c b/source/blender/python/intern/bpy_rna_array.c index 571ee0edea2..9a184df8054 100644 --- a/source/blender/python/intern/bpy_rna_array.c +++ b/source/blender/python/intern/bpy_rna_array.c @@ -564,7 +564,7 @@ static void py_to_int(const struct ItemConvertArgData *arg, PyObject *py, char * static void py_to_bool(const struct ItemConvertArgData *UNUSED(arg), PyObject *py, char *data) { - *(int *)data = (int)PyObject_IsTrue(py); + *(bool *)data = (bool)PyObject_IsTrue(py); } static int py_float_check(PyObject *py) @@ -596,7 +596,7 @@ static void int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *v static void bool_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value) { - RNA_property_boolean_set_index(ptr, prop, index, *(int *)value); + RNA_property_boolean_set_index(ptr, prop, index, *(bool *)value); } static void convert_item_init_float( @@ -655,7 +655,7 @@ int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data, convert_item_init_bool(ptr, prop, &convert_item); ret = py_to_array( - py, ptr, prop, param_data, py_bool_check, "boolean", sizeof(int), + py, ptr, prop, param_data, py_bool_check, "boolean", sizeof(bool), &convert_item, (RNA_SetArrayFunc)RNA_property_boolean_set_array, error_prefix); break; } @@ -885,10 +885,9 @@ int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value) } break; } - case PROP_BOOLEAN: case PROP_INT: { - int value_i = PyLong_AsLong(value); + int value_i = PyC_Long_AsI32(value); if (value_i == -1 && PyErr_Occurred()) { PyErr_Clear(); return 0; @@ -904,10 +903,40 @@ int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value) tmp_arr = tmp; } - if (type == PROP_BOOLEAN) - RNA_property_boolean_get_array(ptr, prop, tmp_arr); - else - RNA_property_int_get_array(ptr, prop, tmp_arr); + RNA_property_int_get_array(ptr, prop, tmp_arr); + + for (i = 0; i < len; i++) { + if (tmp_arr[i] == value_i) { + break; + } + } + + if (tmp_arr != tmp) + PyMem_FREE(tmp_arr); + + return i < len ? 1 : 0; + } + break; + } + case PROP_BOOLEAN: + { + int value_i = PyC_Long_AsBool(value); + if (value_i == -1 && PyErr_Occurred()) { + PyErr_Clear(); + return 0; + } + else { + bool tmp[32]; + bool *tmp_arr; + + if (len * sizeof(bool) > sizeof(tmp)) { + tmp_arr = PyMem_MALLOC(len * sizeof(bool)); + } + else { + tmp_arr = tmp; + } + + RNA_property_boolean_get_array(ptr, prop, tmp_arr); for (i = 0; i < len; i++) { if (tmp_arr[i] == value_i) { -- cgit v1.2.3