From 8cfba7d01567f0c37afb98573a6505e187986a7a Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 10 Jul 2013 15:44:11 +0200 Subject: Move QV4::Exception into a separate compilation unit with header file This is in preparation for some platform specific code regarding throwing exceptions, as well as a general cleanup :) Change-Id: I23fb4f12fd09423a1f2cb225145780925002677b Reviewed-by: Erik Verbruggen --- src/imports/localstorage/plugin.cpp | 1 + src/qml/qml/qqmljavascriptexpression_p.h | 1 + src/qml/qml/v4/moth/qv4vme_moth.cpp | 1 + src/qml/qml/v4/qv4engine.cpp | 33 ------ src/qml/qml/v4/qv4engine_p.h | 19 ---- src/qml/qml/v4/qv4exception.cpp | 122 +++++++++++++++++++++ src/qml/qml/v4/qv4exception_p.h | 78 +++++++++++++ src/qml/qml/v4/qv4functionobject.cpp | 1 + src/qml/qml/v4/qv4globalobject.cpp | 1 + src/qml/qml/v4/qv4include.cpp | 1 + src/qml/qml/v4/qv4isel_masm.cpp | 1 + src/qml/qml/v4/qv4runtime.cpp | 35 +----- src/qml/qml/v4/qv4script.cpp | 1 + src/qml/qml/v4/qv4value.cpp | 1 + src/qml/qml/v4/v4.pri | 6 +- src/qml/qml/v8/qjsengine.cpp | 1 + src/qml/qml/v8/qjsvalue.cpp | 1 + src/qml/qml/v8/qjsvalueiterator.cpp | 1 + .../auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | 1 + tools/v4/main.cpp | 1 + 20 files changed, 220 insertions(+), 87 deletions(-) create mode 100644 src/qml/qml/v4/qv4exception.cpp create mode 100644 src/qml/qml/v4/qv4exception_p.h diff --git a/src/imports/localstorage/plugin.cpp b/src/imports/localstorage/plugin.cpp index 5bb8099b2e..452a3d3127 100644 --- a/src/imports/localstorage/plugin.cpp +++ b/src/imports/localstorage/plugin.cpp @@ -59,6 +59,7 @@ #include #include #include +#include using namespace QV4; diff --git a/src/qml/qml/qqmljavascriptexpression_p.h b/src/qml/qml/qqmljavascriptexpression_p.h index 2e674b214a..ef36a2f91a 100644 --- a/src/qml/qml/qqmljavascriptexpression_p.h +++ b/src/qml/qml/qqmljavascriptexpression_p.h @@ -57,6 +57,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/v4/moth/qv4vme_moth.cpp b/src/qml/qml/v4/moth/qv4vme_moth.cpp index 1c8b186885..527e686592 100644 --- a/src/qml/qml/v4/moth/qv4vme_moth.cpp +++ b/src/qml/qml/v4/moth/qv4vme_moth.cpp @@ -43,6 +43,7 @@ #include "qv4instr_moth_p.h" #include #include +#include #include diff --git a/src/qml/qml/v4/qv4engine.cpp b/src/qml/qml/v4/qv4engine.cpp index 2f40442928..56c711ceb7 100644 --- a/src/qml/qml/v4/qv4engine.cpp +++ b/src/qml/qml/v4/qv4engine.cpp @@ -826,37 +826,4 @@ QmlExtensions *ExecutionEngine::qmlExtensions() return m_qmlExtensions; } -Exception::Exception(ExecutionContext *throwingContext, const Value &exceptionValue) - : exception(exceptionValue) -{ - this->throwingContext = throwingContext->engine->current; - accepted = false; - if (ErrorObject *error = exceptionValue.asErrorObject()) - m_stackTrace = error->stackTrace; - else - m_stackTrace = throwingContext->engine->stackTrace(); -} - -Exception::~Exception() -{ - assert(accepted); -} - -void Exception::accept(ExecutionContext *catchingContext) -{ - assert(!accepted); - accepted = true; - partiallyUnwindContext(catchingContext); -} - -void Exception::partiallyUnwindContext(ExecutionContext *catchingContext) -{ - if (!throwingContext) - return; - ExecutionContext *context = throwingContext; - while (context != catchingContext) - context = context->engine->popContext(); - throwingContext = context; -} - QT_END_NAMESPACE diff --git a/src/qml/qml/v4/qv4engine_p.h b/src/qml/qml/v4/qv4engine_p.h index 090ae95501..842fb44ecb 100644 --- a/src/qml/qml/v4/qv4engine_p.h +++ b/src/qml/qml/v4/qv4engine_p.h @@ -323,25 +323,6 @@ inline ExecutionContext *ExecutionEngine::popContext() return current; } -struct Q_QML_EXPORT Exception { - explicit Exception(ExecutionContext *throwingContext, const Value &exceptionValue); - ~Exception(); - - void accept(ExecutionContext *catchingContext); - - void partiallyUnwindContext(ExecutionContext *catchingContext); - - Value value() const { return exception; } - - ExecutionEngine::StackTrace stackTrace() const { return m_stackTrace; } - -private: - ExecutionContext *throwingContext; - bool accepted; - PersistentValue exception; - ExecutionEngine::StackTrace m_stackTrace; -}; - } // namespace QV4 QT_END_NAMESPACE diff --git a/src/qml/qml/v4/qv4exception.cpp b/src/qml/qml/v4/qv4exception.cpp new file mode 100644 index 0000000000..de8604e97e --- /dev/null +++ b/src/qml/qml/v4/qv4exception.cpp @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qv4exception_p.h" +#include "qv4errorobject_p.h" +#include "qv4debugging_p.h" +#include "qv4unwindhelper_p.h" + +#include + +#if USE(LIBUNWIND_DEBUG) +#include +#include +#endif + +QT_BEGIN_NAMESPACE + +using namespace QV4; + + +void Exception::throwException(ExecutionContext *context, const Value &value) +{ + if (context->engine->debugger) + context->engine->debugger->aboutToThrow(value); + + UnwindHelper::prepareForUnwind(context); + +#if USE(LIBUNWIND_DEBUG) + printf("about to throw exception. walking stack first with libunwind:\n"); + unw_cursor_t cursor; unw_context_t uc; + unw_word_t ip, sp; + + unw_getcontext(&uc); + unw_init_local(&cursor, &uc); + while (unw_step(&cursor) > 0) { + unw_get_reg(&cursor, UNW_REG_IP, &ip); + unw_get_reg(&cursor, UNW_REG_SP, &sp); + printf("ip = %lx, sp = %lx ", (long) ip, (long) sp); + void * const addr = (void*)ip; + char **symbol = backtrace_symbols(&addr, 1); + printf("%s", symbol[0]); + free(symbol); + printf("\n"); + } + printf("stack walked. throwing exception now...\n"); +#endif + + throw Exception(context, value); +} + +Exception::Exception(ExecutionContext *throwingContext, const Value &exceptionValue) + : exception(exceptionValue) +{ + this->throwingContext = throwingContext->engine->current; + accepted = false; + if (ErrorObject *error = exceptionValue.asErrorObject()) + m_stackTrace = error->stackTrace; + else + m_stackTrace = throwingContext->engine->stackTrace(); +} + +Exception::~Exception() +{ + assert(accepted); +} + +void Exception::accept(ExecutionContext *catchingContext) +{ + assert(!accepted); + accepted = true; + partiallyUnwindContext(catchingContext); +} + +void Exception::partiallyUnwindContext(ExecutionContext *catchingContext) +{ + if (!throwingContext) + return; + ExecutionContext *context = throwingContext; + while (context != catchingContext) + context = context->engine->popContext(); + throwingContext = context; +} + +QT_END_NAMESPACE diff --git a/src/qml/qml/v4/qv4exception_p.h b/src/qml/qml/v4/qv4exception_p.h new file mode 100644 index 0000000000..d828092e6a --- /dev/null +++ b/src/qml/qml/v4/qv4exception_p.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QV4EXCEPTION_GNU_P +#define QV4EXCEPTION_GNU_P + +#include +#include "qv4value_p.h" +#include "qv4engine_p.h" + +QT_BEGIN_NAMESPACE + +namespace QV4 { + +struct Q_QML_EXPORT Exception { + static void throwException(ExecutionContext *throwingContext, const Value &exceptionValue); + + ~Exception(); + + void accept(ExecutionContext *catchingContext); + + void partiallyUnwindContext(ExecutionContext *catchingContext); + + Value value() const { return exception; } + + ExecutionEngine::StackTrace stackTrace() const { return m_stackTrace; } + +private: + explicit Exception(ExecutionContext *throwingContext, const Value &exceptionValue); + + ExecutionContext *throwingContext; + bool accepted; + PersistentValue exception; + ExecutionEngine::StackTrace m_stackTrace; +}; + +} // namespace QV4 + +QT_END_NAMESPACE + +#endif // QV4EXCEPTION_GNU_P diff --git a/src/qml/qml/v4/qv4functionobject.cpp b/src/qml/qml/v4/qv4functionobject.cpp index 1af5c6ddd1..ffdd08ed0a 100644 --- a/src/qml/qml/v4/qv4functionobject.cpp +++ b/src/qml/qml/v4/qv4functionobject.cpp @@ -46,6 +46,7 @@ #include "qv4stringobject_p.h" #include "qv4function_p.h" #include "qv4mm_p.h" +#include "qv4exception_p.h" #include #include diff --git a/src/qml/qml/v4/qv4globalobject.cpp b/src/qml/qml/v4/qv4globalobject.cpp index bd45f79cb4..6b279416a3 100644 --- a/src/qml/qml/v4/qv4globalobject.cpp +++ b/src/qml/qml/v4/qv4globalobject.cpp @@ -46,6 +46,7 @@ #include "qv4function_p.h" #include "qv4debugging_p.h" #include "qv4script_p.h" +#include "qv4exception_p.h" #include #include diff --git a/src/qml/qml/v4/qv4include.cpp b/src/qml/qml/v4/qv4include.cpp index 35ccb14644..4fd7bb14c7 100644 --- a/src/qml/qml/v4/qv4include.cpp +++ b/src/qml/qml/v4/qv4include.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/v4/qv4isel_masm.cpp b/src/qml/qml/v4/qv4isel_masm.cpp index e931f54a0d..d4c84994b9 100644 --- a/src/qml/qml/v4/qv4isel_masm.cpp +++ b/src/qml/qml/v4/qv4isel_masm.cpp @@ -48,6 +48,7 @@ #include "qv4lookup_p.h" #include "qv4function_p.h" #include "qv4ssa_p.h" +#include "qv4exception_p.h" #include #include diff --git a/src/qml/qml/v4/qv4runtime.cpp b/src/qml/qml/v4/qv4runtime.cpp index 1a5221ec97..deccb3d4ea 100644 --- a/src/qml/qml/v4/qv4runtime.cpp +++ b/src/qml/qml/v4/qv4runtime.cpp @@ -40,7 +40,6 @@ ****************************************************************************/ #include "qv4global_p.h" -#include "qv4debugging_p.h" #include "qv4runtime_p.h" #include "qv4object_p.h" #include "qv4jsir_p.h" @@ -49,7 +48,7 @@ #include "qv4stringobject_p.h" #include "qv4lookup_p.h" #include "qv4function_p.h" -#include "qv4unwindhelper_p.h" +#include "qv4exception_p.h" #include "private/qlocale_tools_p.h" #include @@ -62,11 +61,6 @@ #include "../../../3rdparty/double-conversion/double-conversion.h" -#if USE(LIBUNWIND_DEBUG) -#include -#include -#endif - QT_BEGIN_NAMESPACE namespace QV4 { @@ -940,32 +934,7 @@ void __qmljs_construct_property(ExecutionContext *context, Value *result, const void __qmljs_throw(ExecutionContext *context, const Value &value) { - if (context->engine->debugger) - context->engine->debugger->aboutToThrow(value); - - UnwindHelper::prepareForUnwind(context); - -#if USE(LIBUNWIND_DEBUG) - printf("about to throw exception. walking stack first with libunwind:\n"); - unw_cursor_t cursor; unw_context_t uc; - unw_word_t ip, sp; - - unw_getcontext(&uc); - unw_init_local(&cursor, &uc); - while (unw_step(&cursor) > 0) { - unw_get_reg(&cursor, UNW_REG_IP, &ip); - unw_get_reg(&cursor, UNW_REG_SP, &sp); - printf("ip = %lx, sp = %lx ", (long) ip, (long) sp); - void * const addr = (void*)ip; - char **symbol = backtrace_symbols(&addr, 1); - printf("%s", symbol[0]); - free(symbol); - printf("\n"); - } - printf("stack walked. throwing exception now...\n"); -#endif - - throw Exception(context, value); + Exception::throwException(context, value); } void __qmljs_builtin_typeof(ExecutionContext *ctx, Value *result, const Value &value) diff --git a/src/qml/qml/v4/qv4script.cpp b/src/qml/qml/v4/qv4script.cpp index 8c60194af4..1a6098b2ce 100644 --- a/src/qml/qml/v4/qv4script.cpp +++ b/src/qml/qml/v4/qv4script.cpp @@ -45,6 +45,7 @@ #include "qv4function_p.h" #include "qv4context_p.h" #include "qv4debugging_p.h" +#include "qv4exception_p.h" #include #include diff --git a/src/qml/qml/v4/qv4value.cpp b/src/qml/qml/v4/qv4value.cpp index bf22444032..a41262f12f 100644 --- a/src/qml/qml/v4/qv4value.cpp +++ b/src/qml/qml/v4/qv4value.cpp @@ -42,6 +42,7 @@ #include #include #include "qv4mm_p.h" +#include "qv4exception_p.h" #include diff --git a/src/qml/qml/v4/v4.pri b/src/qml/qml/v4/v4.pri index 48d9e82cb5..ddf8f5ba5a 100644 --- a/src/qml/qml/v4/v4.pri +++ b/src/qml/qml/v4/v4.pri @@ -57,7 +57,8 @@ SOURCES += \ $$PWD/qv4include.cpp \ $$PWD/qv4qobjectwrapper.cpp \ $$PWD/qv4qmlextensions.cpp \ - $$PWD/qv4stacktrace.cpp + $$PWD/qv4stacktrace.cpp \ + $$PWD/qv4exception.cpp HEADERS += \ $$PWD/qv4global_p.h \ @@ -113,7 +114,8 @@ HEADERS += \ $$PWD/qv4include_p.h \ $$PWD/qv4qobjectwrapper_p.h \ $$PWD/qv4qmlextensions_p.h \ - $$PWD/qv4stacktrace_p.h + $$PWD/qv4stacktrace_p.h \ + $$PWD/qv4exception_p.h llvm-libs { diff --git a/src/qml/qml/v8/qjsengine.cpp b/src/qml/qml/v8/qjsengine.cpp index 13281875e6..554487cf13 100644 --- a/src/qml/qml/v8/qjsengine.cpp +++ b/src/qml/qml/v8/qjsengine.cpp @@ -49,6 +49,7 @@ #include "private/qv4mm_p.h" #include "private/qv4globalobject_p.h" #include "private/qv4script_p.h" +#include "private/qv4exception_p.h" #include #include diff --git a/src/qml/qml/v8/qjsvalue.cpp b/src/qml/qml/v8/qjsvalue.cpp index 7a881cfee4..2fab183bd0 100644 --- a/src/qml/qml/v8/qjsvalue.cpp +++ b/src/qml/qml/v8/qjsvalue.cpp @@ -54,6 +54,7 @@ #include "qv4regexpobject_p.h" #include "qv8engine_p.h" #include +#include QV4::Value QJSValuePrivate::getValue(QV4::ExecutionEngine *e) { diff --git a/src/qml/qml/v8/qjsvalueiterator.cpp b/src/qml/qml/v8/qjsvalueiterator.cpp index a6fba112c9..fbaf483a66 100644 --- a/src/qml/qml/v8/qjsvalueiterator.cpp +++ b/src/qml/qml/v8/qjsvalueiterator.cpp @@ -44,6 +44,7 @@ #include "qjsvalue_p.h" #include "private/qv4string_p.h" #include "private/qv4object_p.h" +#include "private/qv4exception_p.h" QT_BEGIN_NAMESPACE diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index 3ac88dd086..863805ae12 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -54,6 +54,7 @@ #include "testhttpserver.h" #include "../../shared/util.h" #include +#include /* This test covers evaluation of ECMAScript expressions and bindings from within diff --git a/tools/v4/main.cpp b/tools/v4/main.cpp index 5cdd4dfdb9..cc1dc71b60 100644 --- a/tools/v4/main.cpp +++ b/tools/v4/main.cpp @@ -58,6 +58,7 @@ #include "private/qv4mm_p.h" #include "private/qv4context_p.h" #include "private/qv4script_p.h" +#include "private/qv4exception_p.h" #ifdef V4_ENABLE_JIT # include "private/qv4isel_masm_p.h" -- cgit v1.2.3