diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index f094b141fb02e8963497e5e783278ba405ee7404..e0d0f626eab0825c9ac286aa4cf8cf9d3e478c65 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -553,6 +553,7 @@ static PyObject *M_Object_GetSelected( PyObject * self, PyObject * args ) } blen_object->object = G.scene->basact->object; PyList_Append( list, ( PyObject * ) blen_object ); + Py_DECREF( blen_object ); } base_iter = G.scene->base.first; @@ -570,6 +571,7 @@ static PyObject *M_Object_GetSelected( PyObject * self, PyObject * args ) } blen_object->object = base_iter->object; PyList_Append( list, ( PyObject * ) blen_object ); + Py_DECREF( blen_object ); } base_iter = base_iter->next; } diff --git a/source/blender/python/api2_2x/matrix.c b/source/blender/python/api2_2x/matrix.c index 1bf0e91640faad190ebfa53fdaf79b59011e701b..efefa337d8ad8353c10ddbd996d8308d1bf1a82e 100644 --- a/source/blender/python/api2_2x/matrix.c +++ b/source/blender/python/api2_2x/matrix.c @@ -89,6 +89,10 @@ PyObject *Matrix_toQuat( MatrixObject * self ) "inappropriate matrix size\n" ); mat = PyMem_Malloc( 3 * 3 * sizeof( float ) ); + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating matrix\n\n" ) ); + } mat[0] = self->matrix[0][0]; mat[1] = self->matrix[0][1]; mat[2] = self->matrix[0][2]; @@ -100,6 +104,11 @@ PyObject *Matrix_toQuat( MatrixObject * self ) mat[8] = self->matrix[2][2]; } quat = PyMem_Malloc( 4 * sizeof( float ) ); + if( quat == NULL ) { + PyMem_Free( mat ); + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating quat\n\n" ) ); + } Mat3ToQuat( ( float ( * )[3] ) mat, quat ); return ( PyObject * ) newQuaternionObject( quat ); @@ -120,6 +129,10 @@ PyObject *Matrix_toEuler( MatrixObject * self ) "inappropriate matrix size\n" ); mat = PyMem_Malloc( 3 * 3 * sizeof( float ) ); + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } mat[0] = self->matrix[0][0]; mat[1] = self->matrix[0][1]; mat[2] = self->matrix[0][2]; @@ -131,6 +144,11 @@ PyObject *Matrix_toEuler( MatrixObject * self ) mat[8] = self->matrix[2][2]; } eul = PyMem_Malloc( 3 * sizeof( float ) ); + if( eul == NULL ) { + PyMem_Free( mat ); + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating eul\n\n" ) ); + } Mat3ToEul( ( float ( * )[3] ) mat, eul ); for( x = 0; x < 3; x++ ) { @@ -143,13 +161,16 @@ PyObject *Matrix_toEuler( MatrixObject * self ) PyObject *Matrix_Resize4x4( MatrixObject * self ) { float *mat; - float *contigPtr; int x, row, col; if( self->colSize == 4 && self->rowSize == 4 ) return EXPP_incr_ret( Py_None ); mat = PyMem_Malloc( 4 * 4 * sizeof( float ) ); + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } for( x = 0; x < 16; x++ ) { mat[x] = 0.0f; } @@ -209,19 +230,21 @@ PyObject *Matrix_Resize4x4( MatrixObject * self ) mat[15] = 1.0f; } - PyMem_Free( *self->matrix ); - contigPtr = PyMem_Malloc( 4 * 4 * sizeof( float ) ); - if( contigPtr == NULL ) { + PyMem_Free( self->matrix ); + PyMem_Free( self->contigPtr ); + self->contigPtr = PyMem_Malloc( 4 * 4 * sizeof( float ) ); + if( self->contigPtr == NULL ) { return ( EXPP_ReturnPyObjError( PyExc_MemoryError, "problem allocating array space\n\n" ) ); } self->matrix = PyMem_Malloc( 4 * sizeof( float * ) ); if( self->matrix == NULL ) { + PyMem_Free( self->contigPtr ); return ( EXPP_ReturnPyObjError( PyExc_MemoryError, "problem allocating pointer space\n\n" ) ); } for( x = 0; x < 4; x++ ) { - self->matrix[x] = contigPtr + ( x * 4 ); + self->matrix[x] = self->contigPtr + ( x * 4 ); } for( row = 0; row < 4; row++ ) { @@ -250,6 +273,10 @@ PyObject *Matrix_TranslationPart( MatrixObject * self ) "inappropriate matrix size\n" ); vec = PyMem_Malloc( 3 * sizeof( float ) ); + if( vec == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating vec\n\n" ) ); + } vec[0] = self->matrix[3][0]; vec[1] = self->matrix[3][1]; vec[2] = self->matrix[3][2]; @@ -271,6 +298,10 @@ PyObject *Matrix_RotationPart( MatrixObject * self ) "inappropriate matrix size\n" ); mat = PyMem_Malloc( 3 * 3 * sizeof( float ) ); + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } mat[0] = self->matrix[0][0]; mat[1] = self->matrix[0][1]; mat[2] = self->matrix[0][2]; @@ -319,6 +350,11 @@ PyObject *Matrix_Invert( MatrixObject * self ) if( self->rowSize == 2 ) { mat = PyMem_Malloc( self->rowSize * self->colSize * sizeof( float ) ); + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError + ( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } mat[0] = self->matrix[1][1]; mat[1] = -self->matrix[1][0]; mat[2] = -self->matrix[0][1]; @@ -326,10 +362,20 @@ PyObject *Matrix_Invert( MatrixObject * self ) } else if( self->rowSize == 3 ) { mat = PyMem_Malloc( self->rowSize * self->colSize * sizeof( float ) ); + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError + ( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } Mat3Adj( ( float ( * )[3] ) mat, *self->matrix ); } else if( self->rowSize == 4 ) { mat = PyMem_Malloc( self->rowSize * self->colSize * sizeof( float ) ); + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError + ( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } Mat4Adj( ( float ( * )[4] ) mat, *self->matrix ); } //divide by determinate @@ -351,6 +397,12 @@ PyObject *Matrix_Invert( MatrixObject * self ) t = self->matrix[1][0]; self->matrix[1][0] = self->matrix[0][1]; self->matrix[0][1] = t; + +/* + Note: is the code below correct? + transposing mat and not copying into self->matrix? + s. swaney 11-oct-2004 +*/ } else if( self->rowSize == 3 ) { Mat3Transp( ( float ( * )[3] ) mat ); } else if( self->rowSize == 4 ) { @@ -359,7 +411,7 @@ PyObject *Matrix_Invert( MatrixObject * self ) } else { printf( "matrix does not have an inverse - none attempted\n" ); } - + PyMem_Free( mat ); return EXPP_incr_ret( Py_None ); } @@ -449,8 +501,10 @@ PyObject *Matrix_Identity( MatrixObject * self ) static void Matrix_dealloc( MatrixObject * self ) { + PyMem_Free( self->contigPtr ); PyMem_Free( self->matrix ); - PyMem_DEL( self ); + + PyObject_DEL( self ); } static PyObject *Matrix_getattr( MatrixObject * self, char *name ) @@ -510,6 +564,10 @@ static PyObject *Matrix_item( MatrixObject * self, int i ) "matrix row index out of range\n" ); vec = PyMem_Malloc( self->colSize * sizeof( float ) ); + if( vec == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating vec\n\n" ) ); + } for( x = 0; x < self->colSize; x++ ) { vec[x] = self->matrix[i][x]; } @@ -631,7 +689,10 @@ PyObject *Matrix_add( PyObject * m1, PyObject * m2 ) matSize = rowSize * colSize; mat = PyMem_Malloc( matSize * sizeof( float ) ); - + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } for( x = 0; x < rowSize; x++ ) { for( y = 0; y < colSize; y++ ) { mat[( ( x * rowSize ) + y )] = @@ -670,7 +731,10 @@ PyObject *Matrix_sub( PyObject * m1, PyObject * m2 ) matSize = rowSize * colSize; mat = PyMem_Malloc( matSize * sizeof( float ) ); - + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } for( x = 0; x < rowSize; x++ ) { for( y = 0; y < colSize; y++ ) { mat[( ( x * rowSize ) + y )] = @@ -714,7 +778,10 @@ PyObject *Matrix_mul( PyObject * m1, PyObject * m2 ) "Matrix dimension error during scalar multiplication\n" ); mat = PyMem_Malloc( matSizeV * sizeof( float ) ); - + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } for( x = 0; x < rowSizeV; x++ ) { for( y = 0; y < colSizeV; y++ ) { mat[( ( x * rowSizeV ) + y )] = @@ -731,7 +798,10 @@ PyObject *Matrix_mul( PyObject * m1, PyObject * m2 ) mat = PyMem_Malloc( ( rowSizeV * colSizeW ) * sizeof( float ) ); - + if( mat == NULL ) { + return ( EXPP_ReturnPyObjError( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } for( x = 0; x < rowSizeV; x++ ) { for( y = 0; y < colSizeW; y++ ) { for( z = 0; z < colSizeV; z++ ) { @@ -773,9 +843,20 @@ int Matrix_coerce( PyObject ** m1, PyObject ** m2 ) if( PyInt_Check( *m2 ) ) { //it's a int tempI = PyMem_Malloc( 1 * sizeof( long ) ); + if( tempI == NULL ) { + return ( EXPP_ReturnPyObjError + ( PyExc_MemoryError, + "problem allocating tempI\n\n" ) ); + } *tempI = PyInt_AsLong( *m2 ); mat = PyMem_Malloc( matSize * sizeof( float ) ); + if( mat == NULL ) { + PyMem_Free( tempI ); + return ( EXPP_ReturnPyObjError + ( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } for( x = 0; x < matSize; x++ ) { mat[x] = ( float ) *tempI; } @@ -790,9 +871,20 @@ int Matrix_coerce( PyObject ** m1, PyObject ** m2 ) tempF = PyMem_Malloc( 1 * sizeof ( double ) ); + if( tempF == NULL ) { + return ( EXPP_ReturnPyObjError + ( PyExc_MemoryError, + "problem allocating tempF\n\n" ) ); + } *tempF = PyFloat_AsDouble( *m2 ); mat = PyMem_Malloc( matSize * sizeof( float ) ); + if( mat == NULL ) { + PyMem_Free( tempF ); + return ( EXPP_ReturnPyObjError + ( PyExc_MemoryError, + "problem allocating mat\n\n" ) ); + } for( x = 0; x < matSize; x++ ) { mat[x] = ( float ) *tempF; } @@ -858,7 +950,7 @@ static PyNumberMethods Matrix_NumMethods = { }; PyTypeObject matrix_Type = { - PyObject_HEAD_INIT( NULL ) + PyObject_HEAD_INIT( NULL ) /* required python macro */ 0, /*ob_size */ "Matrix", /*tp_name */ sizeof( MatrixObject ), /*tp_basicsize */ @@ -879,7 +971,6 @@ PyTypeObject matrix_Type = { PyObject *newMatrixObject( float *mat, int rowSize, int colSize ) { MatrixObject *self; - float *contigPtr; int row, col, x; if( rowSize < 2 || rowSize > 4 || colSize < 2 || colSize > 4 ) @@ -889,20 +980,21 @@ PyObject *newMatrixObject( float *mat, int rowSize, int colSize ) self = PyObject_NEW( MatrixObject, &matrix_Type ); //generate contigous memory space - contigPtr = PyMem_Malloc( rowSize * colSize * sizeof( float ) ); - if( contigPtr == NULL ) { + self->contigPtr = PyMem_Malloc( rowSize * colSize * sizeof( float ) ); + if( self->contigPtr == NULL ) { return ( EXPP_ReturnPyObjError( PyExc_MemoryError, "problem allocating array space\n\n" ) ); } //create pointer array self->matrix = PyMem_Malloc( rowSize * sizeof( float * ) ); if( self->matrix == NULL ) { + PyMem_Free( self->contigPtr ); return ( EXPP_ReturnPyObjError( PyExc_MemoryError, "problem allocating pointer space\n\n" ) ); } //pointer array points to contigous memory for( x = 0; x < rowSize; x++ ) { - self->matrix[x] = contigPtr + ( x * colSize ); + self->matrix[x] = self->contigPtr + ( x * colSize ); } if( mat ) { //if a float array passed diff --git a/source/blender/python/api2_2x/matrix.h b/source/blender/python/api2_2x/matrix.h index fdd31af5b2a63333d00c7d23fb8abb022f489ead..b40ec9781596fd792bf9150be043085a3c73825f 100644 --- a/source/blender/python/api2_2x/matrix.h +++ b/source/blender/python/api2_2x/matrix.h @@ -49,7 +49,9 @@ typedef float **ptRow; typedef struct _Matrix { - PyObject_VAR_HEAD ptRow matrix; + PyObject_VAR_HEAD /* standard python macro */ + ptRow matrix; + float *contigPtr; int rowSize; int colSize; int flag;