11 m_functionCallPos(0), m_memoryPos(0)
14 engine->setProfiler(
new QV4::Profiling::Profiler(engine));
15 connect(
this, &QQmlAbstractProfilerAdapter::profilingEnabled,
16 this, &QV4ProfilerAdapter::forwardEnabled);
17 connect(
this, &QQmlAbstractProfilerAdapter::profilingEnabledWhileWaiting,
18 this, &QV4ProfilerAdapter::forwardEnabledWhileWaiting, Qt::DirectConnection);
19 connect(
this, &QV4ProfilerAdapter::v4ProfilingEnabled,
20 engine->profiler(), &QV4::Profiling::Profiler::startProfiling);
21 connect(
this, &QV4ProfilerAdapter::v4ProfilingEnabledWhileWaiting,
22 engine->profiler(), &QV4::Profiling::Profiler::startProfiling, Qt::DirectConnection);
23 connect(
this, &QQmlAbstractProfilerAdapter::profilingDisabled,
24 engine->profiler(), &QV4::Profiling::Profiler::stopProfiling);
25 connect(
this, &QQmlAbstractProfilerAdapter::profilingDisabledWhileWaiting,
26 engine->profiler(), &QV4::Profiling::Profiler::stopProfiling,
27 Qt::DirectConnection);
28 connect(
this, &QQmlAbstractProfilerAdapter::dataRequested,
29 engine->profiler(), &QV4::Profiling::Profiler::reportData);
30 connect(
this, &QQmlAbstractProfilerAdapter::referenceTimeKnown,
31 engine->profiler(), &QV4::Profiling::Profiler::setTimer);
32 connect(engine->profiler(), &QV4::Profiling::Profiler::dataReady,
33 this, &QV4ProfilerAdapter::receiveData);
63 memoryNext = appendMemoryEvents(qMin(callNext, until), messages, d);
80 const QVector<QV4::Profiling::FunctionCallProperties> &functionCallData = m_functionCallData;
83 while (!m_stack.isEmpty() &&
84 (m_functionCallPos == functionCallData.size() ||
85 m_stack.top() <= functionCallData[m_functionCallPos].start)) {
86 if (m_stack.top() > until || messages.size() > s_numMessagesPerBatch)
87 return finalizeMessages(until, messages, m_stack.top(), d);
89 appendMemoryEvents(m_stack.top(), messages, d);
90 d << m_stack.pop() <<
int(RangeEnd) <<
int(Javascript);
91 messages.append(d.squeezedData());
94 while (m_functionCallPos != functionCallData.size() &&
95 (m_stack.empty() || functionCallData[m_functionCallPos].start < m_stack.top())) {
96 const QV4::Profiling::FunctionCallProperties &props =
97 functionCallData[m_functionCallPos];
98 if (props.start > until || messages.size() > s_numMessagesPerBatch)
99 return finalizeMessages(until, messages, props.start, d);
101 appendMemoryEvents(props.start, messages, d);
102 auto location = m_functionLocations.constFind(props.id);
104 d << props.start <<
int(RangeStart) <<
int(Javascript) <<
static_cast<qint64>(props.id);
105 if (location != m_functionLocations.cend()) {
106 messages.push_back(d.squeezedData());
108 d << props.start <<
int(RangeLocation) <<
int(Javascript) << location->file << location->line
109 << location->column <<
static_cast<qint64>(props.id);
110 messages.push_back(d.squeezedData());
112 d << props.start <<
int(RangeData) <<
int(Javascript) << location->name
113 <<
static_cast<qint64>(props.id);
114 m_functionLocations.erase(location);
116 messages.push_back(d.squeezedData());
118 m_stack.push(props.end);
121 if (m_stack.empty() && m_functionCallPos == functionCallData.size())
122 return finalizeMessages(until, messages, -1, d);
127 const QV4::Profiling::FunctionLocationHash &locations,
128 const QVector<QV4::Profiling::FunctionCallProperties> &functionCallData,
129 const QVector<QV4::Profiling::MemoryAllocationProperties> &memoryData)
133 if (m_functionLocations.isEmpty())
134 m_functionLocations = locations;
136 m_functionLocations.insert(locations);
138 if (m_functionCallData.isEmpty())
139 m_functionCallData = functionCallData;
141 m_functionCallData.append(functionCallData);
143 if (m_memoryData.isEmpty())
144 m_memoryData = memoryData;
146 m_memoryData.append(memoryData);
148 service->dataReady(
this);