From 5c9c5916c987452d3c11e00f845f563c41548090 Mon Sep 17 00:00:00 2001 From: asac Date: Wed, 21 Feb 2007 03:34:14 +0100 Subject: [PATCH] bz161826 nsTextFrame::MeasureText()'s crash on RISC + nsTextFrame::MeasureText()'s fast text measuring codepath crashes on RISC machines --- intl/lwbrk/src/nsJISx4501LineBreaker.cpp | 24 ++++++++++++------------ intl/unicharutil/util/nsUnicharUtils.cpp | 23 +++++++++++++++++++++++ intl/unicharutil/util/nsUnicharUtils.h | 5 +++++ layout/generic/nsTextFrame.cpp | 8 ++++---- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/intl/lwbrk/src/nsJISx4501LineBreaker.cpp b/intl/lwbrk/src/nsJISx4501LineBreaker.cpp index fb9ec70..5d11bbb 100644 --- a/intl/lwbrk/src/nsJISx4501LineBreaker.cpp +++ b/intl/lwbrk/src/nsJISx4501LineBreaker.cpp @@ -487,13 +487,13 @@ NS_IMETHODIMP nsJISx4051LineBreaker::Next( PRUint32 cur; for (cur = aPos; cur < aLen; ++cur) { - if (IS_SPACE(aText[cur])) + if (IS_SPACE(GetUnichar(&aText[cur]))) { *oNext = cur; *oNeedMoreText = PR_FALSE; return NS_OK; } - if (IS_CJK_CHAR(aText[cur])) + if (IS_CJK_CHAR(GetUnichar(&aText[cur])) || IS_THAI(GetUnichar(&aText[cur]))) goto ROUTE_CJK_NEXT; } *oNext = aLen; @@ -503,13 +503,13 @@ NS_IMETHODIMP nsJISx4051LineBreaker::Next( ROUTE_CJK_NEXT: PRInt8 c1, c2; cur = aPos; - if(NEED_CONTEXTUAL_ANALYSIS(aText[cur])) + if(NEED_CONTEXTUAL_ANALYSIS(GetUnichar(&aText[cur]))) { - c1 = this->ContextualAnalysis((cur>0)?aText[cur-1]:0, - aText[cur], - (cur<(aLen-1)) ?aText[cur+1]:0); + c1 = this->ContextualAnalysis((cur>0)?GetUnichar(&aText[cur-1]):0, + GetUnichar(&aText[cur]), + (cur<(aLen-1)) ?GetUnichar(&aText[cur+1]):0); } else { - c1 = this->GetClass(aText[cur]); + c1 = this->GetClass(GetUnichar(&aText[cur])); } if(CLASS_THAI == c1) @@ -521,13 +521,13 @@ ROUTE_CJK_NEXT: for(cur++; cur ContextualAnalysis((cur>0)?aText[cur-1]:0, - aText[cur], - (cur<(aLen-1)) ?aText[cur+1]:0); + c2= this->ContextualAnalysis((cur>0)?GetUnichar(&aText[cur-1]):0, + GetUnichar(&aText[cur]), + (cur<(aLen-1)) ?GetUnichar(&aText[cur+1]):0); } else { - c2 = this->GetClass(aText[cur]); + c2 = this->GetClass(GetUnichar(&aText[cur])); } if(GetPair(c1, c2)) { diff --git a/intl/unicharutil/util/nsUnicharUtils.cpp b/intl/unicharutil/util/nsUnicharUtils.cpp index 1f1d686..8429f5a 100644 --- a/intl/unicharutil/util/nsUnicharUtils.cpp +++ b/intl/unicharutil/util/nsUnicharUtils.cpp @@ -348,3 +348,26 @@ ToUpperCase(PRUnichar aChar) return result; } +PRUnichar +GetUnichar(const void *ptr) +{ + PRUnichar result; +#if NEED_STRICT_ALIGNMENT + *((char *) &result) = *((char *) ptr); + *((char *) &result + 1) = *((char *) ptr + 1); +#else + result = *((PRUnichar *) ptr); +#endif + return result; +} + +void +SetUnichar(void *ptr, PRUnichar aChar) +{ +#if NEED_STRICT_ALIGNMENT + *((char *) ptr) = *((char *) &aChar); + *((char *) ptr + 1) = *((char *) &aChar + 1); +#else + *((PRUnichar *) ptr) = aChar; +#endif +} diff --git a/intl/unicharutil/util/nsUnicharUtils.h b/intl/unicharutil/util/nsUnicharUtils.h index f021f1d..854f74e 100644 --- a/intl/unicharutil/util/nsUnicharUtils.h +++ b/intl/unicharutil/util/nsUnicharUtils.h @@ -82,6 +82,11 @@ inline PRBool CaseInsensitiveFindInReadable( const nsAString& aPattern, PRUnichar ToUpperCase(PRUnichar); PRUnichar ToLowerCase(PRUnichar); +#define NEED_STRICT_ALIGNMENT defined(__sparc__) || defined(__alpha__) || defined(__mips__) + +PRUnichar GetUnichar(const void *); +void SetUnichar(void *, PRUnichar); + inline PRBool IsUpperCase(PRUnichar c) { return ToLowerCase(c) != c; } diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index 5fab101..fe52aa8 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -5129,8 +5129,8 @@ TransformTextToUnicode(char* aText, PRInt32 aNumChars) while (aNumChars-- > 0) { // XXX: If you crash here then you may see the issue described - // in http://bugzilla.mozilla.org/show_bug.cgi?id=36146#c44 - *cp2-- = PRUnichar(*cp1--); + // in http://bugzilla.mozilla.org/show_bug.cgi?id=161826 + SetUnichar(cp2--, PRUnichar(*cp1--)); } } @@ -6227,9 +6227,9 @@ RevertSpacesToNBSP(PRUnichar* aBuffer, PRInt32 aWordLen) { PRUnichar* end = aBuffer + aWordLen; for (; aBuffer < end; aBuffer++) { - PRUnichar ch = *aBuffer; + PRUnichar ch = GetUnichar(aBuffer); if (ch == ' ') { - *aBuffer = CH_NBSP; + SetUnichar(aBuffer, CH_NBSP); } } } -- 1.4.4.4