10 m_functionCallPos(0), m_memoryPos(0)
13 engine->setProfiler(
new QV4::Profiling::Profiler(engine));
14 connect(
this, &QQmlAbstractProfilerAdapter::profilingEnabled,
15 this, &QV4ProfilerAdapter::forwardEnabled);
16 connect(
this, &QQmlAbstractProfilerAdapter::profilingEnabledWhileWaiting,
17 this, &QV4ProfilerAdapter::forwardEnabledWhileWaiting, Qt::DirectConnection);
18 connect(
this, &QV4ProfilerAdapter::v4ProfilingEnabled,
19 engine->profiler(), &QV4::Profiling::Profiler::startProfiling);
20 connect(
this, &QV4ProfilerAdapter::v4ProfilingEnabledWhileWaiting,
21 engine->profiler(), &QV4::Profiling::Profiler::startProfiling, Qt::DirectConnection);
22 connect(
this, &QQmlAbstractProfilerAdapter::profilingDisabled,
23 engine->profiler(), &QV4::Profiling::Profiler::stopProfiling);
24 connect(
this, &QQmlAbstractProfilerAdapter::profilingDisabledWhileWaiting,
25 engine->profiler(), &QV4::Profiling::Profiler::stopProfiling,
26 Qt::DirectConnection);
27 connect(
this, &QQmlAbstractProfilerAdapter::dataRequested,
28 engine->profiler(), &QV4::Profiling::Profiler::reportData);
29 connect(
this, &QQmlAbstractProfilerAdapter::referenceTimeKnown,
30 engine->profiler(), &QV4::Profiling::Profiler::setTimer);
31 connect(engine->profiler(), &QV4::Profiling::Profiler::dataReady,
32 this, &QV4ProfilerAdapter::receiveData);
62 memoryNext = appendMemoryEvents(qMin(callNext, until), messages, d);
79 const QVector<QV4::Profiling::FunctionCallProperties> &functionCallData = m_functionCallData;
82 while (!m_stack.isEmpty() &&
83 (m_functionCallPos == functionCallData.size() ||
84 m_stack.top() <= functionCallData[m_functionCallPos].start)) {
85 if (m_stack.top() > until || messages.size() > s_numMessagesPerBatch)
86 return finalizeMessages(until, messages, m_stack.top(), d);
88 appendMemoryEvents(m_stack.top(), messages, d);
89 d << m_stack.pop() <<
int(RangeEnd) <<
int(Javascript);
90 messages.append(d.squeezedData());
93 while (m_functionCallPos != functionCallData.size() &&
94 (m_stack.empty() || functionCallData[m_functionCallPos].start < m_stack.top())) {
95 const QV4::Profiling::FunctionCallProperties &props =
96 functionCallData[m_functionCallPos];
97 if (props.start > until || messages.size() > s_numMessagesPerBatch)
98 return finalizeMessages(until, messages, props.start, d);
100 appendMemoryEvents(props.start, messages, d);
101 auto location = m_functionLocations.constFind(props.id);
103 d << props.start <<
int(RangeStart) <<
int(Javascript) <<
static_cast<qint64>(props.id);
104 if (location != m_functionLocations.cend()) {
105 messages.push_back(d.squeezedData());
107 d << props.start <<
int(RangeLocation) <<
int(Javascript) << location->file << location->line
108 << location->column <<
static_cast<qint64>(props.id);
109 messages.push_back(d.squeezedData());
111 d << props.start <<
int(RangeData) <<
int(Javascript) << location->name
112 <<
static_cast<qint64>(props.id);
113 m_functionLocations.erase(location);
115 messages.push_back(d.squeezedData());
117 m_stack.push(props.end);
120 if (m_stack.empty() && m_functionCallPos == functionCallData.size())
121 return finalizeMessages(until, messages, -1, d);
126 const QV4::Profiling::FunctionLocationHash &locations,
127 const QVector<QV4::Profiling::FunctionCallProperties> &functionCallData,
128 const QVector<QV4::Profiling::MemoryAllocationProperties> &memoryData)
132 if (m_functionLocations.isEmpty())
133 m_functionLocations = locations;
135 m_functionLocations.insert(locations);
137 if (m_functionCallData.isEmpty())
138 m_functionCallData = functionCallData;
140 m_functionCallData.append(functionCallData);
142 if (m_memoryData.isEmpty())
143 m_memoryData = memoryData;
145 m_memoryData.append(memoryData);
147 service->dataReady(
this);