[Bf-blender-cvs] [50b2c78] master: RNA: assert on NULL return values from itemf callbacks

Campbell Barton noreply at git.blender.org
Mon Feb 17 13:32:51 CET 2014


Commit: 50b2c78ad8b6f994ceba77f548c39b2e510a98be
Author: Campbell Barton
Date:   Mon Feb 17 23:28:09 2014 +1100
https://developer.blender.org/rB50b2c78ad8b6f994ceba77f548c39b2e510a98be

RNA: assert on NULL return values from itemf callbacks

===================================================================

M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_access.c

===================================================================

diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 07c7d3e..0941f02 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -786,10 +786,10 @@ bool RNA_enum_description(EnumPropertyItem *item, const int value, const char **
 int  RNA_enum_from_value(EnumPropertyItem *item, const int value);
 int  RNA_enum_from_identifier(EnumPropertyItem *item, const char *identifier);
 
-void RNA_property_enum_items(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item,
-                             int *r_totitem, bool *r_free);
-void RNA_property_enum_items_gettexted(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item,
-                                       int *r_totitem, bool *r_free);
+void RNA_property_enum_items(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop,
+                             EnumPropertyItem **item, int *r_totitem, bool *r_free);
+void RNA_property_enum_items_gettexted(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop,
+                                       EnumPropertyItem **r_item, int *r_totitem, bool *r_free);
 bool RNA_property_enum_value(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *r_value);
 bool RNA_property_enum_identifier(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier);
 bool RNA_property_enum_name(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **name);
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 2d8f8eb..7ba0cab 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -1214,7 +1214,7 @@ EnumPropertyItem DummyRNA_DEFAULT_items[] = {
 	{0, NULL, 0, NULL, NULL}
 };
 
-void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item,
+void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **r_item,
                              int *r_totitem, bool *r_free)
 {
 	EnumPropertyRNA *eprop = (EnumPropertyRNA *)rna_ensure_property(prop);
@@ -1222,38 +1222,42 @@ void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, En
 	*r_free = false;
 
 	if (eprop->itemf && (C != NULL || (prop->flag & PROP_ENUM_NO_CONTEXT))) {
+		EnumPropertyItem *item;
+
 		if (prop->flag & PROP_ENUM_NO_CONTEXT)
-			*item = eprop->itemf(NULL, ptr, prop, r_free);
+			item = eprop->itemf(NULL, ptr, prop, r_free);
 		else
-			*item = eprop->itemf(C, ptr, prop, r_free);
+			item = eprop->itemf(C, ptr, prop, r_free);
 
-		if ((*item) == NULL) {
-			int tot = 0;
-			RNA_enum_item_end(item, &tot);
-		}
+		/* any callbacks returning NULL should be fixed */
+		BLI_assert(item != NULL);
 
 		if (r_totitem) {
-			int tot = 0;
-			for (; (*item)[tot].identifier; tot++) ;
+			int tot;
+			for (tot = 0; item[tot].identifier; tot++) {
+				/* pass */
+			}
 			*r_totitem = tot;
 		}
 
+		*r_item = item;
 	}
 	else {
-		*item = eprop->item;
+		*r_item = eprop->item;
 		if (r_totitem)
 			*r_totitem = eprop->totitem;
 	}
 }
 
-void RNA_property_enum_items_gettexted(bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item,
-                                       int *r_totitem, bool *r_free)
+void RNA_property_enum_items_gettexted(bContext *C, PointerRNA *ptr, PropertyRNA *prop,
+                                       EnumPropertyItem **r_item, int *r_totitem, bool *r_free)
 {
-	RNA_property_enum_items(C, ptr, prop, item, r_totitem, r_free);
+	RNA_property_enum_items(C, ptr, prop, r_item, r_totitem, r_free);
 
 #ifdef WITH_INTERNATIONAL
 	if (!(prop->flag & PROP_ENUM_NO_TRANSLATE)) {
 		int i;
+
 		/* Note: Only do those tests once, and then use BLF_pgettext. */
 		bool do_iface = BLF_translate_iface();
 		bool do_tooltip = BLF_translate_tooltips();
@@ -1263,19 +1267,24 @@ void RNA_property_enum_items_gettexted(bContext *C, PointerRNA *ptr, PropertyRNA
 			return;
 
 		if (*r_free) {
-			nitem = *item;
+			nitem = *r_item;
 		}
 		else {
-			int totitem = 0;
+			EnumPropertyItem *item = *r_item;
+			int tot;
 
-			/* count */
-			for (i = 0; (*item)[i].identifier; i++)
-				totitem++;
-
-			nitem = MEM_callocN(sizeof(EnumPropertyItem) * (totitem + 1), "enum_items_gettexted");
+			if (r_totitem) {
+				tot = *r_totitem;
+			}
+			else {
+				/* count */
+				for (tot = 0; item[tot].identifier; tot++) {
+					/* pass */
+				}
+			}
 
-			for (i = 0; (*item)[i].identifier; i++)
-				nitem[i] = (*item)[i];
+			nitem = MEM_mallocN(sizeof(EnumPropertyItem) * tot + 1, "enum_items_gettexted");
+			memcpy(nitem, item, sizeof(EnumPropertyItem) * tot + 1);
 
 			*r_free = true;
 		}
@@ -1289,7 +1298,7 @@ void RNA_property_enum_items_gettexted(bContext *C, PointerRNA *ptr, PropertyRNA
 			}
 		}
 
-		*item = nitem;
+		*r_item = nitem;
 	}
 #endif
 }




More information about the Bf-blender-cvs mailing list