From f5acce7e11fa7c6abf5cf5352ec750c1ac65dd29 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 16 May 2011 13:47:09 +0200 Subject: Fix crashes with regular expressions QtScript on ARM traditional architectures Save and restore the r8 register properly. Backport of http://trac.webkit.org/changeset/65242 from WebKit trunk Reviewed-by: Jedrzej Nowacki --- src/3rdparty/javascriptcore/JavaScriptCore/yarr/RegexJIT.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/yarr/RegexJIT.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/yarr/RegexJIT.cpp index fcb8d86..1015923 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/yarr/RegexJIT.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/yarr/RegexJIT.cpp @@ -1312,6 +1312,9 @@ class RegexGenerator : private MacroAssembler { push(ARMRegisters::r4); push(ARMRegisters::r5); push(ARMRegisters::r6); +#if CPU(ARM_TRADITIONAL) + push(ARMRegisters::r8); // scratch register +#endif move(ARMRegisters::r3, output); #endif } @@ -1327,6 +1330,9 @@ class RegexGenerator : private MacroAssembler { pop(X86Registers::ebx); pop(X86Registers::ebp); #elif CPU(ARM) +#if CPU(ARM_TRADITIONAL) + pop(ARMRegisters::r8); // scratch register +#endif pop(ARMRegisters::r6); pop(ARMRegisters::r5); pop(ARMRegisters::r4); -- cgit v0.12 From 8e321cd869da7ff1cf0168da41aa0246b44867cc Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 16 May 2011 14:04:31 +0200 Subject: Fix inconsistency between Qt and ICU in Shift-JIS codec with regards to ASCII range Qt's Shift-JIS codec maps the characters 0x5c and 0x7e to unicode yen (0x5a) and unicode overline (0x203e). ICU and (as it turns out) Symbian's native Shift-JIS codec preserve 0x5c and 0x7e when converting to Unicode. Qt's behaviour creates a problem when loading japanese web sites that are encoded in Shift-JIS. When they reference external JavaScript files, those tend to inherit the current page encoding (unless the character set is explicitly specified). Consequently JavaScript tends to contain regular expressions (as a built-in feature of the language), which in turn uses backslashes for escape sequences. Therefore it is crucial that the encodings used to decode the script preserve the ASCII range, i.e. do not convert 0x5c (ascii backslash) to something else. This patch corrects the behaviour of Qt's Shift-JIS codec to leave all characters < 0x80 unaltered in the process of conversion to and from Unicode. Task: QTBUG-19335 Reviewed-by: Lars Knoll --- src/plugins/codecs/jp/qsjiscodec.cpp | 4 +++- tests/auto/qtextcodec/tst_qtextcodec.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/plugins/codecs/jp/qsjiscodec.cpp b/src/plugins/codecs/jp/qsjiscodec.cpp index 49190d3..3ea5300 100644 --- a/src/plugins/codecs/jp/qsjiscodec.cpp +++ b/src/plugins/codecs/jp/qsjiscodec.cpp @@ -155,7 +155,9 @@ QString QSjisCodec::convertToUnicode(const char* chars, int len, ConverterState uchar ch = chars[i]; switch (nbuf) { case 0: - if (ch < 0x80 || IsKana(ch)) { + if (ch < 0x80) { + result += QValidChar(ch); + } else if (IsKana(ch)) { // JIS X 0201 Latin or JIS X 0201 Kana u = conv->jisx0201ToUnicode(ch); result += QValidChar(u); diff --git a/tests/auto/qtextcodec/tst_qtextcodec.cpp b/tests/auto/qtextcodec/tst_qtextcodec.cpp index 43656c8..15ecc3b 100644 --- a/tests/auto/qtextcodec/tst_qtextcodec.cpp +++ b/tests/auto/qtextcodec/tst_qtextcodec.cpp @@ -106,6 +106,8 @@ private slots: void moreToFromUnicode_data(); void moreToFromUnicode(); + + void shiftJis(); }; void tst_QTextCodec::toUnicode_data() @@ -2236,6 +2238,19 @@ void tst_QTextCodec::moreToFromUnicode() QCOMPARE(testData, cStr); } +void tst_QTextCodec::shiftJis() +{ + QByteArray backslashTilde("\\~"); + QTextCodec* codec = QTextCodec::codecForName("shift_jis"); + QString string = codec->toUnicode(backslashTilde); + QCOMPARE(string.length(), 2); + QCOMPARE(string.at(0), QChar(QLatin1Char('\\'))); + QCOMPARE(string.at(1), QChar(QLatin1Char('~'))); + + QByteArray encoded = codec->fromUnicode(string); + QCOMPARE(encoded, backslashTilde); +} + struct DontCrashAtExit { ~DontCrashAtExit() { QTextCodec *c = QTextCodec::codecForName("utf8"); -- cgit v0.12