[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35585] trunk/blender/source/blender/ python/generic/mathutils_Vector.c: fix for [#26524] Api autocomplete more errors

Campbell Barton ideasman42 at gmail.com
Thu Mar 17 05:43:58 CET 2011


Revision: 35585
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35585
Author:   campbellbarton
Date:     2011-03-17 04:43:58 +0000 (Thu, 17 Mar 2011)
Log Message:
-----------
fix for [#26524] Api autocomplete more errors
problem was caused by change in python behavior, now hasattr(val, attr) only suppresses attribute exceptions.

Modified Paths:
--------------
    trunk/blender/source/blender/python/generic/mathutils_Vector.c

Modified: trunk/blender/source/blender/python/generic/mathutils_Vector.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_Vector.c	2011-03-17 02:53:56 UTC (rev 35584)
+++ trunk/blender/source/blender/python/generic/mathutils_Vector.c	2011-03-17 04:43:58 UTC (rev 35585)
@@ -792,12 +792,13 @@
 	return self->size;
 }
 /* sequence accessor (get): vector[index] */
-static PyObject *Vector_item(VectorObject *self, int i)
+static PyObject *vector_item_internal(VectorObject *self, int i, const int is_attr)
 {
 	if(i<0)	i= self->size-i;
 
 	if(i < 0 || i >= self->size) {
-		PyErr_SetString(PyExc_IndexError,"vector[index]: out of range");
+		if(is_attr)	PyErr_Format(PyExc_AttributeError,"vector.%c: unavailable on %dd vector", *(((char *)"xyzw") + i), self->size);
+		else		PyErr_SetString(PyExc_IndexError,"vector[index]: out of range");
 		return NULL;
 	}
 
@@ -806,11 +807,16 @@
 
 	return PyFloat_FromDouble(self->vec[i]);
 }
+
+static PyObject *Vector_item(VectorObject *self, int i)
+{
+	return vector_item_internal(self, i, FALSE);
+}
 /* sequence accessor (set): vector[index] = value */
-static int Vector_ass_item(VectorObject *self, int i, PyObject * ob)
+static int vector_ass_item_internal(VectorObject *self, int i, PyObject *value, const int is_attr)
 {
 	float scalar;
-	if((scalar=PyFloat_AsDouble(ob))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
+	if((scalar=PyFloat_AsDouble(value))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
 		PyErr_SetString(PyExc_TypeError, "vector[index] = x: index argument not a number");
 		return -1;
 	}
@@ -818,7 +824,8 @@
 	if(i<0)	i= self->size-i;
 
 	if(i < 0 || i >= self->size){
-		PyErr_SetString(PyExc_IndexError, "vector[index] = x: assignment index out of range");
+		if(is_attr)	PyErr_Format(PyExc_AttributeError,"vector.%c = x: unavailable on %dd vector", *(((char *)"xyzw") + i), self->size);
+		else		PyErr_SetString(PyExc_IndexError, "vector[index] = x: assignment index out of range");
 		return -1;
 	}
 	self->vec[i] = scalar;
@@ -828,6 +835,11 @@
 	return 0;
 }
 
+static int Vector_ass_item(VectorObject *self, int i, PyObject *value)
+{
+	return vector_ass_item_internal(self, i, value, FALSE);
+}
+
 /* sequence slice (get): vector[a:b] */
 static PyObject *Vector_slice(VectorObject *self, int begin, int end)
 {
@@ -1461,12 +1473,12 @@
 
 static PyObject *Vector_getAxis(VectorObject *self, void *type)
 {
-	return Vector_item(self, GET_INT_FROM_POINTER(type));
+	return vector_item_internal(self, GET_INT_FROM_POINTER(type), TRUE);
 }
 
 static int Vector_setAxis(VectorObject *self, PyObject * value, void *type)
 {
-	return Vector_ass_item(self, GET_INT_FROM_POINTER(type), value);
+	return vector_ass_item_internal(self, GET_INT_FROM_POINTER(type), value, TRUE);
 }
 
 /* vector.length */




More information about the Bf-blender-cvs mailing list