[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19960] trunk/blender/source/blender/ python/api2_2x: Mathutils
Campbell Barton
ideasman42 at gmail.com
Tue Apr 28 17:28:02 CEST 2009
Revision: 19960
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19960
Author: campbellbarton
Date: 2009-04-28 17:28:02 +0200 (Tue, 28 Apr 2009)
Log Message:
-----------
Mathutils
- fix own mistake with matrix slicing that would crash blender (from recent commit).
- fix 3 memory leaks from ascotan r4717 in the Mathutils.Quaternion(...) function.
Modified Paths:
--------------
trunk/blender/source/blender/python/api2_2x/Mathutils.c
trunk/blender/source/blender/python/api2_2x/matrix.c
Modified: trunk/blender/source/blender/python/api2_2x/Mathutils.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Mathutils.c 2009-04-28 14:07:35 UTC (rev 19959)
+++ trunk/blender/source/blender/python/api2_2x/Mathutils.c 2009-04-28 15:28:02 UTC (rev 19960)
@@ -309,8 +309,8 @@
{
PyObject *listObject = NULL;
int size, i;
- float vec[4];
- PyObject *v, *f;
+ float vec[4], f;
+ PyObject *v;
size = PySequence_Length(args);
if (size == 1) {
@@ -344,16 +344,15 @@
return NULL;
}
- f=PyNumber_Float(v);
- if(f==NULL) { // parsed item not a number
+ f= PyFloat_AsDouble(v);
+ if(f==-1 && PyErr_Occurred()) { // parsed item not a number
Py_DECREF(v);
Py_XDECREF(listObject);
PyErr_SetString(PyExc_TypeError, "Mathutils.Vector(): 2-4 floats or ints expected (optionally in a sequence)\n");
return NULL;
}
- vec[i]=(float)PyFloat_AS_DOUBLE(f);
- Py_DECREF(f);
+ vec[i]= f;
Py_DECREF(v);
}
Py_DECREF(listObject);
@@ -999,16 +998,24 @@
return NULL;
}
if(size == 3){ //get angle in axis/angle
- n = PyNumber_Float(PySequence_GetItem(args, 1));
+ n = PySequence_GetItem(args, 1);
if(n == NULL) { // parsed item not a number or getItem fail
Py_DECREF(listObject);
PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n");
return NULL;
}
- angle = PyFloat_AS_DOUBLE(n);
+
+ angle = PyFloat_AsDouble(n);
Py_DECREF(n);
+
+ if (angle==-1 && PyErr_Occurred()) {
+ Py_DECREF(listObject);
+ PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n");
+ return NULL;
+ }
}
}else{
+ Py_DECREF(listObject); /* assume the list is teh second arg */
listObject = PySequence_GetItem(args, 1);
if (size>1 && PySequence_Check(listObject)) {
size = PySequence_Length(listObject);
@@ -1018,14 +1025,20 @@
PyErr_SetString(PyExc_AttributeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n");
return NULL;
}
- n = PyNumber_Float(PySequence_GetItem(args, 0));
+ n = PySequence_GetItem(args, 0);
if(n == NULL) { // parsed item not a number or getItem fail
Py_DECREF(listObject);
PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n");
return NULL;
}
- angle = PyFloat_AS_DOUBLE(n);
+ angle = PyFloat_AsDouble(n);
Py_DECREF(n);
+
+ if (angle==-1 && PyErr_Occurred()) {
+ Py_DECREF(listObject);
+ PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n");
+ return NULL;
+ }
} else { // argument was not a sequence
Py_XDECREF(listObject);
PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n");
Modified: trunk/blender/source/blender/python/api2_2x/matrix.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/matrix.c 2009-04-28 14:07:35 UTC (rev 19959)
+++ trunk/blender/source/blender/python/api2_2x/matrix.c 2009-04-28 15:28:02 UTC (rev 19960)
@@ -575,9 +575,9 @@
PyObject * seq)
{
int i, x, y, size, sub_size = 0;
- float mat[16];
+ float mat[16], f;
PyObject *subseq;
- PyObject *m, *f;
+ PyObject *m;
CLAMP(begin, 0, self->rowSize);
CLAMP(end, 0, self->rowSize);
@@ -613,18 +613,17 @@
PyErr_SetString(PyExc_RuntimeError, "matrix[begin:end] = []: unable to read sequence\n");
return -1;
}
-
- f = PyNumber_Float(m);
- if(f == NULL) { /*parsed item not a number*/
+
+ f = PyFloat_AsDouble(m); /* faster to assume a float and raise an error after */
+ if(f == -1 && PyErr_Occurred()) { /*parsed item not a number*/
Py_DECREF(m);
Py_DECREF(subseq);
PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: sequence argument not a number\n");
return -1;
}
- mat[(i * self->colSize) + y] = (float)PyFloat_AS_DOUBLE(f);
+ mat[(i * self->colSize) + y] = f;
Py_DECREF(m);
- Py_DECREF(subseq);
}
}else{
Py_DECREF(subseq);
More information about the Bf-blender-cvs
mailing list