Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Toenne <lukas.toenne@googlemail.com>2012-07-24 16:00:02 +0400
committerLukas Toenne <lukas.toenne@googlemail.com>2012-07-24 16:00:02 +0400
commitdee1d86e65a47f72a8198cc233816843f98d5429 (patch)
tree4ed5be7d727507cee638545284fd719e28170265 /source/blender/python
parent23c4026c3f5c5e25cd99626bd15032c4be1268e6 (diff)
Fix for RNA struct registration: the bpy_class_validate function would only check the immediate functions/properties of the pointer struct type, but not potential base structs. Now it first validates the base struct recursively before the actual properties of the registered class.
Does not have any effect for current registerable types (Operator, Menu, Panel, etc.), since none of those actually have a base struct, but will be required for future types with an actual hierarchy (custom nodes).
Diffstat (limited to 'source/blender/python')
-rw-r--r--source/blender/python/intern/bpy_rna.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index 609c549dfcb..03e20322a59 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -6736,20 +6736,24 @@ static int rna_function_arg_count(FunctionRNA *func)
return count;
}
-static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_function)
+static int bpy_class_validate_recursive(PointerRNA *dummyptr, StructRNA *srna, void *py_data, int *have_function)
{
const ListBase *lb;
Link *link;
FunctionRNA *func;
PropertyRNA *prop;
- StructRNA *srna = dummyptr->type;
const char *class_type = RNA_struct_identifier(srna);
+ StructRNA *srna_base = RNA_struct_base(srna);
PyObject *py_class = (PyObject *)py_data;
PyObject *base_class = RNA_struct_py_type_get(srna);
PyObject *item;
int i, flag, arg_count, func_arg_count;
const char *py_class_name = ((PyTypeObject *)py_class)->tp_name; // __name__
+ if (srna_base) {
+ if (bpy_class_validate_recursive(dummyptr, srna_base, py_data, have_function) != 0)
+ return -1;
+ }
if (base_class) {
if (!PyObject_IsSubclass(py_class, base_class)) {
@@ -6884,6 +6888,11 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
return 0;
}
+static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_function)
+{
+ return bpy_class_validate_recursive(dummyptr, dummyptr->type, py_data, have_function);
+}
+
/* TODO - multiple return values like with rna functions */
static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
{