replaced alloca() (a.k.a. cvStackAlloc) with AutoBuffer or vector() everywhere. cvStackAlloc() is still defined, but we do not need alloca() anymore to compile and run OpenCV (fixes #889 and may be some others)

This commit is contained in:
Vadim Pisarevsky
2011-02-18 10:29:57 +00:00
parent 7b2ec0a1e6
commit 65a7f13af3
21 changed files with 286 additions and 263 deletions

View File

@@ -294,7 +294,8 @@ cvCloneMatND( const CvMatND* src )
if( !CV_IS_MATND_HDR( src ))
CV_Error( CV_StsBadArg, "Bad CvMatND header" );
int* sizes = (int*)cvStackAlloc( src->dims*sizeof(sizes[0]) );
CV_Assert( src->dims <= CV_MAX_DIM );
int sizes[CV_MAX_DIM];
for( int i = 0; i < src->dims; i++ )
sizes[i] = src->dim[i].size;
@@ -1717,7 +1718,8 @@ cvPtr1D( const CvArr* arr, int idx, int* _type )
else
{
int i, n = m->dims;
int* _idx = (int*)cvStackAlloc(n*sizeof(_idx[0]));
CV_DbgAssert( n <= CV_MAX_DIM_HEAP );
int _idx[CV_MAX_DIM_HEAP];
for( i = n - 1; i >= 0; i-- )
{

View File

@@ -132,6 +132,7 @@ GEMMSingleMul( const T* a_data, size_t a_step,
{
int i, j, k, n = a_size.width, m = d_size.width, drows = d_size.height;
const T *_a_data = a_data, *_b_data = b_data, *_c_data = c_data;
cv::AutoBuffer<T> _a_buf;
T* a_buf = 0;
size_t a_step0, a_step1, c_step0, c_step1, t_step;
@@ -154,16 +155,21 @@ GEMMSingleMul( const T* a_data, size_t a_step,
CV_SWAP( a_step0, a_step1, t_step );
n = a_size.height;
if( a_step > 1 && n > 1 )
a_buf = (T*)cvStackAlloc(n*sizeof(a_data[0]));
{
_a_buf.allocate(n);
a_buf = _a_buf;
}
}
if( n == 1 ) /* external product */
{
cv::AutoBuffer<T> _b_buf;
T* b_buf = 0;
if( a_step > 1 && a_size.height > 1 )
{
a_buf = (T*)cvStackAlloc(drows*sizeof(a_data[0]));
_a_buf.allocate(drows);
a_buf = _a_buf;
for( k = 0; k < drows; k++ )
a_buf[k] = a_data[a_step*k];
a_data = a_buf;
@@ -171,7 +177,8 @@ GEMMSingleMul( const T* a_data, size_t a_step,
if( b_step > 1 )
{
b_buf = (T*)cvStackAlloc(d_size.width*sizeof(b_buf[0]) );
_b_buf.allocate(d_size.width);
b_buf = _b_buf;
for( j = 0; j < d_size.width; j++ )
b_buf[j] = b_data[j*b_step];
b_data = b_buf;
@@ -309,7 +316,8 @@ GEMMSingleMul( const T* a_data, size_t a_step,
}
else
{
WT* d_buf = (WT*)cvStackAlloc(m*sizeof(d_buf[0]));
cv::AutoBuffer<WT> _d_buf(m);
WT* d_buf = _d_buf;
for( i = 0; i < drows; i++, _a_data += a_step0, _c_data += c_step0, d_data += d_step )
{
@@ -369,6 +377,7 @@ GEMMBlockMul( const T* a_data, size_t a_step,
{
int i, j, k, n = a_size.width, m = d_size.width;
const T *_a_data = a_data, *_b_data = b_data;
cv::AutoBuffer<T> _a_buf;
T* a_buf = 0;
size_t a_step0, a_step1, t_step;
int do_acc = flags & 16;
@@ -384,7 +393,8 @@ GEMMBlockMul( const T* a_data, size_t a_step,
{
CV_SWAP( a_step0, a_step1, t_step );
n = a_size.height;
a_buf = (T*)cvStackAlloc(n*sizeof(a_data[0]));
_a_buf.allocate(n);
a_buf = _a_buf;
}
if( flags & GEMM_2_T )

View File

@@ -3620,7 +3620,7 @@ icvReadSparseMat( CvFileStorage* fs, CvFileNode* node )
CvSeqReader reader;
CvSeq* elements;
int* idx;
int* sizes = 0, dims, elem_type, cn;
int sizes[CV_MAX_DIM_HEAP], dims, elem_type, cn;
int i;
sizes_node = cvGetFileNodeByName( fs, node, "sizes" );
@@ -3635,7 +3635,6 @@ icvReadSparseMat( CvFileStorage* fs, CvFileNode* node )
if( dims <= 0 || dims > CV_MAX_DIM_HEAP )
CV_Error( CV_StsParseError, "Could not determine sparse matrix dimensionality" );
sizes = (int*)cvStackAlloc( dims*sizeof(sizes[0]));
cvReadRawData( fs, sizes_node, sizes, "i" );
elem_type = icvDecodeSimpleFormat( dt );