Fix RNA parameter passing issue with dynamic arrays, was computing the wrong

size in some cases.
This commit is contained in:
Brecht Van Lommel 2013-08-11 15:49:27 +00:00
parent 48ae40ccdf
commit 33686720f2
4 changed files with 11 additions and 24 deletions

@ -2292,7 +2292,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
} }
if (dparm->next) if (dparm->next)
fprintf(f, "\t_data += %d;\n", rna_parameter_size_alloc(dparm->prop)); fprintf(f, "\t_data += %d;\n", rna_parameter_size(dparm->prop));
} }
if (dfunc->call) { if (dfunc->call) {

@ -5378,7 +5378,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
/* allocate data */ /* allocate data */
for (parm = func->cont.properties.first; parm; parm = parm->next) { for (parm = func->cont.properties.first; parm; parm = parm->next) {
alloc_size += rna_parameter_size_alloc(parm); alloc_size += rna_parameter_size(parm);
if (parm->flag & PROP_OUTPUT) if (parm->flag & PROP_OUTPUT)
parms->ret_count++; parms->ret_count++;
@ -5440,7 +5440,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
} }
} }
data = ((char *)data) + rna_parameter_size_alloc(parm); data = ((char *)data) + rna_parameter_size(parm);
} }
return parms; return parms;
@ -5462,7 +5462,7 @@ void RNA_parameter_list_free(ParameterList *parms)
MEM_freeN(data_alloc->array); MEM_freeN(data_alloc->array);
} }
tot += rna_parameter_size_alloc(parm); tot += rna_parameter_size(parm);
} }
MEM_freeN(parms->data); MEM_freeN(parms->data);
@ -5497,7 +5497,7 @@ void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
iter->offset = 0; iter->offset = 0;
if (iter->valid) { if (iter->valid) {
iter->size = rna_parameter_size_alloc(iter->parm); iter->size = rna_parameter_size(iter->parm);
iter->data = (((char *)iter->parms->data)); /* +iter->offset, always 0 */ iter->data = (((char *)iter->parms->data)); /* +iter->offset, always 0 */
} }
} }
@ -5509,7 +5509,7 @@ void RNA_parameter_list_next(ParameterIterator *iter)
iter->valid = iter->parm != NULL; iter->valid = iter->parm != NULL;
if (iter->valid) { if (iter->valid) {
iter->size = rna_parameter_size_alloc(iter->parm); iter->size = rna_parameter_size(iter->parm);
iter->data = (((char *)iter->parms->data) + iter->offset); iter->data = (((char *)iter->parms->data) + iter->offset);
} }
} }

@ -3039,13 +3039,13 @@ void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
int rna_parameter_size(PropertyRNA *parm) int rna_parameter_size(PropertyRNA *parm)
{ {
PropertyType ptype = parm->type; PropertyType ptype = parm->type;
int len = parm->totarraylength; /* only supports fixed length at the moment */ int len = parm->totarraylength;
if (len > 0) {
/* XXX in other parts is mentioned that strings can be dynamic as well */ /* XXX in other parts is mentioned that strings can be dynamic as well */
if (parm->flag & PROP_DYNAMIC) if (parm->flag & PROP_DYNAMIC)
return sizeof(void *); return sizeof(ParameterDynAlloc);
if (len > 0) {
switch (ptype) { switch (ptype) {
case PROP_BOOLEAN: case PROP_BOOLEAN:
case PROP_INT: case PROP_INT:
@ -3106,18 +3106,6 @@ int rna_parameter_size(PropertyRNA *parm)
return sizeof(void *); return sizeof(void *);
} }
/* this function returns the size of the memory allocated for the parameter,
* useful for instance for memory alignment or for storing additional information */
int rna_parameter_size_alloc(PropertyRNA *parm)
{
int size = rna_parameter_size(parm);
if (parm->flag & PROP_DYNAMIC)
size += sizeof(((ParameterDynAlloc *)NULL)->array_tot);
return size;
}
/* Dynamic Enums */ /* Dynamic Enums */
void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item) void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)

@ -402,7 +402,6 @@ PointerRNA rna_pointer_inherit_refine(struct PointerRNA *ptr, struct StructRNA *
/* Functions */ /* Functions */
int rna_parameter_size(struct PropertyRNA *parm); int rna_parameter_size(struct PropertyRNA *parm);
int rna_parameter_size_alloc(struct PropertyRNA *parm);
struct Mesh *rna_Main_meshes_new_from_object( struct Mesh *rna_Main_meshes_new_from_object(
struct Main *bmain, struct ReportList *reports, struct Scene *sce, struct Main *bmain, struct ReportList *reports, struct Scene *sce,