Cleanup: minor changes to Python argument parsing loop

- Increment the argument index at the end of the loop.
  Otherwise using the index after incrementing required subtracting 1.
- Move error prefix creation into a function: `pyrna_func_error_prefix`
  so it's possible to create an error prefix without duplicate code.

This simplifies further changes for argument parsing from D14047.
This commit is contained in:
2022-02-15 12:51:31 +11:00
parent a9a05d5597
commit e3a18a890d

View File

@@ -6017,6 +6017,36 @@ static PyObject *small_dict_get_item_string(PyObject *dict, const char *key_look
return NULL;
}
/**
* \param parm_index: The argument index or -1 for keyword arguments.
*/
static void pyrna_func_error_prefix(BPy_FunctionRNA *self,
PropertyRNA *parm,
const int parm_index,
char *error,
const size_t error_size)
{
PointerRNA *self_ptr = &self->ptr;
FunctionRNA *self_func = self->func;
if (parm_index == -1) {
BLI_snprintf(error,
error_size,
"%.200s.%.200s(): error with keyword argument \"%.200s\" - ",
RNA_struct_identifier(self_ptr->type),
RNA_function_identifier(self_func),
RNA_property_identifier(parm));
}
else {
BLI_snprintf(error,
error_size,
"%.200s.%.200s(): error with argument %d, \"%.200s\" - ",
RNA_struct_identifier(self_ptr->type),
RNA_function_identifier(self_func),
parm_index + 1,
RNA_property_identifier(parm));
}
}
static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject *kw)
{
/* NOTE: both BPy_StructRNA and BPy_PropertyRNA can be used here. */
@@ -6143,8 +6173,6 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
kw_arg = true;
}
i++; /* Current argument. */
if (item == NULL) {
if (flag_parameter & PARM_REQUIRED) {
PyErr_Format(PyExc_TypeError,
@@ -6156,46 +6184,33 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
break;
}
/* PyDict_GetItemString won't raise an error. */
continue;
}
else {
#ifdef DEBUG_STRING_FREE
if (item) {
if (PyUnicode_Check(item)) {
PyList_APPEND(string_free_ls, PyUnicode_FromString(PyUnicode_AsUTF8(item)));
if (item) {
if (PyUnicode_Check(item)) {
PyList_APPEND(string_free_ls, PyUnicode_FromString(PyUnicode_AsUTF8(item)));
}
}
}
#endif
err = pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
if (err != 0) {
/* the error generated isn't that useful, so generate it again with a useful prefix
* could also write a function to prepend to error messages */
char error_prefix[512];
PyErr_Clear(); /* Re-raise. */
if (kw_arg == true) {
BLI_snprintf(error_prefix,
sizeof(error_prefix),
"%.200s.%.200s(): error with keyword argument \"%.200s\" - ",
RNA_struct_identifier(self_ptr->type),
RNA_function_identifier(self_func),
RNA_property_identifier(parm));
err = pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
if (err != 0) {
PyErr_Clear(); /* Re-raise. */
pyrna_func_error_prefix(self, parm, kw_arg ? -1 : i, error_prefix, sizeof(error_prefix));
pyrna_py_to_prop(&funcptr, parm, iter.data, item, error_prefix);
break;
}
else {
BLI_snprintf(error_prefix,
sizeof(error_prefix),
"%.200s.%.200s(): error with argument %d, \"%.200s\" - ",
RNA_struct_identifier(self_ptr->type),
RNA_function_identifier(self_func),
i,
RNA_property_identifier(parm));
}
pyrna_py_to_prop(&funcptr, parm, iter.data, item, error_prefix);
break;
}
i++; /* Current argument. */
}
RNA_parameter_list_end(&iter);