Move QV4::Exception into a separate compilation unit with header file
authorSimon Hausmann <simon.hausmann@digia.com>
Wed, 10 Jul 2013 13:44:11 +0000 (15:44 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 12 Jul 2013 08:11:10 +0000 (10:11 +0200)
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 <erik.verbruggen@digia.com>
20 files changed:
src/imports/localstorage/plugin.cpp
src/qml/qml/qqmljavascriptexpression_p.h
src/qml/qml/v4/moth/qv4vme_moth.cpp
src/qml/qml/v4/qv4engine.cpp
src/qml/qml/v4/qv4engine_p.h
src/qml/qml/v4/qv4exception.cpp [new file with mode: 0644]
src/qml/qml/v4/qv4exception_p.h [new file with mode: 0644]
src/qml/qml/v4/qv4functionobject.cpp
src/qml/qml/v4/qv4globalobject.cpp
src/qml/qml/v4/qv4include.cpp
src/qml/qml/v4/qv4isel_masm.cpp
src/qml/qml/v4/qv4runtime.cpp
src/qml/qml/v4/qv4script.cpp
src/qml/qml/v4/qv4value.cpp
src/qml/qml/v4/v4.pri
src/qml/qml/v8/qjsengine.cpp
src/qml/qml/v8/qjsvalue.cpp
src/qml/qml/v8/qjsvalueiterator.cpp
tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
tools/v4/main.cpp

index 5bb8099..452a3d3 100644 (file)
@@ -59,6 +59,7 @@
 #include <private/qv4object_p.h>
 #include <private/qv4functionobject_p.h>
 #include <private/qv4objectproto_p.h>
+#include <private/qv4exception_p.h>
 
 using namespace QV4;
 
index 2e674b2..ef36a2f 100644 (file)
@@ -57,6 +57,7 @@
 #include <QtQml/qqmlerror.h>
 #include <private/qqmlengine_p.h>
 #include <private/qpointervaluepair_p.h>
+#include <private/qv4exception_p.h>
 
 QT_BEGIN_NAMESPACE
 
index 1c8b186..527e686 100644 (file)
@@ -43,6 +43,7 @@
 #include "qv4instr_moth_p.h"
 #include <private/qv4value_p.h>
 #include <private/qv4debugging_p.h>
+#include <private/qv4exception_p.h>
 
 #include <iostream>
 
index 2f40442..56c711c 100644 (file)
@@ -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
index 090ae95..842fb44 100644 (file)
@@ -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 (file)
index 0000000..de8604e
--- /dev/null
@@ -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 <wtf/Platform.h>
+
+#if USE(LIBUNWIND_DEBUG)
+#include <libunwind.h>
+#include <execinfo.h>
+#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 (file)
index 0000000..d828092
--- /dev/null
@@ -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 <qglobal.h>
+#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
index 1af5c6d..ffdd08e 100644 (file)
@@ -46,6 +46,7 @@
 #include "qv4stringobject_p.h"
 #include "qv4function_p.h"
 #include "qv4mm_p.h"
+#include "qv4exception_p.h"
 
 #include <private/qqmljsengine_p.h>
 #include <private/qqmljslexer_p.h>
index bd45f79..6b27941 100644 (file)
@@ -46,6 +46,7 @@
 #include "qv4function_p.h"
 #include "qv4debugging_p.h"
 #include "qv4script_p.h"
+#include "qv4exception_p.h"
 
 #include <private/qqmljsengine_p.h>
 #include <private/qqmljslexer_p.h>
index 35ccb14..4fd7bb1 100644 (file)
@@ -52,6 +52,7 @@
 #include <private/qv4functionobject_p.h>
 #include <private/qv4script_p.h>
 #include <private/qv4context_p.h>
+#include <private/qv4exception_p.h>
 #include <private/qqmlcontextwrapper_p.h>
 
 QT_BEGIN_NAMESPACE
index e931f54..d4c8499 100644 (file)
@@ -48,6 +48,7 @@
 #include "qv4lookup_p.h"
 #include "qv4function_p.h"
 #include "qv4ssa_p.h"
+#include "qv4exception_p.h"
 
 #include <assembler/LinkBuffer.h>
 #include <WTFStubs.h>
index 1a5221e..deccb3d 100644 (file)
@@ -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 <QtCore/qmath.h>
 
 #include "../../../3rdparty/double-conversion/double-conversion.h"
 
-#if USE(LIBUNWIND_DEBUG)
-#include <libunwind.h>
-#include <execinfo.h>
-#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)
index 8c60194..1a6098b 100644 (file)
@@ -45,6 +45,7 @@
 #include "qv4function_p.h"
 #include "qv4context_p.h"
 #include "qv4debugging_p.h"
+#include "qv4exception_p.h"
 
 #include <private/qqmljsengine_p.h>
 #include <private/qqmljslexer_p.h>
index bf22444..a41262f 100644 (file)
@@ -42,6 +42,7 @@
 #include <qv4object_p.h>
 #include <qv4objectproto_p.h>
 #include "qv4mm_p.h"
+#include "qv4exception_p.h"
 
 #include <wtf/MathExtras.h>
 
index 48d9e82..ddf8f5b 100644 (file)
@@ -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 {
 
index 1328187..554487c 100644 (file)
@@ -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 <QtCore/qdatetime.h>
 #include <QtCore/qmetaobject.h>
index 7a881cf..2fab183 100644 (file)
@@ -54,6 +54,7 @@
 #include "qv4regexpobject_p.h"
 #include "qv8engine_p.h"
 #include <private/qv4mm_p.h>
+#include <private/qv4exception_p.h>
 
 QV4::Value QJSValuePrivate::getValue(QV4::ExecutionEngine *e)
 {
index a6fba11..fbaf483 100644 (file)
@@ -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
 
index 3ac88dd..863805a 100644 (file)
@@ -54,6 +54,7 @@
 #include "testhttpserver.h"
 #include "../../shared/util.h"
 #include <private/qv4functionobject_p.h>
+#include <private/qv4exception_p.h>
 
 /*
 This test covers evaluation of ECMAScript expressions and bindings from within
index 5cdd4df..cc1dc71 100644 (file)
@@ -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"