textrendering/texthandling/stext/TXTINDEX.CPP
changeset 40 91ef7621b7fc
parent 0 1fb32624e06b
child 55 336bee5c2d35
--- a/textrendering/texthandling/stext/TXTINDEX.CPP	Mon May 03 14:13:26 2010 +0300
+++ b/textrendering/texthandling/stext/TXTINDEX.CPP	Thu Jun 24 11:18:23 2010 +0800
@@ -27,6 +27,11 @@
 #include "TXTSTYLE.H"
 #include "TXTINDEX.H"
 
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "TXTINDEXTraces.h"
+#endif
+
 #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
 #include "TXTFMLYR_INTERNAL.H"
 #include "TXTSTYLE_INTERNAL.H"
@@ -70,6 +75,10 @@
 		// ASSERT: The basedOn link is valid.
 		CFormatLayer* thisLayer=(*iParaIx)[para].iParaAttribs->iParaFormat;
 		CFormatLayer* base=CONST_CAST(CFormatLayer*,thisLayer->SenseBase());
+		if (base==NULL)
+		    {
+		    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_DBGTESTINVARIANT, "base==NULL" );
+		    }
 		__ASSERT_DEBUG(base!=NULL,User::Invariant());
 		if ((*iParaIx)[para].iParaAttribs->iRefCount>0)
 			numberOfReferencesToSharedList++;
@@ -83,7 +92,15 @@
 				const RPhraseAttribsEntry* phrase=&(*iPhraseIx)[currentPhraseElement];
 				CCharFormatLayer* charFormatLayer=phrase->CharFormat();
 				// ASSERT: The basedOn link is valid.
+				if (charFormatLayer->SenseBase()==NULL)
+				    {
+				    OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_DBGTESTINVARIANT, "charFormatLayer->SenseBase()==NULL" );
+				    }
 				__ASSERT_DEBUG(charFormatLayer->SenseBase()!=NULL,User::Invariant());
+				if (TInt(charFormatLayer->SenseBase())<=0x1000)
+				    {
+				    OstTrace0( TRACE_DUMP, DUP2_CRICHTEXTINDEX_DBGTESTINVARIANT, "TInt(charFormatLayer->SenseBase())<=0x1000" );
+				    }
 				__ASSERT_DEBUG(TInt(charFormatLayer->SenseBase())>0x1000,User::Invariant());
 				sumOfPhraseLengths+=(*iPhraseIx)[currentPhraseElement].Length();
 				if ((*iPhraseIx)[currentPhraseElement].Length()==0)
@@ -94,16 +111,34 @@
 				{
 				CCharFormatLayer* charFormatLayer=(*iParaIx)[para].iParaAttribs->iCharFormat;
 				// ASSERT: The basedOn link is valid.
+				if (charFormatLayer->SenseBase()==NULL)
+				    {
+				    OstTrace0( TRACE_DUMP, DUP3_CRICHTEXTINDEX_DBGTESTINVARIANT, "charFormatLayer->SenseBase()==NULL" );
+				    }
 				__ASSERT_DEBUG(charFormatLayer->SenseBase()!=NULL,User::Invariant());
 				sumOfPhraseLengths+=(*iParaIx)[para].iLength;
 				}
 			}
+		if (sumOfPhraseLengths!=paragraphLength)
+		    {
+		    OstTrace0( TRACE_DUMP, DUP4_CRICHTEXTINDEX_DBGTESTINVARIANT, "sumOfPhraseLengths!=paragraphLength" );
+		    }
 		__ASSERT_DEBUG(sumOfPhraseLengths==paragraphLength,User::Invariant());
 		}
 // ASSERT: We have no unexpected phrases left over
+	if (currentPhraseElement!=-1 &&
+            currentPhraseElement!=iPhraseIx->Count())
+	    {
+	    OstTrace0( TRACE_DUMP, DUP5_CRICHTEXTINDEX_DBGTESTINVARIANT, "We have no unexpected phrases left over" );
+	    }
 	__ASSERT_DEBUG(currentPhraseElement==-1 ||
 					currentPhraseElement==iPhraseIx->Count(),User::Invariant());
 // ASSERT: There is either zero(0) or one(1) zero length phrase in the whole index
+	if (!((zeroLengthPhraseCount==0) ||
+            (zeroLengthPhraseCount==1 && iPendingNewPhrasePos!=EInsertCharFormatReset)))
+	    {
+	    OstTrace0( TRACE_DUMP, DUP6_CRICHTEXTINDEX_DBGTESTINVARIANT, "There is either zero(0) or one(1) zero length phrase in the whole index" );
+	    }
 	__ASSERT_DEBUG( (zeroLengthPhraseCount==0) ||
 					(zeroLengthPhraseCount==1 && iPendingNewPhrasePos!=EInsertCharFormatReset),
 					User::Invariant());
@@ -117,6 +152,11 @@
 		while ((currentSharedPara=iterator++)!=NULL)
 			totalReferenceCount+=currentSharedPara->iRefCount;
 		}
+	if ((numberOfReferencesToSharedList!=totalReferenceCount) &&
+            (numberOfReferencesToSharedList!=totalReferenceCount-1))
+	    {
+	    OstTrace0( TRACE_DUMP, DUP7_CRICHTEXTINDEX_DBGTESTINVARIANT, "Invariant" );
+	    }
 	__ASSERT_DEBUG((numberOfReferencesToSharedList==totalReferenceCount) ||
 				   (numberOfReferencesToSharedList==totalReferenceCount-1),User::Invariant());
 // ASSERT: iPictureCount corresponds to the number of pictures in the stored in the index.
@@ -126,6 +166,10 @@
 		picCount+=((*iPhraseIx)[item].IsPicturePhrase())
 					? 1
 					: 0;
+	if (iPictureCount!=picCount)
+	    {
+	    OstTrace0( TRACE_DUMP, DUP8_CRICHTEXTINDEX_DBGTESTINVARIANT, "Invariant" );
+	    }
 	__ASSERT_DEBUG(iPictureCount==picCount,User::Invariant());
 #endif
 	}
@@ -186,6 +230,10 @@
 	TInt count;
 	if (iPhraseIx)
 		{// Destroy the phrase index and its contents.
+		if (!iParaIx)
+		    {
+		    OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_CRICHTEXTINDEX, "EPhraseIxPresentWithNoParaIx" );
+		    }
 		__ASSERT_ALWAYS(iParaIx,Panic(EPhraseIxPresentWithNoParaIx));
 		count=iPhraseIx->Count();
 		for (TInt offset=0;offset<count;offset++)
@@ -211,6 +259,10 @@
 	TDblQueIter<CParaAttribs> iterator(iSharedParaQueHead);
 	while ((currentSharedPara=iterator++)!=NULL)
 		currentSharedPara->Release(currentSharedPara->iRefCount);
+	if (!iSharedParaQueHead.IsEmpty())
+	    {
+	    OstTrace0( TRACE_FATAL, DUP1_CRICHTEXTINDEX_CRICHTEXTINDEX, "ERichTextIndexIntegrityErr" );
+	    }
 	__ASSERT_ALWAYS(iSharedParaQueHead.IsEmpty(),Panic(ERichTextIndexIntegrityErr));
 	}
 
@@ -397,6 +449,10 @@
 		{// For each para inserted between the fist and last
 		TParaAttribsEntry& para=(*iParaIx)[pastePos.iParaElement+paraItem];
 		TInt length=ParaLengthFromBuffer(buf)+1;
+		if (length==KErrNotFound)
+		    {
+		    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_INSERTL, "EInsertEmbeddedParaErr" );
+		    }
 		__ASSERT_DEBUG(length!=KErrNotFound,Panic(EInsertEmbeddedParaErr));
 		para.iLength=length;
 		buf.Set(buf.Right(buf.Length()-length));
@@ -452,6 +508,10 @@
 			current.iPhrase->AdjustLength(-1);  // collapse phrase by right amount
 			if (insertPendingPos!=EInsertCharFormatReset)
 				{
+				if (current.iPhrase->Length()!=0)
+				    {
+				    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_SPLITPARAGRAPHATPASTEPOSL, "Invariant" );
+				    }
 				__ASSERT_DEBUG(current.iPhrase->Length()==0,User::Invariant());
 				iPendingNewPhrasePos=insertPendingPos;
 				}
@@ -459,9 +519,14 @@
 				{
 				RemoveFromPhraseIx(iPos.iPhraseElement,1);
 				current.iParaAttribs->iPhraseCount--;
+				if (current.iParaAttribs->PhraseCount()<=1)
+				    {
+				    OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_SPLITPARAGRAPHATPASTEPOSL, "Invariant" );
+				    }
 				__ASSERT_DEBUG(current.iParaAttribs->PhraseCount()>1,User::Invariant());
 				}
 			}
+		OstTrace1( TRACE_DUMP, DUP2_CRICHTEXTINDEX_SPLITPARAGRAPHATPASTEPOSL, "Leave code=%d", ret );
 		User::Leave(ret);
 		}
 	if (insertPendingPos != EInsertCharFormatReset)
@@ -490,8 +555,16 @@
 
 	RebalanceIndex();
 // ASSERT: A valid picture header, referencing a valid picture has been inserted.
+	if (!aPicHdr.iPicture.IsPtr() || aPicHdr.iPicture.AsPtr()==NULL)
+	    {
+	    OstTrace0( TRACE_FATAL, DUP1_CRICHTEXTINDEX_INSERTL, "EInsertNullPicHdrData" );
+	    }
 	__ASSERT_ALWAYS(aPicHdr.iPicture.IsPtr() && aPicHdr.iPicture.AsPtr()!=NULL,Panic(EInsertNullPicHdrData));
 // ASSERT: The current insert pos hasn't been changed without cancelling SetInsertCharFormat.
+	if ((iPendingNewPhrasePos!=EInsertCharFormatReset) && (aPos!=iPendingNewPhrasePos))
+	    {
+	    OstTrace0( TRACE_FATAL, DUP2_CRICHTEXTINDEX_INSERTL, "ESetInsertCharFormatIntegrityErr" );
+	    }
 	__ASSERT_ALWAYS((iPendingNewPhrasePos==EInsertCharFormatReset) || (aPos==iPendingNewPhrasePos),
 					Panic(ESetInsertCharFormatIntegrityErr));
 	if (iPendingNewPhrasePos!=EInsertCharFormatReset)
@@ -516,6 +589,10 @@
 		}
 	GetCurrentRecords(current);
 //	ASSERT: The reclaim succeeded.  We must always end up with a PhraseIx-not constant char format.
+	if (current.iPhrase==NULL)
+	    {
+	    OstTrace0( TRACE_DUMP, DUP3_CRICHTEXTINDEX_INSERTL, "EReclaimShareError" );
+	    }
 	__ASSERT_DEBUG(current.iPhrase!=NULL,Panic(EReclaimShareError));
 	TRAPD(ret1,
 	SplitPhraseL(aPos));  // Phrase may not be split if at boundary.
@@ -771,6 +848,10 @@
 	CancelInsertCharFormat();
 	ScanToPosition(aPos,EScanToPositionAbsolute,&iLastUsed);
 
+	if (iPos.iParaElementOffset!=0)
+	    {
+	    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_DELETEPARAGRAPH, "EDeleteParagraphInvalidStartValue" );
+	    }
 	__ASSERT_DEBUG(iPos.iParaElementOffset==0,Panic(EDeleteParagraphInvalidStartValue));
 
 	TIndexDeleteInfo info;
@@ -813,6 +894,10 @@
 	TInt startParaLength=current.iParaEntry->iLength;
 	TInt lengthRemainingInPara=startParaLength-iPos.iParaElementOffset;
 
+	if (aLength>=lengthRemainingInPara)
+	    {
+	    OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_DELETEFROMPARAGRAPH, "EDeleteFromParagraphInvalidRange" );
+	    }
 	__ASSERT_ALWAYS(aLength<lengthRemainingInPara,Panic(EDeleteFromParagraphInvalidRange));
 	}
 #endif
@@ -1028,6 +1113,10 @@
 */
 void CRichTextIndex::SetInsertCharFormatL(const TCharFormatX& aFormat,const TCharFormatXMask& aMask,TInt aPos)
 	{
+	if (InsertCharFormatIsActive() && aPos!=iPendingNewPhrasePos)
+	    {
+	    OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_SETINSERTCHARFORMATL, "ESetInsertCharFormatIntegrityErr" );
+	    }
 	__ASSERT_ALWAYS(!InsertCharFormatIsActive() || aPos==iPendingNewPhrasePos,
 					Panic(ESetInsertCharFormatIntegrityErr));
 	if (InsertCharFormatIsActive())
@@ -1039,6 +1128,10 @@
 void CRichTextIndex::NewInsertCharFormatL(const TCharFormatX& aFormat,
 	const TCharFormatXMask& aMask, TInt aPos)
 	{
+	if (InsertCharFormatIsActive())
+	    {
+	    OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_NEWINSERTCHARFORMATL, "ESetInsertCharFormatIntegrityErr" );
+	    }
 	__ASSERT_ALWAYS(!InsertCharFormatIsActive(),
 		Panic(ESetInsertCharFormatIntegrityErr));
 	ScanToPosition(aPos,EScanToPositionMatchLeft);
@@ -1071,6 +1164,7 @@
 			if (PhraseSplit())
 				MergePhrases(aPos);
 			}
+		OstTrace0( TRACE_FATAL, DUP1_CRICHTEXTINDEX_NEWINSERTCHARFORMATL, "LeaveNoMemory" );
 		User::LeaveNoMemory();
 		}
 	iPendingNewPhrasePos=aPos;
@@ -1089,11 +1183,19 @@
 
 CCharFormatLayer* CRichTextIndex::GetCurrentInsertCharFormat()
 	{
+	if (!InsertCharFormatIsActive())
+	    {
+	    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_GETCURRENTINSERTCHARFORMAT, "ESetInsertCharFormatIntegrityErr" );
+	    }
 	__ASSERT_DEBUG(InsertCharFormatIsActive(),
 		Panic(ESetInsertCharFormatIntegrityErr));
 	ScanToPosition(iPendingNewPhrasePos,EScanToPositionMatchLeft);
 	TCurrentIndexRecords current;
 	GetCurrentRecords(current);
+	if ((*iPhraseIx)[iPos.iPhraseElement].Length() != 0)
+	    {
+	    OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_GETCURRENTINSERTCHARFORMAT, "ESetInsertCharFormatIntegrityErr" );
+	    }
 	__ASSERT_DEBUG((*iPhraseIx)[iPos.iPhraseElement].Length() == 0,
 		Panic(ESetInsertCharFormatIntegrityErr));
 	return (*iPhraseIx)[iPos.iPhraseElement].CharFormat();
@@ -1123,6 +1225,10 @@
 	if (iRollbackParaAttribsHandle)
 		{
 		// ASSERT: The specified para attribs is indeed in the share list.
+		if (!iRollbackParaAttribsHandle->IsShared())
+		    {
+		    OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_REBALANCEINDEX, "EParaAttribsNotInSharedList" );
+		    }
 		__ASSERT_ALWAYS(iRollbackParaAttribsHandle->IsShared(),Panic(EParaAttribsNotInSharedList));
 		iRollbackParaAttribsHandle->Release();
 		iRollbackParaAttribsHandle=NULL;
@@ -1154,6 +1260,10 @@
 */
 TBool CRichTextIndex::DeleteInsertCharFormat()
 	{
+	if (!InsertCharFormatIsActive())
+	    {
+	    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_DELETEINSERTCHARFORMAT, "Invariant" );
+	    }
 	__ASSERT_DEBUG(InsertCharFormatIsActive(), User::Invariant());
 	ScanToPosition(iPendingNewPhrasePos,EScanToPositionMatchLeft);
 	TCurrentIndexRecords current;
@@ -1455,6 +1565,10 @@
 
 void CRichTextIndex::SplitPhraseL(TInt aPhrase,TInt anOffset,RPhraseAttribsEntry& aPhraseAttribs,CParaAttribs& aParaAttribs)
 	{
+	if (anOffset<=0 || anOffset>=aPhraseAttribs.Length())
+	    {
+	    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_SPLITPHRASEL, "Invariant" );
+	    }
 	__ASSERT_DEBUG(anOffset>0 && anOffset<aPhraseAttribs.Length(),User::Invariant());
 //
 	CCharFormatLayer* charLayer=CCharFormatLayer::NewCopyBaseL(aPhraseAttribs.CharFormat());
@@ -1487,9 +1601,17 @@
 //
 	{
 	CParaAttribs* paraAttribs=aParaEntry.iParaAttribs;
+	if (paraAttribs->iPhraseCount!=1)
+	    {
+	    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_SHARE, "Invariant" );
+	    }
 	__ASSERT_DEBUG(paraAttribs->iPhraseCount==1,User::Invariant());
 
 	RPhraseAttribsEntry& phraseAttribs=iPhraseIx->At(aPhrase);
+	if (phraseAttribs.IsPicturePhrase())
+	    {
+	    OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_SHARE, "Invariant" );
+	    }
 	__ASSERT_DEBUG(!phraseAttribs.IsPicturePhrase(),User::Invariant());
 
 	CParaAttribs* share=GetParaAttribs(paraAttribs,*phraseAttribs.CharFormat());
@@ -1522,6 +1644,10 @@
 
 	TInt phrase=iPos.iPhraseElement;
 	TInt base=iPos.iParaBasePhraseElement;
+	if (phrase<base || phrase>=base+paraAttribs->iPhraseCount)
+	    {
+	    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPLYCHARFORMATROLLBACK, "Invariant" );
+	    }
 	__ASSERT_DEBUG(phrase>=base && phrase<base+paraAttribs->iPhraseCount,User::Invariant());
 	if (phrase<base+paraAttribs->iPhraseCount-1)	// merge to the right
 		MergePhrases(phrase+1,iPhraseIx->At(phrase+1),*paraAttribs);
@@ -1537,6 +1663,10 @@
 // aPos to aPos+(aLength-1).
 //
 	{
+	if (aLength<0)
+	    {
+	    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" );
+	    }
 	__ASSERT_DEBUG(aLength>=0,User::Invariant());
 	__TEST_INVARIANT;
 
@@ -1590,6 +1720,10 @@
 
 		do
 			{
+			if (phrase>=iPos.iParaBasePhraseElement+paraAttribs->iPhraseCount)
+			    {
+			    OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" );
+			    }
 			__ASSERT_DEBUG(phrase<iPos.iParaBasePhraseElement+paraAttribs->iPhraseCount,User::Invariant());
 //
 			RPhraseAttribsEntry* phraseAttribs=&iPhraseIx->At(phrase);
@@ -1627,6 +1761,10 @@
 				phraseAttribs=&iPhraseIx->At(phrase);		// SplitPhraseL modifies the index array, we must do this!
 				}
 
+			if (phraseAttribs->Length()!=len)
+			    {
+			    OstTrace0( TRACE_DUMP, DUP2_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" );
+			    }
 			__ASSERT_DEBUG(phraseAttribs->Length()==len,User::Invariant());
 
 // STEP 2.3	Change the format of the current phrase layer
@@ -1647,6 +1785,10 @@
 			charsToFormat-=len;
 			} while (charsToFormat);
 
+		if (phrase!=iPos.iParaBasePhraseElement+paraAttribs->iPhraseCount && aLength!=0)
+		    {
+		    OstTrace0( TRACE_DUMP, DUP3_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" );
+		    }
 		__ASSERT_DEBUG(phrase==iPos.iParaBasePhraseElement+paraAttribs->iPhraseCount || aLength==0,User::Invariant());
 
 // STEP 3	Reduce the paragraph attributes back to canonical form
@@ -1672,9 +1814,25 @@
 		iPos.iParaBasePhraseElement=phrase;
 #ifdef _DEBUG
 		ScanToPosition(aPos,EScanToPositionAbsolute);
+		if (iPos.iDocPos!=aPos)
+		    {
+		    OstTrace0( TRACE_DUMP, DUP4_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" );
+		    }
 		__ASSERT_DEBUG(iPos.iDocPos==aPos,User::Invariant());
+		if (iPos.iPhraseElement!=phrase)
+		    {
+		    OstTrace0( TRACE_DUMP, DUP5_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" );
+		    }
 		__ASSERT_DEBUG(iPos.iPhraseElement==phrase,User::Invariant());
+		if (iPos.iParaElementOffset!=paraOffset)
+		    {
+		    OstTrace0( TRACE_DUMP, DUP6_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" );
+		    }
 		__ASSERT_DEBUG(iPos.iParaElementOffset==paraOffset,User::Invariant());
+		if (iPos.iPhraseElementOffset!=phraseOffset)
+		    {
+		    OstTrace0( TRACE_DUMP, DUP7_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" );
+		    }
 		__ASSERT_DEBUG(iPos.iPhraseElementOffset==phraseOffset,User::Invariant());
 		__TEST_INVARIANT;
 #endif
@@ -2227,6 +2385,10 @@
 	else
 		{// No match, so piece together new shared paraAttribs and add to shared para list
 		sourceParaAttribs->iRefCount=1;
+		if (sourcePhrase->IsPicturePhrase())
+		    {
+		    OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_GETPARAATTRIBS, "EReleasCharFormatLayerOwnershipCalledOnPicturePhrase" );
+		    }
 		__ASSERT_ALWAYS(!sourcePhrase->IsPicturePhrase(),Panic(EReleasCharFormatLayerOwnershipCalledOnPicturePhrase));
 		sourceParaAttribs->iCharFormat=sourcePhrase->ReleaseCharFormatLayerOwnership();
 		sourcePhrase->Discard();
@@ -2356,6 +2518,10 @@
 		}
 	else
 		{
+		if (iPos.iParaBasePhraseElement!=phraseElement)
+		    {
+		    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_SCANTOPOSITION, "EDebug" );
+		    }
 		__ASSERT_DEBUG(iPos.iParaBasePhraseElement==phraseElement,Panic(EDebug));
 		}
 	iPos.iPhraseElement=phraseElement;
@@ -2460,6 +2626,10 @@
 		return;  // aSplitPos on a phrase boundary; urgo no split.
 	TCurrentIndexRecords current; GetCurrentRecords(current);
 // ASSERT: This function set can only be called on CParaAttribs that specific char format.
+	if (current.iPhrase==NULL)
+	    {
+	    OstTrace0( TRACE_FATAL, DUP1_CRICHTEXTINDEX_SPLITPHRASEL, "ESplitPhraseCalledOnSharedPara" );
+	    }
 	__ASSERT_ALWAYS(current.iPhrase!=NULL,Panic(ESplitPhraseCalledOnSharedPara));
 	DoSplitPhraseL(*current.iPhrase,iPos.iPhraseElementOffset,current.iParaAttribs);
 	}
@@ -2489,6 +2659,10 @@
 //
 	{
 // ASSERT: Cannot split a picture phrase.
+	if (aCurrentPhrase.IsPicturePhrase())
+	    {
+	    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_DOSPLITPHRASEL, "ESplitPhraseCalledOnPicturePhrase" );
+	    }
 	__ASSERT_DEBUG(!aCurrentPhrase.IsPicturePhrase(),Panic(ESplitPhraseCalledOnPicturePhrase));
 	CCharFormatLayer* layer=CCharFormatLayer::NewCopyBaseL(aCurrentPhrase.CharFormat());
 	CleanupStack::PushL(layer);
@@ -2520,6 +2694,10 @@
 		return ETrue;
 	//
 	TInt sharedParaCount=SharedParaCount(this);
+	if (sharedParaCount<1 && (sharedParaCount!=0 || phraseCount<=0))
+	    {
+	    OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_HASMARKUPDATA, "ERichTextIndexIntegrityErr" );
+	    }
 	__ASSERT_ALWAYS(sharedParaCount>=1 || (sharedParaCount==0 && phraseCount>0),Panic(ERichTextIndexIntegrityErr));
 	if (sharedParaCount>1)
 		return ETrue;
@@ -2592,6 +2770,10 @@
 		if (sParaAttribs->IsShared())
 			{
 			tParaAttribs=map->Item(sParaAttribs);
+			if (tParaAttribs==NULL)
+			    {
+			    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPENDPARAINDEXL, "ESharedFormatsMapIntegrityError" );
+			    }
 			__ASSERT_DEBUG(tParaAttribs!=NULL,Panic(ESharedFormatsMapIntegrityError));
 			tParaAttribs->iRefCount++;
 			}
@@ -2625,6 +2807,10 @@
 	CParaAttribs* currentSharedPara;
 	while ((currentSharedPara=iterator++)!=NULL)
 		{
+		if (!currentSharedPara->IsShared())
+		    {
+		    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPENDSHAREDFORMATSL, "Invariant" );
+		    }
 		__ASSERT_DEBUG(currentSharedPara->IsShared(),User::Invariant());
 
 		CParaFormatLayer* sPl=currentSharedPara->iParaFormat;
@@ -2689,10 +2875,18 @@
 		{
 		TInt jj=pictureMap->At(kk);
 		TPictureHeader* sHeader=(*aSource->iPhraseIx)[jj].PictureHeaderPtr();
+		if (!sHeader)
+		    {
+		    OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPENDPHRASEINDEXL, "Invariant" );
+		    }
 		__ASSERT_DEBUG(sHeader,User::Invariant());
 		if (sHeader->iPicture.IsPtr())
 			{	// transfer picture to us
 			TPictureHeader* tHeader=(*iPhraseIx)[jj+originalPhraseCount].PictureHeaderPtr();
+			if (!tHeader)
+			    {
+			    OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_APPENDPHRASEINDEXL, "Invariant" );
+			    }
 			__ASSERT_DEBUG(tHeader,User::Invariant());
 			tHeader->iPicture=sHeader->iPicture.AsPtr();
 			sHeader->iPicture=NULL;
@@ -2842,6 +3036,10 @@
 	{
 #ifdef _DEBUG
 // ASSERT: iLength is +ve (applying to character formatting, or	is set to indicate a picture phrase.
+	if (iLength<0 && !IsPicturePhrase())
+	    {
+	    OstTrace0( TRACE_DUMP, RPHRASEATTRIBSENTRY_DBGTESTINVARIANT, "Invariant" );
+	    }
 	__ASSERT_DEBUG(iLength>=0 || IsPicturePhrase(),User::Invariant());
 #endif
 	}
@@ -2925,6 +3123,11 @@
 	{
 // ASSERT: The length of a picture phrase may only be altered by deleting it, in which case
 //			the only adjustment made will be an increment of -1 (EPictureIndicator).
+	if (IsPicturePhrase() && (!IsPicturePhrase() || aIncrement!=EPictureIndicator)
+                                      && (!IsPicturePhrase() || aIncrement!=0) )
+	    {
+	    OstTrace0( TRACE_DUMP, RPHRASEATTRIBSENTRY_ADJUSTLENGTH, "EModifiedPicturePhraseLength" );
+	    }
 	__ASSERT_DEBUG(!IsPicturePhrase() || (IsPicturePhrase() && aIncrement==EPictureIndicator)
 									  || (IsPicturePhrase() && aIncrement==0)
 									  ,Panic(EModifiedPicturePhraseLength));