6#include <private/qv4mm_p.h>
7#include <private/qv4string_p.h>
14FunctionLocation FunctionCall::resolveLocation()
const
16 return FunctionLocation(m_function->name()->toQString(),
17 m_function->executableCompilationUnit()->fileName(),
18 m_function->compiledFunction->location.line(),
19 m_function->compiledFunction->location.column());
22FunctionCallProperties FunctionCall::properties()
const
24 FunctionCallProperties props = {
27 reinterpret_cast<quintptr>(m_function)
32Profiler::Profiler(QV4::ExecutionEngine *engine) : featuresEnabled(0), m_engine(engine)
34 static const int metatypes[] = {
35 qRegisterMetaType<QVector<QV4::Profiling::FunctionCallProperties> >(),
36 qRegisterMetaType<QVector<QV4::Profiling::MemoryAllocationProperties> >(),
37 qRegisterMetaType<FunctionLocationHash>()
43void Profiler::stopProfiling()
47 m_sentLocations.clear();
50bool operator<(
const FunctionCall &call1,
const FunctionCall &call2)
52 return call1.m_start < call2.m_start ||
53 (call1.m_start == call2.m_start && (call1.m_end < call2.m_end ||
54 (call1.m_end == call2.m_end && call1.m_function < call2.m_function)));
57void Profiler::reportData()
59 std::sort(m_data.begin(), m_data.end());
60 QVector<FunctionCallProperties> properties;
61 FunctionLocationHash locations;
62 properties.reserve(m_data.size());
64 for (
const FunctionCall &call : std::as_const(m_data)) {
65 properties.append(call.properties());
66 Function *function = call.function();
68 SentMarker &marker = m_sentLocations[
reinterpret_cast<quintptr>(function)];
69 if (!marker.isValid()) {
70 FunctionLocation &location = locations[properties.constLast().id];
71 if (!location.isValid())
72 location = call.resolveLocation();
73 marker.setFunction(function);
77 emit dataReady(locations, properties, m_memory_data);
79 m_memory_data.clear();
82void Profiler::startProfiling(quint64 features)
84 if (featuresEnabled == 0) {
85 if (features & (1 << FeatureMemoryAllocation)) {
86 qint64 timestamp = m_timer.nsecsElapsed();
87 MemoryAllocationProperties heap = {timestamp,
88 (qint64)m_engine->memoryManager->getAllocatedMem() -
89 (qint64)m_engine->memoryManager->getLargeItemsMem(),
91 m_memory_data.append(heap);
92 MemoryAllocationProperties smallP = {timestamp,
93 (qint64)m_engine->memoryManager->getUsedMem(),
95 m_memory_data.append(smallP);
96 MemoryAllocationProperties large = {timestamp,
97 (qint64)m_engine->memoryManager->getLargeItemsMem(),
99 m_memory_data.append(large);
102 featuresEnabled = features;
111#include "moc_qv4profiling_p.cpp"