From 3b26f6f6643978c9d041a6267dc88e2a59ced763 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 28 Jan 2013 15:15:34 +0100 Subject: Fix QtScript crash on 64bit with JIT. During back-trace generation we calculate a code offset towards JIT generated code. Using JITCode::offsetOf() will crash/assert if the offset doesn't fit into 32 bits, because the generated code can only encode relative offsets in 32-bits and not 64-bits. However in this context - backtrace generation - we just want to calculate the offset and are not interested in this architectural limitation, therefore we can just calculate the offset ourselves using the fully sized uintptr_t. Initial-patch-by: Simon.Hausmann@digia.com Task-number: QTCREATORBUG-8629 Task-number: QTBUG-23463 Change-Id: I0efadd5ed20855409122e1fcc9236fdfbc4f62a4 Reviewed-by: Olivier Goffart --- src/script/api/qscriptcontextinfo.cpp | 2 +- tests/auto/qscriptcontext/tst_qscriptcontext.cpp | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/script/api/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp index afe38b6..f9879a4 100644 --- a/src/script/api/qscriptcontextinfo.cpp +++ b/src/script/api/qscriptcontextinfo.cpp @@ -159,7 +159,7 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte if (returnPC && codeBlock && QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) { #if ENABLE(JIT) JSC::JITCode code = codeBlock->getJITCode(); - unsigned jitOffset = code.offsetOf(JSC::ReturnAddressPtr(returnPC).value()); + uintptr_t jitOffset = reinterpret_cast(JSC::ReturnAddressPtr(returnPC).value()) - reinterpret_cast(code.addressForCall().executableAddress()); // We can only use the JIT code offset if it's smaller than the JIT size; // otherwise calling getBytecodeIndex() is meaningless. if (jitOffset < code.size()) { diff --git a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp index 00e2f15..aedacf3 100644 --- a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp +++ b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp @@ -964,9 +964,6 @@ void tst_QScriptContext::backtrace_data() void tst_QScriptContext::backtrace() { -#if defined(UBUNTU_ONEIRIC) && defined(__x86_64__) - QSKIP("Fails on this platform - QTBUG-23463"); -#endif QFETCH(QString, code); QFETCH(QStringList, expectedbacktrace); -- cgit v1.2.3