RNA fixes regarding dynamic array properties in functions parameters (reviewed by Brecht, thanks!):
* It was not clear that RNA_parameter_length_get() & co only affected dynamic properties, renamed them to RNA_parameter_dynamic_length_get() and such. * Fixed RNA_function_find_parameter(), we can't use BLI_findstring() here, need to call RNA_property_identifier()! * Fixed RNA_parameter_get() and RNA_parameter_set(), which were completely wrong for dynamic properties. * Fixed RNA_parameter_dynamic_length_get/set_data(), they did not check the property was actually a dynamic one and were using again ugly blackmagic casting intead of ParameterDynAlloc structure! * makesrna was still using an ugly hackish (and perhaps not always working) code when handling dynamic parameters, now synchronized with RNA_parameter_dynamic_length_get_data and RNA_parameter_get code.
This commit is contained in:
@@ -1073,10 +1073,11 @@ void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value);
|
||||
void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value);
|
||||
void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *value);
|
||||
void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value);
|
||||
int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm);
|
||||
int RNA_parameter_length_get_data(ParameterList *parms, PropertyRNA *parm, void *data);
|
||||
void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int length);
|
||||
void RNA_parameter_length_set_data(ParameterList *parms, PropertyRNA *parm, void *data, int length);
|
||||
/* Only for PROP_DYNAMIC properties! */
|
||||
int RNA_parameter_dynamic_length_get(ParameterList *parms, PropertyRNA *parm);
|
||||
int RNA_parameter_dynamic_length_get_data(ParameterList *parms, PropertyRNA *parm, void *data);
|
||||
void RNA_parameter_dynamic_length_set(ParameterList *parms, PropertyRNA *parm, int length);
|
||||
void RNA_parameter_dynamic_length_set_data(ParameterList *parms, PropertyRNA *parm, void *data, int length);
|
||||
|
||||
int RNA_function_call(struct bContext *C, struct ReportList *reports, PointerRNA *ptr,
|
||||
FunctionRNA *func, ParameterList *parms);
|
||||
|
||||
@@ -2273,11 +2273,12 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
|
||||
valstr = "*";
|
||||
}
|
||||
|
||||
/* this must be kept in sync with RNA_parameter_length_get_data,
|
||||
/* this must be kept in sync with RNA_parameter_dynamic_length_get_data and RNA_parameter_get,
|
||||
* we could just call the function directly, but this is faster */
|
||||
if (flag & PROP_DYNAMIC) {
|
||||
fprintf(f, "\t%s_len = %s((int *)_data);\n", dparm->prop->identifier, pout ? "" : "*");
|
||||
data_str = "(&(((char *)_data)[sizeof(void *)]))";
|
||||
fprintf(f, "\t%s_len = %s((ParameterDynAlloc *)_data)->array_tot;\n", dparm->prop->identifier,
|
||||
pout ? "(int *)&" : "(int)");
|
||||
data_str = "(&(((ParameterDynAlloc *)_data)->array))";
|
||||
}
|
||||
else {
|
||||
data_str = "_data";
|
||||
|
||||
@@ -5357,7 +5357,14 @@ PropertyRNA *RNA_function_get_parameter(PointerRNA *UNUSED(ptr), FunctionRNA *fu
|
||||
|
||||
PropertyRNA *RNA_function_find_parameter(PointerRNA *UNUSED(ptr), FunctionRNA *func, const char *identifier)
|
||||
{
|
||||
return BLI_findstring(&func->cont.properties, identifier, offsetof(PropertyRNA, identifier));
|
||||
PropertyRNA *parm;
|
||||
|
||||
parm = func->cont.properties.first;
|
||||
for (; parm; parm = parm->next)
|
||||
if (strcmp(RNA_property_identifier(parm), identifier) == 0)
|
||||
break;
|
||||
|
||||
return parm;
|
||||
}
|
||||
|
||||
const ListBase *RNA_function_defined_parameters(FunctionRNA *func)
|
||||
@@ -5529,10 +5536,19 @@ void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value)
|
||||
if (iter.parm == parm)
|
||||
break;
|
||||
|
||||
if (iter.valid)
|
||||
*value = iter.data;
|
||||
else
|
||||
if (iter.valid) {
|
||||
if (parm->flag & PROP_DYNAMIC) {
|
||||
/* for dynamic arrays and strings, data is a pointer to an array */
|
||||
ParameterDynAlloc *data_alloc = iter.data;
|
||||
*value = data_alloc->array;
|
||||
}
|
||||
else {
|
||||
*value = iter.data;
|
||||
}
|
||||
}
|
||||
else {
|
||||
*value = NULL;
|
||||
}
|
||||
|
||||
RNA_parameter_list_end(&iter);
|
||||
}
|
||||
@@ -5560,8 +5576,35 @@ void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *valu
|
||||
if (iter.parm == parm)
|
||||
break;
|
||||
|
||||
if (iter.valid)
|
||||
memcpy(iter.data, value, iter.size);
|
||||
if (iter.valid) {
|
||||
if (parm->flag & PROP_DYNAMIC) {
|
||||
/* for dynamic arrays and strings, data is a pointer to an array */
|
||||
ParameterDynAlloc *data_alloc = iter.data;
|
||||
size_t size = 0;
|
||||
switch (parm->type) {
|
||||
case PROP_STRING:
|
||||
size = sizeof(char);
|
||||
break;
|
||||
case PROP_INT:
|
||||
case PROP_BOOLEAN:
|
||||
size = sizeof(int);
|
||||
break;
|
||||
case PROP_FLOAT:
|
||||
size = sizeof(float);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
size *= data_alloc->array_tot;
|
||||
if (data_alloc->array)
|
||||
MEM_freeN(data_alloc->array);
|
||||
data_alloc->array = MEM_mallocN(size, AT);
|
||||
memcpy(data_alloc->array, value, size);
|
||||
}
|
||||
else {
|
||||
memcpy(iter.data, value, iter.size);
|
||||
}
|
||||
}
|
||||
|
||||
RNA_parameter_list_end(&iter);
|
||||
}
|
||||
@@ -5579,7 +5622,7 @@ void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, cons
|
||||
RNA_parameter_set(parms, parm, value);
|
||||
}
|
||||
|
||||
int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm)
|
||||
int RNA_parameter_dynamic_length_get(ParameterList *parms, PropertyRNA *parm)
|
||||
{
|
||||
ParameterIterator iter;
|
||||
int len = 0;
|
||||
@@ -5591,14 +5634,14 @@ int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm)
|
||||
break;
|
||||
|
||||
if (iter.valid)
|
||||
len = RNA_parameter_length_get_data(parms, parm, iter.data);
|
||||
len = RNA_parameter_dynamic_length_get_data(parms, parm, iter.data);
|
||||
|
||||
RNA_parameter_list_end(&iter);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int length)
|
||||
void RNA_parameter_dynamic_length_set(ParameterList *parms, PropertyRNA *parm, int length)
|
||||
{
|
||||
ParameterIterator iter;
|
||||
|
||||
@@ -5609,19 +5652,24 @@ void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int lengt
|
||||
break;
|
||||
|
||||
if (iter.valid)
|
||||
RNA_parameter_length_set_data(parms, parm, iter.data, length);
|
||||
RNA_parameter_dynamic_length_set_data(parms, parm, iter.data, length);
|
||||
|
||||
RNA_parameter_list_end(&iter);
|
||||
}
|
||||
|
||||
int RNA_parameter_length_get_data(ParameterList *UNUSED(parms), PropertyRNA *UNUSED(parm), void *data)
|
||||
int RNA_parameter_dynamic_length_get_data(ParameterList *UNUSED(parms), PropertyRNA *parm, void *data)
|
||||
{
|
||||
return *((int *)((char *)data));
|
||||
if (parm->flag & PROP_DYNAMIC) {
|
||||
return (int)((ParameterDynAlloc *)data)->array_tot;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void RNA_parameter_length_set_data(ParameterList *UNUSED(parms), PropertyRNA *UNUSED(parm), void *data, int length)
|
||||
void RNA_parameter_dynamic_length_set_data(ParameterList *UNUSED(parms), PropertyRNA *parm, void *data, int length)
|
||||
{
|
||||
*((int *)data) = length;
|
||||
if (parm->flag & PROP_DYNAMIC) {
|
||||
((ParameterDynAlloc *)data)->array_tot = (intptr_t)length;
|
||||
}
|
||||
}
|
||||
|
||||
int RNA_function_call(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
|
||||
|
||||
Reference in New Issue
Block a user