diff -r 16d8024aca5e -r f7ac710697a9 src/hbcore/core/hbvariant_p.cpp --- a/src/hbcore/core/hbvariant_p.cpp Mon Apr 19 14:02:13 2010 +0300 +++ b/src/hbcore/core/hbvariant_p.cpp Mon May 03 12:48:33 2010 +0300 @@ -32,8 +32,6 @@ #include "hbstring_p.h" #include "hbsmartoffset_p.h" - - /** * detach * used to support implicit sharing @@ -46,32 +44,27 @@ data->mRef.deref(); } GET_MEMORY_MANAGER(mMemoryType); - try{ - mDataOffset = manager->alloc( sizeof(HbVariantData) ); + HbSmartOffset offset(manager->alloc(sizeof(HbVariantData)), mMemoryType); - HbVariantData *newData = new( (char*)manager->base() + mDataOffset ) HbVariantData(); - newData->mData = data->mData; - newData->mDataType = data->mDataType; - - if ( data->mDataType == String ) { - newData->mData.offset = manager->alloc( data->stringSize*sizeof(QChar) ); + HbVariantData *newData = new((char*)manager->base() + offset.get()) HbVariantData(); + newData->mData = data->mData; + newData->mDataType = data->mDataType; - ::memcpy(HbMemoryUtils::getAddress( mMemoryType, newData->mData.offset ), - getAddress( mMemoryType, data->mData.offset, mShared ), - data->stringSize * sizeof( QChar) ); - newData->stringSize = data->stringSize; - } else if( data->mDataType == Color ) { - newData->mData.offset = manager->alloc( sizeof(QColor) ); - new (HbMemoryUtils::getAddress( mMemoryType, newData->mData.offset) ) - QColor(*getAddress( mMemoryType, data->mData.offset, mShared) ); - } - mShared = false; - } - catch(std::bad_alloc &badAlloc){ - Q_UNUSED(badAlloc) - qCritical("HbVariant::detach() failed!"); - throw; + if ( data->mDataType == String ) { + HbSmartOffset dataOffset(manager->alloc( data->stringSize*sizeof(QChar))); + ::memcpy(HbMemoryUtils::getAddress(mMemoryType, dataOffset.get()), + getAddress(mMemoryType, data->mData.offset, mShared), + data->stringSize * sizeof(QChar)); + newData->stringSize = data->stringSize; + newData->mData.offset = dataOffset.release(); + } else if(data->mDataType == Color) { + HbSmartOffset dataOffset(manager->alloc(sizeof(QColor))); + new (HbMemoryUtils::getAddress(mMemoryType, dataOffset.get())) + QColor(*getAddress(mMemoryType, data->mData.offset, mShared)); + newData->mData.offset = dataOffset.release(); } + mDataOffset = offset.release(); + mShared = false; } } @@ -118,7 +111,7 @@ : mMemoryType( type ), mShared( false ) { initializeData(); - fillStringData(str); + fillStringData(str.constData(), str.length()); } /* @@ -129,7 +122,7 @@ { initializeData(); QString str = QString::fromAscii(val); - fillStringData(str); + fillStringData(str.constData(), str.length()); } @@ -314,53 +307,36 @@ HbVariant::HbVariantData * HbVariant::initializeData() { GET_MEMORY_MANAGER(mMemoryType); - try{ - mDataOffset = manager->alloc( sizeof(HbVariantData) ); - //Q_ASSERT(mDataOffset != -1); - HbVariantData *data = getAddress( mMemoryType, mDataOffset, mShared ); - return new(data) HbVariantData(); - } - catch(std::bad_alloc &badAlloc){ - Q_UNUSED(badAlloc) - qCritical("HbVariant::initializeData() failed!"); - return NULL; - } + mDataOffset = -1; + mDataOffset = manager->alloc(sizeof(HbVariantData)); + HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); + return new(data) HbVariantData(); } /* * fillStringData */ -void HbVariant::fillStringData(const QString &str) +void HbVariant::fillStringData(const QChar *str, int size) { GET_MEMORY_MANAGER(mMemoryType); HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); - if (data->mDataType==HbVariant::String - && data->mData.offset != -1) { - //clean old string data when assigend with a new string value - HbMemoryUtils::freeMemory(mMemoryType, data->mData.offset); - } + int oldOffset = reservesMemory(data) ? data->mData.offset : -1; - data->stringSize = str.length(); - // If the string is not null.. alocate memory for it and copy data - if (data->stringSize) { - try{ - data->mData.offset = manager->alloc(data->stringSize*sizeof(QChar)); - + if (size == 0) { + data->mData.offset = -1; + } else { + // allocate memory and copy data. + int allocBytes = size * sizeof(QChar); + data->mData.offset = manager->alloc(allocBytes); memcpy(getAddress(mMemoryType, data->mData.offset, mShared), - str.constData(), - data->stringSize*sizeof(QChar)); - } - catch(std::bad_alloc &badAlloc){ - Q_UNUSED(badAlloc) - qCritical("HbVariant::fillStringData() failed!"); - data->mData.offset = -1; - throw; - } - } else { - data->mData.offset = -1; + str, allocBytes); } - + data->stringSize = size; data->mDataType = String; + if (oldOffset != -1) { + //clean old string data when assigned with a new string value + HbMemoryUtils::freeMemory(mMemoryType, oldOffset); + } } /* @@ -370,22 +346,18 @@ { GET_MEMORY_MANAGER(mMemoryType); HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); - - int colDataSize = sizeof(col); - try{ + int oldOffset = reservesMemory(data) ? data->mData.offset : -1; - if(data->mDataType!=HbVariant::Color) { - data->mData.offset = manager->alloc(colDataSize); - } - new(getAddress(mMemoryType, data->mData.offset, mShared)) QColor(col); - data->mDataType = Color; + if(data->mDataType == HbVariant::Color && data->mData.offset != -1) { + oldOffset = -1; //use the preallocated memory. + } else { + data->mData.offset = manager->alloc(sizeof(QColor)); } - catch(std::bad_alloc &badAlloc){ - Q_UNUSED(badAlloc) - qCritical("HbVariant::fillColorData failed!"); - throw; + new (getAddress(mMemoryType, data->mData.offset, mShared)) QColor(col); + data->mDataType = Color; + if (oldOffset != -1) { + HbMemoryUtils::freeMemory(mMemoryType, oldOffset); } - } /* @@ -396,12 +368,7 @@ detach(); // This will update the mDataOffset to new location if ref > 1. HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); - - if(data->mDataType==HbVariant::String || data->mDataType==HbVariant::Color) { - HbMemoryUtils::freeMemory(mMemoryType, data->mData.offset); - data->stringSize=0; - } - + freeMemory(data); data->mData.i = val; data->mDataType = Int; return *this; @@ -415,12 +382,7 @@ detach(); // This will update the mDataOffset to new location if ref > 1. HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); - - if(data->mDataType==HbVariant::String || data->mDataType==HbVariant::Color) { - HbMemoryUtils::freeMemory(mMemoryType, data->mData.offset); - data->stringSize=0; - } - + freeMemory(data); data->mData.d = val; data->mDataType = Double; return *this; @@ -432,13 +394,7 @@ HbVariant& HbVariant::operator=(const QString& val) { detach(); // This will update the mDataOffset to new location if ref > 1. - HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); - if(data->mDataType == String || data->mDataType == Color) { - HbMemoryUtils::freeMemory(mMemoryType, data->mData.offset); - data->stringSize=0; - } - fillStringData(val); - data->mDataType = String; + fillStringData(val.constData(), val.length()); return *this; } @@ -448,34 +404,7 @@ HbVariant& HbVariant::operator=(const HbString& val) { detach(); // This will update the mDataOffset to new location if ref > 1. - HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); - if(data->mDataType == String || data->mDataType == Color) { - HbMemoryUtils::freeMemory(mMemoryType, data->mData.offset); - data->stringSize=0; - } - - data->stringSize = val.length(); - // If the string is not null.. alocate memory for it and copy data - if (data->stringSize) { - try{ - GET_MEMORY_MANAGER(mMemoryType) - data->mData.offset = manager->alloc(data->stringSize*sizeof(QChar)); - //Q_ASSERT(data->mData.offset != -1); - memcpy(getAddress(mMemoryType,data->mData.offset,mShared), - val.constData(), - data->stringSize*sizeof(QChar)); - } - catch(std::bad_alloc &badAlloc){ - Q_UNUSED(badAlloc) - qCritical("HbVariant::operator= failed!"); - data->mData.offset = -1; - throw; - } - } else { - data->mData.offset = -1; - } - - data->mDataType = String; + fillStringData(val.constData(), val.length()); return *this; } @@ -485,14 +414,7 @@ HbVariant& HbVariant::operator=(const QColor& col) { detach(); // This will update the mDataOffset to new location if ref > 1. - HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); - if(data->mDataType==String) { - HbMemoryUtils::freeMemory(mMemoryType,data->mData.offset); - data->stringSize=0; - } - fillColorData(col); - data->mDataType = Color; return *this; } @@ -510,13 +432,12 @@ */ HbVariant& HbVariant::operator=(const HbVariant &other) { - GET_MEMORY_MANAGER(mMemoryType) + if(!manager->isWritable()) { + Q_ASSERT(false); + } - if(!manager->isWritable()) - Q_ASSERT(false); - - HbVariantData *otherData = getAddress(other.mMemoryType, other.mDataOffset, other.mShared); + HbVariantData *otherData = getAddress(other.mMemoryType, other.mDataOffset, other.mShared); HbVariantData *data = getAddress(mMemoryType, mDataOffset, mShared); if(other.mMemoryType != mMemoryType || other.mShared == true) { @@ -531,18 +452,15 @@ mShared = true; mMemoryType = HbMemoryManager::HeapMemory; } else { - otherData->mRef.ref(); - if(mShared != true && !data->mRef.deref() ) { clear(); HbMemoryUtils::freeMemory(mMemoryType, mDataOffset); } - mShared = other.mShared; + mShared = other.mShared; mMemoryType = other.mMemoryType; } mDataOffset = other.mDataOffset; - Q_ASSERT(mMemoryType == HbMemoryManager::SharedMemory || mMemoryType == HbMemoryManager::HeapMemory); return *this; } @@ -587,7 +505,7 @@ bool ok = true; int tempOffset = -1; - QColor col; // Removing the Linux build error; + QColor col; QString str; if(data->mDataType == t) { return true; @@ -634,23 +552,27 @@ case HbVariant::String: switch(data->mDataType) { - case HbVariant::Int : - fillStringData(QString::number(data->mData.i)); + case HbVariant::Int : { + QString num = QString::number(data->mData.i); + fillStringData(num.constData(), num.length()); data->mDataType = HbVariant::String; return true; - case HbVariant::Double: - fillStringData(QString::number(data->mData.d)); + } + case HbVariant::Double: { + QString num = QString::number(data->mData.d); + fillStringData(num.constData(), num.length()); data->mDataType = HbVariant::String; return true; + } case HbVariant::StringList: // ToDo: Handle it return false; - case HbVariant::Color: - col = getColor(); - HbMemoryUtils::freeMemory(mMemoryType,data->mData.offset); - fillStringData(col.name()); + case HbVariant::Color: { + QString colName = getColor().name(); + fillStringData(colName.constData(), colName.length()); data->mDataType = HbVariant::String; return true; + } default: return false; } @@ -659,13 +581,11 @@ switch(data->mDataType) { case HbVariant::String: col.setNamedColor(getString()); - HbMemoryUtils::freeMemory(mMemoryType,data->mData.offset); - data->stringSize = 0; + if (!col.isValid()) { + return false; + } fillColorData(col); - data->mDataType = HbVariant::Color; - // ToDo: should it return true as type is converted to Color - // for invalid color also. - return col.isValid(); + return true; default: return false; }