[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34098] trunk/blender/source/blender: fix for py/rna mesh.materials[:] where empty materials exist, would raise a runtime exception.

Campbell Barton ideasman42 at gmail.com
Wed Jan 5 15:49:08 CET 2011


Revision: 34098
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34098
Author:   campbellbarton
Date:     2011-01-05 15:49:08 +0100 (Wed, 05 Jan 2011)

Log Message:
-----------
fix for py/rna mesh.materials[:] where empty materials exist, would raise a runtime exception.
problem was there was no way to tell the difference between getting an empty item from a collection or the item not being found.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/makesrna.c
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/makesrna/intern/rna_internal.h
    trunk/blender/source/blender/makesrna/intern/rna_internal_types.h
    trunk/blender/source/blender/makesrna/intern/rna_pose.c
    trunk/blender/source/blender/makesrna/intern/rna_rna.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c	2011-01-05 14:20:48 UTC (rev 34097)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c	2011-01-05 14:49:08 UTC (rev 34098)
@@ -965,16 +965,16 @@
 
 	func= rna_alloc_function_name(srna->identifier, prop->identifier, "lookup_int");
 
-	fprintf(f, "PointerRNA %s(PointerRNA *ptr, int index)\n", func);
+	fprintf(f, "int %s(PointerRNA *ptr, int index, PointerRNA *r_ptr)\n", func);
 	fprintf(f, "{\n");
 
 	if(manualfunc) {
-		fprintf(f, "\n	return %s(ptr, index);\n", manualfunc);
+		fprintf(f, "\n	return %s(ptr, index, r_ptr);\n", manualfunc);
 		fprintf(f, "}\n\n");
 		return func;
 	}
 
-	fprintf(f, "	PointerRNA r_ptr;\n");
+	fprintf(f, "	int found= FALSE;\n");
 	fprintf(f, "	CollectionPropertyIterator iter;\n\n");
 
 	fprintf(f, "	%s_%s_begin(&iter, ptr);\n\n", srna->identifier, prop->identifier);
@@ -998,6 +998,7 @@
 		fprintf(f, "		}\n");
 		fprintf(f, "		else {\n");
 		fprintf(f, "			internal->ptr += internal->itemsize*index;\n");
+		fprintf(f, "			found= TRUE;\n");
 		fprintf(f, "		}\n");
 	}
 	else if(strcmp(nextfunc, "rna_iterator_listbase_next") == 0) {
@@ -1013,14 +1014,15 @@
 		fprintf(f, "			while(index-- > 0 && internal->link)\n");
 		fprintf(f, "				internal->link= internal->link->next;\n");
 		fprintf(f, "		}\n");
+		fprintf(f, "		found= (index == -1);\n");
 	}
 
 	fprintf(f, "	}\n\n");
 
-	fprintf(f, "	r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier);
+	fprintf(f, "	if(found) *r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier);
 	fprintf(f, "	%s_%s_end(&iter);\n\n", srna->identifier, prop->identifier);
 
-	fprintf(f, "	return r_ptr;\n");
+	fprintf(f, "	return found;\n");
 
 #if 0
 	rna_print_data_get(f, dp);

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2011-01-05 14:20:48 UTC (rev 34097)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2011-01-05 14:49:08 UTC (rev 34098)
@@ -2302,8 +2302,7 @@
 
 	if(cprop->lookupint) {
 		/* we have a callback defined, use it */
-		*r_ptr= cprop->lookupint(ptr, key);
-		return (r_ptr->data != NULL);
+		return cprop->lookupint(ptr, key, r_ptr);
 	}
 	else {
 		/* no callback defined, just iterate and find the nth item */
@@ -2332,8 +2331,7 @@
 
 	if(cprop->lookupstring) {
 		/* we have a callback defined, use it */
-		*r_ptr= cprop->lookupstring(ptr, key);
-		return (r_ptr->data != NULL);
+		return cprop->lookupstring(ptr, key, r_ptr);
 	}
 	else {
 		/* no callback defined, compare with name properties if they exist */

Modified: trunk/blender/source/blender/makesrna/intern/rna_internal.h
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_internal.h	2011-01-05 14:20:48 UTC (rev 34097)
+++ trunk/blender/source/blender/makesrna/intern/rna_internal.h	2011-01-05 14:49:08 UTC (rev 34098)
@@ -301,7 +301,7 @@
 void rna_builtin_properties_next(struct CollectionPropertyIterator *iter);
 PointerRNA rna_builtin_properties_get(struct CollectionPropertyIterator *iter);
 PointerRNA rna_builtin_type_get(struct PointerRNA *ptr);
-PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key);
+int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr);
 
 /* Iterators */
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_internal_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_internal_types.h	2011-01-05 14:20:48 UTC (rev 34097)
+++ trunk/blender/source/blender/makesrna/intern/rna_internal_types.h	2011-01-05 14:49:08 UTC (rev 34098)
@@ -93,8 +93,8 @@
 typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
 typedef PointerRNA (*PropCollectionGetFunc)(struct CollectionPropertyIterator *iter);
 typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
-typedef PointerRNA (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key);
-typedef PointerRNA (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key);
+typedef int (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct PointerRNA *r_ptr);
+typedef int (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr);
 
 /* Container - generic abstracted container of RNA properties */
 typedef struct ContainerRNA {

Modified: trunk/blender/source/blender/makesrna/intern/rna_pose.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_pose.c	2011-01-05 14:20:48 UTC (rev 34097)
+++ trunk/blender/source/blender/makesrna/intern/rna_pose.c	2011-01-05 14:49:08 UTC (rev 34098)
@@ -547,13 +547,17 @@
 }
 
 /* not essential, but much faster then the default lookup function */
-PointerRNA rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key)
+int rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
 {
-	PointerRNA rptr;
 	bPose *pose= (bPose*)ptr->data;
 	bPoseChannel *pchan= get_pose_channel(pose, key);
-	RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, &rptr);
-	return rptr;
+	if(pchan) {
+		RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, r_ptr);
+		return TRUE;
+	}
+	else {
+		return FALSE;
+	}
 }
 
 static void rna_PoseChannel_matrix_basis_get(PointerRNA *ptr, float *values)

Modified: trunk/blender/source/blender/makesrna/intern/rna_rna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_rna.c	2011-01-05 14:20:48 UTC (rev 34097)
+++ trunk/blender/source/blender/makesrna/intern/rna_rna.c	2011-01-05 14:49:08 UTC (rev 34098)
@@ -300,7 +300,7 @@
 	return rna_Struct_properties_get(iter);
 }
 
-PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key)
+int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
 {
 	StructRNA *srna;
 	PropertyRNA *prop;
@@ -315,7 +315,9 @@
 			if(prop) {
 				propptr.type= &RNA_Property;
 				propptr.data= prop;
-				return propptr;
+
+				*r_ptr= propptr;
+				return TRUE;
 			}
 		}
 
@@ -323,7 +325,9 @@
 			if(!(prop->flag & PROP_BUILTIN) && strcmp(prop->identifier, key)==0) {
 				propptr.type= &RNA_Property;
 				propptr.data= prop;
-				return propptr;
+
+				*r_ptr= propptr;
+				return TRUE;
 			}
 		}
 	} while((srna=srna->base));
@@ -342,13 +346,15 @@
 				if(strcmp(idp->name, key) == 0) {
 					propptr.type= &RNA_Property;
 					propptr.data= idp;
-					return propptr;
+
+					*r_ptr= propptr;
+					return TRUE;
 				}
 			}
 		}
 	}
 #endif
-	return propptr;
+	return FALSE;
 }
 
 PointerRNA rna_builtin_type_get(PointerRNA *ptr)
@@ -842,34 +848,29 @@
 {
 	return BLI_countlist(&((BlenderRNA*)ptr->data)->structs);
 }
-static PointerRNA rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index)
+static int rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
 {
 	StructRNA *srna= BLI_findlink(&((BlenderRNA*)ptr->data)->structs, index);
 
 	if(srna) {
-		PointerRNA r_ptr;
-		RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
-		return r_ptr;
+		RNA_pointer_create(NULL, &RNA_Struct, srna, r_ptr);
+		return TRUE;
 	}
 	else {
-		return PointerRNA_NULL;
+		return FALSE;
 	}
 }
-static PointerRNA rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key)
+static int rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
 {
 	StructRNA *srna= ((BlenderRNA*)ptr->data)->structs.first;
-	for(; srna; srna=srna->cont.next)
-		if(key[0] == srna->identifier[0] && strcmp(key, srna->identifier)==0)
-			break;
+	for(; srna; srna=srna->cont.next) {
+		if(key[0] == srna->identifier[0] && strcmp(key, srna->identifier)==0) {
+			RNA_pointer_create(NULL, &RNA_Struct, srna, r_ptr);
+			return TRUE;
+		}
+	}
 
-	if(srna) {
-		PointerRNA r_ptr;
-		RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
-		return r_ptr;
-	}
-	else {
-		return PointerRNA_NULL;
-	}
+	return FALSE;
 }
 
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene.c	2011-01-05 14:20:48 UTC (rev 34097)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene.c	2011-01-05 14:49:08 UTC (rev 34098)
@@ -182,18 +182,19 @@
 
 #include "RE_pipeline.h"
 
-static PointerRNA rna_Scene_object_bases_lookup_string(PointerRNA *ptr, const char *key)
+static int rna_Scene_object_bases_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
 {
 	Scene *scene= (Scene*)ptr->data;
 	Base *base;
 
 	for(base= scene->base.first; base; base= base->next) {
 		if(strncmp(base->object->id.name+2, key, sizeof(base->object->id.name)-2)==0) {
-			return rna_pointer_inherit_refine(ptr, &RNA_ObjectBase, base);
+			*r_ptr= rna_pointer_inherit_refine(ptr, &RNA_ObjectBase, base);
+			return TRUE;
 		}
 	}
 
-	return PointerRNA_NULL;
+	return FALSE;
 }
 
 static PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter)

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2011-01-05 14:20:48 UTC (rev 34097)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2011-01-05 14:49:08 UTC (rev 34098)
@@ -1422,8 +1422,9 @@
 		if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr)) {
 			return pyrna_struct_CreatePyObject(&newptr);
 		}
-		else { /* fail's if ptr.data == NULL, valid for mesh.materials */
-			Py_RETURN_NONE;
+		else {
+			PyErr_SetString(PyExc_RuntimeError, "error getting an rna struct from a collection");
+			return NULL;
 		}
 	}
 	PyErr_Format(PyExc_IndexError, "bpy_prop_collection[index]: index %d out of range, size %d", keynum, len);





More information about the Bf-blender-cvs mailing list