Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qv4debuggeragent.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qv4debuggeragent.h"
5#include "qv4debugservice.h"
6#include "qv4datacollector.h"
7
8#include <QtCore/qjsonobject.h>
9#include <QtCore/qjsonarray.h>
10
12
14{
15 for (QV4Debugger *debugger : m_debuggers) {
16 if (debugger->state() == QV4Debugger::Paused)
17 return debugger;
18 }
19 return nullptr;
20}
21
23{
24 // "running" means none of the engines are paused.
25 return pausedDebugger() == nullptr;
26}
27
29{
30 Q_UNUSED(reason);
31
32 debugger->collector()->clear();
33
34 QJsonObject event, body, script;
35 event.insert(QStringLiteral("type"), QStringLiteral("event"));
36
37 switch (reason) {
41 event.insert(QStringLiteral("event"), QStringLiteral("break"));
43 if (!frame)
44 break;
45
46 body.insert(QStringLiteral("invocationText"), frame->function());
47 body.insert(QStringLiteral("sourceLine"), qAbs(frame->lineNumber()) - 1);
48// if (frame->column > 0)
49// body.insert(QStringLiteral("sourceColumn"), frame->column);
50 QJsonArray breakPoints;
51 const QList<int> ids = breakPointIds(frame->source(), frame->lineNumber());
52 for (int breakPointId : ids)
53 breakPoints.push_back(breakPointId);
54 body.insert(QStringLiteral("breakpoints"), breakPoints);
55 script.insert(QStringLiteral("name"), frame->source());
56 } break;
58 // TODO: complete this!
59 event.insert(QStringLiteral("event"), QStringLiteral("exception"));
60 break;
61 }
62
63 if (!script.isEmpty())
64 body.insert(QStringLiteral("script"), script);
65 if (!body.isEmpty())
66 event.insert(QStringLiteral("body"), body);
67 m_debugService->send(event);
68}
69
71{
72 Q_ASSERT(!m_debuggers.contains(debugger));
73 m_debuggers << debugger;
74
75 debugger->setBreakOnThrow(m_breakOnThrow);
76
77 for (const BreakPoint &breakPoint : std::as_const(m_breakPoints))
78 if (breakPoint.enabled)
79 debugger->addBreakPoint(breakPoint.fileName, breakPoint.lineNr, breakPoint.condition);
80
84}
85
92
93const QList<QV4Debugger *> &QV4DebuggerAgent::debuggers()
94{
95 return m_debuggers;
96}
97
99{
100 m_debuggers.removeAll(static_cast<QV4Debugger *>(debugger));
101}
102
104{
105 debugger->pause();
106}
107
109{
110 for (QV4Debugger *debugger : m_debuggers)
111 pause(debugger);
112}
113
115{
116 for (QV4Debugger *debugger : m_debuggers)
117 if (debugger->state() == QV4Debugger::Paused)
118 debugger->resume(QV4Debugger::FullThrottle);
119}
120
122{
123 if (enabled) {
124 for (QV4Debugger *debugger : std::as_const(m_debuggers))
125 debugger->addBreakPoint(fileName, lineNumber, condition);
126 }
127
128 const int id = ++m_lastBreakPointId;
129 m_breakPoints.insert(id, BreakPoint(fileName, lineNumber, enabled, condition));
130 return id;
131}
132
134{
135 BreakPoint breakPoint = m_breakPoints.value(id);
136 if (!breakPoint.isValid())
137 return;
138
139 m_breakPoints.remove(id);
140
141 if (breakPoint.enabled)
142 for (QV4Debugger *debugger : std::as_const(m_debuggers))
143 debugger->removeBreakPoint(breakPoint.fileName, breakPoint.lineNr);
144}
145
147{
148 for (auto it = m_breakPoints.keyBegin(), end = m_breakPoints.keyEnd(); it != end; ++it)
150}
151
153{
154 BreakPoint &breakPoint = m_breakPoints[id];
155 if (!breakPoint.isValid() || breakPoint.enabled == onoff)
156 return;
157 breakPoint.enabled = onoff;
158
159 for (QV4Debugger *debugger : std::as_const(m_debuggers)) {
160 if (onoff)
161 debugger->addBreakPoint(breakPoint.fileName, breakPoint.lineNr, breakPoint.condition);
162 else
163 debugger->removeBreakPoint(breakPoint.fileName, breakPoint.lineNr);
164 }
165}
166
167QList<int> QV4DebuggerAgent::breakPointIds(const QString &fileName, int lineNumber) const
168{
169 QList<int> ids;
170
171 for (QHash<int, BreakPoint>::const_iterator i = m_breakPoints.begin(), ei = m_breakPoints.end(); i != ei; ++i)
172 if (i->lineNr == lineNumber && fileName.endsWith(i->fileName))
173 ids.push_back(i.key());
174
175 return ids;
176}
177
179{
180 if (onoff != m_breakOnThrow) {
181 m_breakOnThrow = onoff;
182 for (QV4Debugger *debugger : std::as_const(m_debuggers))
183 debugger->setBreakOnThrow(onoff);
184 }
185}
186
188{
189 for (QV4Debugger *debugger : std::as_const(m_debuggers))
190 debugger->clearPauseRequest();
191}
192
194
195#include "moc_qv4debuggeragent.cpp"
\inmodule QtCore
Definition qhash.h:1145
key_iterator keyEnd() const noexcept
Definition qhash.h:1221
bool remove(const Key &key)
Removes the item that has the key from the hash.
Definition qhash.h:958
iterator begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in the hash.
Definition qhash.h:1212
key_iterator keyBegin() const noexcept
Definition qhash.h:1220
T value(const Key &key) const noexcept
Definition qhash.h:1054
iterator end() noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the last ...
Definition qhash.h:1216
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition qhash.h:1303
\inmodule QtCore\reentrant
Definition qjsonarray.h:18
\inmodule QtCore\reentrant
Definition qjsonobject.h:20
iterator insert(const QString &key, const QJsonValue &value)
Inserts a new item with the key key and a value of value.
bool isEmpty() const
Returns true if the object is empty.
void push_back(parameter_type t)
Definition qlist.h:675
qsizetype removeAll(const AT &t)
Definition qlist.h:592
\inmodule QtCore
Definition qobject.h:103
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
void send(QJsonObject v4Payload)
void setBreakOnThrow(bool onoff)
QV4Debugger * pausedDebugger() const
const QList< QV4Debugger * > & debuggers()
QList< int > breakPointIds(const QString &fileName, int lineNumber) const
void handleDebuggerDeleted(QObject *debugger)
int addBreakPoint(const QString &fileName, int lineNumber, bool enabled=true, const QString &condition=QString())
void addDebugger(QV4Debugger *debugger)
void removeDebugger(QV4Debugger *debugger)
void pause(QV4Debugger *debugger) const
void removeBreakPoint(int id)
void enableBreakPoint(int id, bool onoff)
void debuggerPaused(QV4Debugger *debugger, QV4Debugger::PauseReason reason)
QV4::ExecutionEngine * engine() const
void debuggerPaused(QV4Debugger *self, QV4Debugger::PauseReason reason)
void setBreakOnThrow(bool onoff)
const QV4DataCollector * collector() const
void addBreakPoint(const QString &fileName, int lineNumber, const QString &condition=QString())
QSet< QString >::iterator it
Combined button and popup list for selecting options.
@ QueuedConnection
constexpr T qAbs(const T &t)
Definition qnumeric.h:328
GLenum condition
GLuint GLuint end
GLenum GLenum GLsizei const GLuint * ids
GLenum GLuint id
[7]
GLenum GLenum GLsizei const GLuint GLboolean enabled
struct _cl_event * event
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define QStringLiteral(str)
#define Q_UNUSED(x)
myObject disconnect()
[26]
QFrame frame
[0]
bool contains(const AT &t) const noexcept
Definition qlist.h:45
CppStackFrame * currentStackFrame