[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49173] trunk/blender/source/blender/ python/intern/bpy_rna.c: 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.

Lukas Toenne lukas.toenne at googlemail.com
Tue Jul 24 14:00:03 CEST 2012


Revision: 49173
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49173
Author:   lukastoenne
Date:     2012-07-24 12:00:02 +0000 (Tue, 24 Jul 2012)
Log Message:
-----------
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).

Modified Paths:
--------------
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2012-07-24 11:49:21 UTC (rev 49172)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2012-07-24 12:00:02 UTC (rev 49173)
@@ -6736,20 +6736,24 @@
 	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 @@
 	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)
 {




More information about the Bf-blender-cvs mailing list