OpenCoverage

qqmlprofilerevent.cpp

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/qmldebug/qqmlprofilerevent.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2017 The Qt Company Ltd.-
4** Contact: https://www.qt.io/licensing/-
5**-
6** This file is part of the QtQml module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL$-
9** Commercial License Usage-
10** Licensees holding valid commercial Qt licenses may use this file in-
11** accordance with the commercial license agreement provided with the-
12** Software or, alternatively, in accordance with the terms contained in-
13** a written agreement between you and The Qt Company. For licensing terms-
14** and conditions see https://www.qt.io/terms-conditions. For further-
15** information use the contact form at https://www.qt.io/contact-us.-
16**-
17** GNU Lesser General Public License Usage-
18** Alternatively, this file may be used under the terms of the GNU Lesser-
19** General Public License version 3 as published by the Free Software-
20** Foundation and appearing in the file LICENSE.LGPL3 included in the-
21** packaging of this file. Please review the following information to-
22** ensure the GNU Lesser General Public License version 3 requirements-
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.-
24**-
25** GNU General Public License Usage-
26** Alternatively, this file may be used under the terms of the GNU-
27** General Public License version 2.0 or (at your option) the GNU General-
28** Public license version 3 or any later version approved by the KDE Free-
29** Qt Foundation. The licenses are as published by the Free Software-
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3-
31** included in the packaging of this file. Please review the following-
32** information to ensure the GNU General Public License requirements will-
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and-
34** https://www.gnu.org/licenses/gpl-3.0.html.-
35**-
36** $QT_END_LICENSE$-
37**-
38****************************************************************************/-
39-
40#include "qqmlprofilerevent_p.h"-
41#include <QtCore/qdatastream.h>-
42-
43QT_BEGIN_NAMESPACE-
44-
45bool operator==(const QQmlProfilerEvent &event1, const QQmlProfilerEvent &event2)-
46{-
47 if (event1.timestamp() != event2.timestamp() || event1.typeIndex() != event2.typeIndex())
event1.timesta...t2.timestamp()Description
TRUEnever evaluated
FALSEnever evaluated
event1.typeInd...t2.typeIndex()Description
TRUEnever evaluated
FALSEnever evaluated
0
48 return false;
never executed: return false;
0
49-
50 // This is not particularly efficient, but we also don't need to do this very often.-
51 return event1.numbers<QVarLengthArray<qint64>>() == event2.numbers<QVarLengthArray<qint64>>();
never executed: return event1.numbers<QVarLengthArray<qint64>>() == event2.numbers<QVarLengthArray<qint64>>();
0
52}-
53-
54bool operator!=(const QQmlProfilerEvent &event1, const QQmlProfilerEvent &event2)-
55{-
56 return !(event1 == event2);
never executed: return !(event1 == event2);
0
57}-
58-
59enum SerializationType {-
60 OneByte = 0,-
61 TwoByte = 1,-
62 FourByte = 2,-
63 EightByte = 3,-
64 TypeMask = 0x3-
65};-
66-
67enum SerializationTypeOffset {-
68 TimestampOffset = 0,-
69 TypeIndexOffset = 2,-
70 DataLengthOffset = 4,-
71 DataOffset = 6-
72};-
73-
74template<typename Number>-
75static inline void readNumbers(QDataStream &stream, Number *data, quint16 length)-
76{-
77 for (quint16 i = 0; i != length; ++i)
i != lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
78 stream >> data[i];
never executed: stream >> data[i];
0
79}
never executed: end of block
0
80-
81template<typename Number>-
82static inline Number readNumber(QDataStream &stream, qint8 type)-
83{-
84 switch (type) {-
85 case OneByte: {
never executed: case OneByte:
0
86 qint8 value;-
87 stream >> value;-
88 return static_cast<Number>(value);
never executed: return static_cast<Number>(value);
0
89 }-
90 case TwoByte: {
never executed: case TwoByte:
0
91 qint16 value;-
92 stream >> value;-
93 return static_cast<Number>(value);
never executed: return static_cast<Number>(value);
0
94 }-
95 case FourByte: {
never executed: case FourByte:
0
96 qint32 value;-
97 stream >> value;-
98 return static_cast<Number>(value);
never executed: return static_cast<Number>(value);
0
99 }-
100 case EightByte: {
never executed: case EightByte:
0
101 qint64 value;-
102 stream >> value;-
103 return static_cast<Number>(value);
never executed: return static_cast<Number>(value);
0
104 }-
105 default:
never executed: default:
0
106 Q_UNREACHABLE();-
107 return 0;
never executed: return 0;
0
108 }-
109}-
110-
111QDataStream &operator>>(QDataStream &stream, QQmlProfilerEvent &event)-
112{-
113 qint8 type;-
114 stream >> type;-
115-
116 event.m_timestamp = readNumber<qint64>(stream, (type >> TimestampOffset) & TypeMask);-
117 event.m_typeIndex = readNumber<qint32>(stream, (type >> TypeIndexOffset) & TypeMask);-
118 event.m_dataLength = readNumber<quint16>(stream, (type >> DataLengthOffset) & TypeMask);-
119-
120 uint bytesPerNumber = 1 << ((type >> DataOffset) & TypeMask);-
121-
122 if (event.m_dataLength * bytesPerNumber > sizeof(event.m_data)) {
event.m_dataLe...(event.m_data)Description
TRUEnever evaluated
FALSEnever evaluated
0
123 event.m_dataType = static_cast<QQmlProfilerEvent::Type>((bytesPerNumber * 8)-
124 | QQmlProfilerEvent::External);-
125 event.m_data.external = malloc(event.m_dataLength * bytesPerNumber);-
126 } else {
never executed: end of block
0
127 event.m_dataType = static_cast<QQmlProfilerEvent::Type>(bytesPerNumber * 8);-
128 }
never executed: end of block
0
129-
130 switch (event.m_dataType) {-
131 case QQmlProfilerEvent::Inline8Bit:
never executed: case QQmlProfilerEvent::Inline8Bit:
0
132 readNumbers<qint8>(stream, event.m_data.internal8bit, event.m_dataLength);-
133 break;
never executed: break;
0
134 case QQmlProfilerEvent::External8Bit:
never executed: case QQmlProfilerEvent::External8Bit:
0
135 readNumbers<qint8>(stream, static_cast<qint8 *>(event.m_data.external),-
136 event.m_dataLength);-
137 break;
never executed: break;
0
138 case QQmlProfilerEvent::Inline16Bit:
never executed: case QQmlProfilerEvent::Inline16Bit:
0
139 readNumbers<qint16>(stream, event.m_data.internal16bit, event.m_dataLength);-
140 break;
never executed: break;
0
141 case QQmlProfilerEvent::External16Bit:
never executed: case QQmlProfilerEvent::External16Bit:
0
142 readNumbers<qint16>(stream, static_cast<qint16 *>(event.m_data.external),-
143 event.m_dataLength);-
144 break;
never executed: break;
0
145 case QQmlProfilerEvent::Inline32Bit:
never executed: case QQmlProfilerEvent::Inline32Bit:
0
146 readNumbers<qint32>(stream, event.m_data.internal32bit, event.m_dataLength);-
147 break;
never executed: break;
0
148 case QQmlProfilerEvent::External32Bit:
never executed: case QQmlProfilerEvent::External32Bit:
0
149 readNumbers<qint32>(stream, static_cast<qint32 *>(event.m_data.external),-
150 event.m_dataLength);-
151 break;
never executed: break;
0
152 case QQmlProfilerEvent::Inline64Bit:
never executed: case QQmlProfilerEvent::Inline64Bit:
0
153 readNumbers<qint64>(stream, event.m_data.internal64bit, event.m_dataLength);-
154 break;
never executed: break;
0
155 case QQmlProfilerEvent::External64Bit:
never executed: case QQmlProfilerEvent::External64Bit:
0
156 readNumbers<qint64>(stream, static_cast<qint64 *>(event.m_data.external),-
157 event.m_dataLength);-
158 break;
never executed: break;
0
159 default:
never executed: default:
0
160 Q_UNREACHABLE();-
161 break;
never executed: break;
0
162 }-
163-
164 return stream;
never executed: return stream;
0
165}-
166-
167static inline qint8 minimumType(const QQmlProfilerEvent &event, quint16 length,-
168 quint16 origBitsPerNumber)-
169{-
170 qint8 type = OneByte;-
171 bool ok = true;-
172 for (quint16 i = 0; i < length;) {
i < lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
173 if ((1 << type) == origBitsPerNumber / 8)
(1 << type) ==...sPerNumber / 8Description
TRUEnever evaluated
FALSEnever evaluated
0
174 return type;
never executed: return type;
0
175 switch (type) {-
176 case OneByte:
never executed: case OneByte:
0
177 ok = (event.number<qint8>(i) == event.number<qint64>(i));-
178 break;
never executed: break;
0
179 case TwoByte:
never executed: case TwoByte:
0
180 ok = (event.number<qint16>(i) == event.number<qint64>(i));-
181 break;
never executed: break;
0
182 case FourByte:
never executed: case FourByte:
0
183 ok = (event.number<qint32>(i) == event.number<qint64>(i));-
184 break;
never executed: break;
0
185 default:
never executed: default:
0
186 // EightByte isn't possible, as (1 << type) == origBitsPerNumber / 8 then.-
187 Q_UNREACHABLE();-
188 break;
never executed: break;
0
189 }-
190-
191 if (ok)
okDescription
TRUEnever evaluated
FALSEnever evaluated
0
192 ++i;
never executed: ++i;
0
193 else-
194 ++type;
never executed: ++type;
0
195 }-
196 return type;
never executed: return type;
0
197}-
198-
199template<typename Number>-
200static inline qint8 minimumType(Number number)-
201{-
202 if (static_cast<qint8>(number) == number)
static_cast<qi...ber) == numberDescription
TRUEnever evaluated
FALSEnever evaluated
0
203 return OneByte;
never executed: return OneByte;
0
204 if (static_cast<qint16>(number) == number)
static_cast<qi...ber) == numberDescription
TRUEnever evaluated
FALSEnever evaluated
0
205 return TwoByte;
never executed: return TwoByte;
0
206 if (static_cast<qint32>(number) == number)
static_cast<qi...ber) == numberDescription
TRUEnever evaluated
FALSEnever evaluated
0
207 return FourByte;
never executed: return FourByte;
0
208 return EightByte;
never executed: return EightByte;
0
209}-
210-
211template<typename Number>-
212static inline void writeNumbers(QDataStream &stream, const QQmlProfilerEvent &event, quint16 length)-
213{-
214 for (quint16 i = 0; i != length; ++i)
i != lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
215 stream << event.number<Number>(i);
never executed: stream << event.number<Number>(i);
0
216}
never executed: end of block
0
217-
218template<typename Number>-
219static inline void writeNumber(QDataStream &stream, Number number, qint8 type)-
220{-
221 switch (type) {-
222 case OneByte:
never executed: case OneByte:
0
223 stream << static_cast<qint8>(number);-
224 break;
never executed: break;
0
225 case TwoByte:
never executed: case TwoByte:
0
226 stream << static_cast<qint16>(number);-
227 break;
never executed: break;
0
228 case FourByte:
never executed: case FourByte:
0
229 stream << static_cast<qint32>(number);-
230 break;
never executed: break;
0
231 case EightByte:
never executed: case EightByte:
0
232 stream << static_cast<qint64>(number);-
233 break;
never executed: break;
0
234 default:
never executed: default:
0
235 Q_UNREACHABLE();-
236 break;
never executed: break;
0
237 }-
238}-
239-
240QDataStream &operator<<(QDataStream &stream, const QQmlProfilerEvent &event)-
241{-
242 qint8 type = minimumType(event.m_timestamp); // << TimestampOffset;-
243 type |= minimumType(event.m_typeIndex) << TypeIndexOffset;-
244 type |= minimumType(event.m_dataLength) << DataLengthOffset;-
245 type |= minimumType(event, event.m_dataLength, event.m_dataType) << DataOffset;-
246 stream << type;-
247-
248 writeNumber(stream, event.m_timestamp, (type >> TimestampOffset) & TypeMask);-
249 writeNumber(stream, event.m_typeIndex, (type >> TypeIndexOffset) & TypeMask);-
250 writeNumber(stream, event.m_dataLength, (type >> DataLengthOffset) & TypeMask);-
251-
252 switch ((type >> DataOffset) & TypeMask) {-
253 case OneByte:
never executed: case OneByte:
0
254 writeNumbers<qint8>(stream, event, event.m_dataLength);-
255 break;
never executed: break;
0
256 case TwoByte:
never executed: case TwoByte:
0
257 writeNumbers<qint16>(stream, event, event.m_dataLength);-
258 break;
never executed: break;
0
259 case FourByte:
never executed: case FourByte:
0
260 writeNumbers<qint32>(stream, event, event.m_dataLength);-
261 break;
never executed: break;
0
262 case EightByte:
never executed: case EightByte:
0
263 writeNumbers<qint64>(stream, event, event.m_dataLength);-
264 break;
never executed: break;
0
265 default:
never executed: default:
0
266 Q_UNREACHABLE();-
267 break;
never executed: break;
0
268 }-
269-
270 return stream;
never executed: return stream;
0
271}-
272-
273QT_END_NAMESPACE-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.0