[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45986] trunk/blender/source/blender/ python/bmesh/bmesh_py_types_customdata.c: fix [#31113] bmesh.types. BMLayerCollection getter calculate key indices wrong (own fault)

Campbell Barton ideasman42 at gmail.com
Thu Apr 26 18:32:31 CEST 2012


Revision: 45986
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45986
Author:   campbellbarton
Date:     2012-04-26 16:32:30 +0000 (Thu, 26 Apr 2012)
Log Message:
-----------
fix [#31113] bmesh.types.BMLayerCollection getter calculate key indices wrong (own fault)
also add check so layer.name won't crash incase the layer becomes invalid.

Modified Paths:
--------------
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c	2012-04-26 15:38:16 UTC (rev 45985)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c	2012-04-26 16:32:30 UTC (rev 45986)
@@ -63,7 +63,15 @@
 static CustomDataLayer *bpy_bmlayeritem_get(BPy_BMLayerItem *self)
 {
 	CustomData *data = bpy_bm_customdata_get(self->bm, self->htype);
-	return &data->layers[CustomData_get_layer_index_n(data, self->type, self->index)];
+	const int index_absolute = CustomData_get_layer_index_n(data, self->type, self->index);
+	if (index_absolute != -1) {
+		return &data->layers[index_absolute];
+	}
+	else {
+		PyErr_SetString(PyExc_RuntimeError,
+		                "layer has become invalid");
+		return NULL;
+	}
 }
 
 /* py-type definitions
@@ -126,9 +134,10 @@
 	BPY_BM_CHECK_OBJ(self);
 
 	data = bpy_bm_customdata_get(self->bm, self->htype);
-	index = CustomData_get_active_layer_index(data, self->type);
+	index = CustomData_get_active_layer_index(data, self->type); /* absolute */
 
 	if (index != -1) {
+		index -= CustomData_get_layer_index(data, self->type); /* make relative */
 		return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index);
 	}
 	else {
@@ -146,7 +155,12 @@
 	BPY_BM_CHECK_OBJ(self);
 
 	layer = bpy_bmlayeritem_get(self);
-	return PyUnicode_FromString(layer->name);
+	if (layer) {
+		return PyUnicode_FromString(layer->name);
+	}
+	else {
+		return NULL;
+	}
 }
 
 static PyGetSetDef bpy_bmlayeraccess_vert_getseters[] = {
@@ -311,7 +325,7 @@
 	BPY_BM_CHECK_OBJ(self);
 
 	data = bpy_bm_customdata_get(self->bm, self->htype);
-	index = CustomData_get_layer_index(data, self->type);
+	index = CustomData_get_layer_index(data, self->type); /* absolute, but no need to make relative */
 
 	ret = PyList_New(0);
 
@@ -426,9 +440,10 @@
 		int index;
 
 		data = bpy_bm_customdata_get(self->bm, self->htype);
-		index = CustomData_get_named_layer_index(data, self->type, key);
+		index = CustomData_get_named_layer_index(data, self->type, key); /* absolute index */
 
 		if (index != -1) {
+			index -= CustomData_get_layer_index(data, self->type); /* make relative */
 			return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index);
 		}
 	}
@@ -471,9 +486,10 @@
 	BPY_BM_CHECK_OBJ(self);
 
 	data = bpy_bm_customdata_get(self->bm, self->htype);
-	index = CustomData_get_named_layer_index(data, self->type, keyname);
+	index = CustomData_get_named_layer_index(data, self->type, keyname); /* absolute */
 
 	if (index != -1) {
+		index -= CustomData_get_layer_index(data, self->type); /* make relative */
 		return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index);
 	}
 	else {




More information about the Bf-blender-cvs mailing list