aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-07-10 15:44:11 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-07-12 10:11:10 +0200
commit8cfba7d01567f0c37afb98573a6505e187986a7a (patch)
tree9ec2245da734e57de6f38ed38385b21d06479e75 /src
parent4379bae227f3212bc4253b919d3ccc8865b80ebf (diff)
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 <erik.verbruggen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/imports/localstorage/plugin.cpp1
-rw-r--r--src/qml/qml/qqmljavascriptexpression_p.h1
-rw-r--r--src/qml/qml/v4/moth/qv4vme_moth.cpp1
-rw-r--r--src/qml/qml/v4/qv4engine.cpp33
-rw-r--r--src/qml/qml/v4/qv4engine_p.h19
-rw-r--r--src/qml/qml/v4/qv4exception.cpp122
-rw-r--r--src/qml/qml/v4/qv4exception_p.h78
-rw-r--r--src/qml/qml/v4/qv4functionobject.cpp1
-rw-r--r--src/qml/qml/v4/qv4globalobject.cpp1
-rw-r--r--src/qml/qml/v4/qv4include.cpp1
-rw-r--r--src/qml/qml/v4/qv4isel_masm.cpp1
-rw-r--r--src/qml/qml/v4/qv4runtime.cpp35
-rw-r--r--src/qml/qml/v4/qv4script.cpp1
-rw-r--r--src/qml/qml/v4/qv4value.cpp1
-rw-r--r--src/qml/qml/v4/v4.pri6
-rw-r--r--src/qml/qml/v8/qjsengine.cpp1
-rw-r--r--src/qml/qml/v8/qjsvalue.cpp1
-rw-r--r--src/qml/qml/v8/qjsvalueiterator.cpp1
18 files changed, 218 insertions, 87 deletions
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 <private/qv4object_p.h>
#include <private/qv4functionobject_p.h>
#include <private/qv4objectproto_p.h>
+#include <private/qv4exception_p.h>
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 <QtQml/qqmlerror.h>
#include <private/qqmlengine_p.h>
#include <private/qpointervaluepair_p.h>
+#include <private/qv4exception_p.h>
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 <private/qv4value_p.h>
#include <private/qv4debugging_p.h>
+#include <private/qv4exception_p.h>
#include <iostream>
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 <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
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 <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
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 <private/qqmljsengine_p.h>
#include <private/qqmljslexer_p.h>
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 <private/qqmljsengine_p.h>
#include <private/qqmljslexer_p.h>
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 <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
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 <assembler/LinkBuffer.h>
#include <WTFStubs.h>
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 <QtCore/qmath.h>
@@ -62,11 +61,6 @@
#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)
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 <private/qqmljsengine_p.h>
#include <private/qqmljslexer_p.h>
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 <qv4object_p.h>
#include <qv4objectproto_p.h>
#include "qv4mm_p.h"
+#include "qv4exception_p.h"
#include <wtf/MathExtras.h>
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 <QtCore/qdatetime.h>
#include <QtCore/qmetaobject.h>
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 <private/qv4mm_p.h>
+#include <private/qv4exception_p.h>
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