json/qjsonparser.cpp

Source codeSwitch to Preprocessed file
LineSource CodeCoverage
1/**************************************************************************** -
2** -
3** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -
4** Contact: http://www.qt-project.org/legal -
5** -
6** This file is part of the QtCore 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 Digia. For licensing terms and -
14** conditions see http://qt.digia.com/licensing. For further information -
15** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software -
20** Foundation and appearing in the file LICENSE.LGPL included in the -
21** packaging of this file. Please review the following information to -
22** ensure the GNU Lesser General Public License version 2.1 requirements -
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -
24** -
25** In addition, as a special exception, Digia gives you certain additional -
26** rights. These rights are described in the Digia Qt LGPL Exception -
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -
28** -
29** GNU General Public License Usage -
30** Alternatively, this file may be used under the terms of the GNU -
31** General Public License version 3.0 as published by the Free Software -
32** Foundation and appearing in the file LICENSE.GPL included in the -
33** packaging of this file. Please review the following information to -
34** ensure the GNU General Public License version 3.0 requirements will be -
35** met: http://www.gnu.org/copyleft/gpl.html. -
36** -
37** -
38** $QT_END_LICENSE$ -
39** -
40****************************************************************************/ -
41 -
42#ifndef QT_BOOTSTRAPPED -
43#include <qcoreapplication.h> -
44#endif -
45#include <qdebug.h> -
46#include "qjsonparser_p.h" -
47#include "qjson_p.h" -
48 -
49//#define PARSER_DEBUG -
50#ifdef PARSER_DEBUG -
51static int indent = 0; -
52#define BEGIN qDebug() << QByteArray(4*indent++, ' ').constData() << "pos=" << current -
53#define END --indent -
54#define DEBUG qDebug() << QByteArray(4*indent, ' ').constData() -
55#else -
56#define BEGIN if (1) ; else qDebug() -
57#define END do {} while (0) -
58#define DEBUG if (1) ; else qDebug() -
59#endif -
60 -
61static const int nestingLimit = 1024; -
62 -
63QT_BEGIN_NAMESPACE -
64 -
65// error strings for the JSON parser -
66#define JSONERR_OK QT_TRANSLATE_NOOP("QJsonParseError", "no error occurred") -
67#define JSONERR_UNTERM_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "unterminated object") -
68#define JSONERR_MISS_NSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing name separator") -
69#define JSONERR_UNTERM_AR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated array") -
70#define JSONERR_MISS_VSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing value separator") -
71#define JSONERR_ILLEGAL_VAL QT_TRANSLATE_NOOP("QJsonParseError", "illegal value") -
72#define JSONERR_END_OF_NUM QT_TRANSLATE_NOOP("QJsonParseError", "invalid termination by number") -
73#define JSONERR_ILLEGAL_NUM QT_TRANSLATE_NOOP("QJsonParseError", "illegal number") -
74#define JSONERR_STR_ESC_SEQ QT_TRANSLATE_NOOP("QJsonParseError", "invalid escape sequence") -
75#define JSONERR_STR_UTF8 QT_TRANSLATE_NOOP("QJsonParseError", "invalid UTF8 string") -
76#define JSONERR_UTERM_STR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated string") -
77#define JSONERR_MISS_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "object is missing after a comma") -
78#define JSONERR_DEEP_NEST QT_TRANSLATE_NOOP("QJsonParseError", "too deeply nested document") -
79 -
80/*! -
81 \class QJsonParseError -
82 \inmodule QtCore -
83 \ingroup json -
84 \reentrant -
85 \since 5.0 -
86 -
87 \brief The QJsonParseError class is used to report errors during JSON parsing. -
88*/ -
89 -
90/*! -
91 \enum QJsonParseError::ParseError -
92 -
93 This enum describes the type of error that occurred during the parsing of a JSON document. -
94 -
95 \value NoError No error occurred -
96 \value UnterminatedObject An object is not correctly terminated with a closing curly bracket -
97 \value MissingNameSeparator A comma separating different items is missing -
98 \value UnterminatedArray The array is not correctly terminated with a closing square bracket -
99 \value MissingValueSeparator A colon separating keys from values inside objects is missing -
100 \value IllegalValue The value is illegal -
101 \value TerminationByNumber The input stream ended while parsing a number -
102 \value IllegalNumber The number is not well formed -
103 \value IllegalEscapeSequence An illegal escape sequence occurred in the input -
104 \value IllegalUTF8String An illegal UTF8 sequence occurred in the input -
105 \value UnterminatedString A string wasn't terminated with a quote -
106 \value MissingObject An object was expected but couldn't be found -
107 \value DeepNesting The JSON document is too deeply nested for the parser to parse it -
108*/ -
109 -
110/*! -
111 \variable QJsonParseError::error -
112 -
113 Contains the type of the parse error. Is equal to QJsonParseError::NoError if the document -
114 was parsed correctly. -
115 -
116 \sa ParseError, errorString() -
117*/ -
118 -
119 -
120/*! -
121 \variable QJsonParseError::offset -
122 -
123 Contains the offset in the input string where the parse error occurred. -
124 -
125 \sa error, errorString() -
126*/ -
127 -
128/*! -
129 Returns the human-readable message appropriate to the reported JSON parsing error. -
130 -
131 \sa error -
132 */ -
133QString QJsonParseError::errorString() const -
134{ -
135 const char *sz = "";
never executed (the execution status of this line is deduced): const char *sz = "";
-
136 switch (error) { -
137 case NoError: -
138 sz = JSONERR_OK;
never executed (the execution status of this line is deduced): sz = "no error occurred";
-
139 break;
never executed: break;
0
140 case UnterminatedObject: -
141 sz = JSONERR_UNTERM_OBJ;
never executed (the execution status of this line is deduced): sz = "unterminated object";
-
142 break;
never executed: break;
0
143 case MissingNameSeparator: -
144 sz = JSONERR_MISS_NSEP;
never executed (the execution status of this line is deduced): sz = "missing name separator";
-
145 break;
never executed: break;
0
146 case UnterminatedArray: -
147 sz = JSONERR_UNTERM_AR;
never executed (the execution status of this line is deduced): sz = "unterminated array";
-
148 break;
never executed: break;
0
149 case MissingValueSeparator: -
150 sz = JSONERR_MISS_VSEP;
never executed (the execution status of this line is deduced): sz = "missing value separator";
-
151 break;
never executed: break;
0
152 case IllegalValue: -
153 sz = JSONERR_ILLEGAL_VAL;
never executed (the execution status of this line is deduced): sz = "illegal value";
-
154 break;
never executed: break;
0
155 case TerminationByNumber: -
156 sz = JSONERR_END_OF_NUM;
never executed (the execution status of this line is deduced): sz = "invalid termination by number";
-
157 break;
never executed: break;
0
158 case IllegalNumber: -
159 sz = JSONERR_ILLEGAL_NUM;
never executed (the execution status of this line is deduced): sz = "illegal number";
-
160 break;
never executed: break;
0
161 case IllegalEscapeSequence: -
162 sz = JSONERR_STR_ESC_SEQ;
never executed (the execution status of this line is deduced): sz = "invalid escape sequence";
-
163 break;
never executed: break;
0
164 case IllegalUTF8String: -
165 sz = JSONERR_STR_UTF8;
never executed (the execution status of this line is deduced): sz = "invalid UTF8 string";
-
166 break;
never executed: break;
0
167 case UnterminatedString: -
168 sz = JSONERR_UTERM_STR;
never executed (the execution status of this line is deduced): sz = "unterminated string";
-
169 break;
never executed: break;
0
170 case MissingObject: -
171 sz = JSONERR_MISS_OBJ;
never executed (the execution status of this line is deduced): sz = "object is missing after a comma";
-
172 break;
never executed: break;
0
173 case DeepNesting: -
174 sz = JSONERR_DEEP_NEST;
never executed (the execution status of this line is deduced): sz = "too deeply nested document";
-
175 break;
never executed: break;
0
176 } -
177#ifndef QT_BOOTSTRAPPED -
178 return QCoreApplication::translate("QJsonParseError", sz);
never executed: return QCoreApplication::translate("QJsonParseError", sz);
0
179#else -
180 return QLatin1String(sz); -
181#endif -
182} -
183 -
184using namespace QJsonPrivate; -
185 -
186Parser::Parser(const char *json, int length) -
187 : head(json), json(json), data(0), dataLength(0), current(0), nestingLevel(0), lastError(QJsonParseError::NoError) -
188{ -
189 end = json + length;
executed (the execution status of this line is deduced): end = json + length;
-
190}
executed: }
Execution Count:88
88
191 -
192 -
193 -
194/* -
195 -
196begin-array = ws %x5B ws ; [ left square bracket -
197 -
198begin-object = ws %x7B ws ; { left curly bracket -
199 -
200end-array = ws %x5D ws ; ] right square bracket -
201 -
202end-object = ws %x7D ws ; } right curly bracket -
203 -
204name-separator = ws %x3A ws ; : colon -
205 -
206value-separator = ws %x2C ws ; , comma -
207 -
208Insignificant whitespace is allowed before or after any of the six -
209structural characters. -
210 -
211ws = *( -
212 %x20 / ; Space -
213 %x09 / ; Horizontal tab -
214 %x0A / ; Line feed or New line -
215 %x0D ; Carriage return -
216 ) -
217 -
218*/ -
219 -
220enum { -
221 Space = 0x20, -
222 Tab = 0x09, -
223 LineFeed = 0x0a, -
224 Return = 0x0d, -
225 BeginArray = 0x5b, -
226 BeginObject = 0x7b, -
227 EndArray = 0x5d, -
228 EndObject = 0x7d, -
229 NameSeparator = 0x3a, -
230 ValueSeparator = 0x2c, -
231 Quote = 0x22 -
232}; -
233 -
234void Parser::eatBOM() -
235{ -
236 // eat UTF-8 byte order mark -
237 uchar utf8bom[3] = { 0xef, 0xbb, 0xbf };
executed (the execution status of this line is deduced): uchar utf8bom[3] = { 0xef, 0xbb, 0xbf };
-
238 if (end - json > 3 &&
evaluated: end - json > 3
TRUEFALSE
yes
Evaluation Count:86
yes
Evaluation Count:2
2-86
239 (uchar)json[0] == utf8bom[0] &&
evaluated: (uchar)json[0] == utf8bom[0]
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:85
1-85
240 (uchar)json[1] == utf8bom[1] &&
partially evaluated: (uchar)json[1] == utf8bom[1]
TRUEFALSE
yes
Evaluation Count:1
no
Evaluation Count:0
0-1
241 (uchar)json[2] == utf8bom[2])
partially evaluated: (uchar)json[2] == utf8bom[2]
TRUEFALSE
yes
Evaluation Count:1
no
Evaluation Count:0
0-1
242 json += 3;
executed: json += 3;
Execution Count:1
1
243}
executed: }
Execution Count:88
88
244 -
245bool Parser::eatSpace() -
246{ -
247 while (json < end) {
evaluated: json < end
TRUEFALSE
yes
Evaluation Count:67279
yes
Evaluation Count:69
69-67279
248 if (*json > Space)
evaluated: *json > Space
TRUEFALSE
yes
Evaluation Count:48649
yes
Evaluation Count:18630
18630-48649
249 break;
executed: break;
Execution Count:48649
48649
250 if (*json != Space &&
evaluated: *json != Space
TRUEFALSE
yes
Evaluation Count:2317
yes
Evaluation Count:16313
2317-16313
251 *json != Tab &&
partially evaluated: *json != Tab
TRUEFALSE
yes
Evaluation Count:2317
no
Evaluation Count:0
0-2317
252 *json != LineFeed &&
partially evaluated: *json != LineFeed
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:2317
0-2317
253 *json != Return)
never evaluated: *json != Return
0
254 break;
never executed: break;
0
255 ++json;
executed (the execution status of this line is deduced): ++json;
-
256 }
executed: }
Execution Count:18630
18630
257 return (json < end);
executed: return (json < end);
Execution Count:48718
48718
258} -
259 -
260char Parser::nextToken() -
261{ -
262 if (!eatSpace())
evaluated: !eatSpace()
TRUEFALSE
yes
Evaluation Count:2
yes
Evaluation Count:27197
2-27197
263 return 0;
executed: return 0;
Execution Count:2
2
264 char token = *json++;
executed (the execution status of this line is deduced): char token = *json++;
-
265 switch (token) { -
266 case BeginArray: -
267 case BeginObject: -
268 case NameSeparator: -
269 case ValueSeparator: -
270 case EndArray: -
271 case EndObject: -
272 eatSpace();
executed (the execution status of this line is deduced): eatSpace();
-
273 case Quote: -
274 break;
executed: break;
Execution Count:27193
27193
275 default: -
276 token = 0;
executed (the execution status of this line is deduced): token = 0;
-
277 break;
executed: break;
Execution Count:4
4
278 } -
279 return token;
executed: return token;
Execution Count:27197
27197
280} -
281 -
282/* -
283 JSON-text = object / array -
284*/ -
285QJsonDocument Parser::parse(QJsonParseError *error) -
286{ -
287#ifdef PARSER_DEBUG -
288 indent = 0; -
289 qDebug() << ">>>>> parser begin"; -
290#endif -
291 // allocate some space -
292 dataLength = qMax(end - json, (ptrdiff_t) 256);
executed (the execution status of this line is deduced): dataLength = qMax(end - json, (ptrdiff_t) 256);
-
293 data = (char *)malloc(dataLength);
executed (the execution status of this line is deduced): data = (char *)malloc(dataLength);
-
294 -
295 // fill in Header data -
296 QJsonPrivate::Header *h = (QJsonPrivate::Header *)data;
executed (the execution status of this line is deduced): QJsonPrivate::Header *h = (QJsonPrivate::Header *)data;
-
297 h->tag = QJsonDocument::BinaryFormatTag;
executed (the execution status of this line is deduced): h->tag = QJsonDocument::BinaryFormatTag;
-
298 h->version = 1u;
executed (the execution status of this line is deduced): h->version = 1u;
-
299 -
300 current = sizeof(QJsonPrivate::Header);
executed (the execution status of this line is deduced): current = sizeof(QJsonPrivate::Header);
-
301 -
302 eatBOM();
executed (the execution status of this line is deduced): eatBOM();
-
303 char token = nextToken();
executed (the execution status of this line is deduced): char token = nextToken();
-
304 -
305 DEBUG << hex << (uint)token;
executed: ;
Execution Count:88
never executed: QMessageLogger("json/qjsonparser.cpp", 305, __PRETTY_FUNCTION__).debug() << hex << (uint)token;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:88
no
Evaluation Count:0
0-88
306 if (token == BeginArray) {
evaluated: token == BeginArray
TRUEFALSE
yes
Evaluation Count:73
yes
Evaluation Count:15
15-73
307 if (!parseArray())
evaluated: !parseArray()
TRUEFALSE
yes
Evaluation Count:21
yes
Evaluation Count:52
21-52
308 goto error;
executed: goto error;
Execution Count:21
21
309 } else if (token == BeginObject) {
executed: }
Execution Count:52
partially evaluated: token == BeginObject
TRUEFALSE
yes
Evaluation Count:15
no
Evaluation Count:0
0-52
310 if (!parseObject())
evaluated: !parseObject()
TRUEFALSE
yes
Evaluation Count:5
yes
Evaluation Count:10
5-10
311 goto error;
executed: goto error;
Execution Count:5
5
312 } else {
executed: }
Execution Count:10
10
313 lastError = QJsonParseError::IllegalValue;
never executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalValue;
-
314 goto error;
never executed: goto error;
0
315 } -
316 -
317 END;
executed: }
Execution Count:62
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:62
0-62
318 { -
319 if (error) {
evaluated: error
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:59
3-59
320 error->offset = 0;
executed (the execution status of this line is deduced): error->offset = 0;
-
321 error->error = QJsonParseError::NoError;
executed (the execution status of this line is deduced): error->error = QJsonParseError::NoError;
-
322 }
executed: }
Execution Count:3
3
323 QJsonPrivate::Data *d = new QJsonPrivate::Data(data, current);
executed (the execution status of this line is deduced): QJsonPrivate::Data *d = new QJsonPrivate::Data(data, current);
-
324 return QJsonDocument(d);
executed: return QJsonDocument(d);
Execution Count:62
62
325 } -
326 -
327error: -
328#ifdef PARSER_DEBUG -
329 qDebug() << ">>>>> parser error"; -
330#endif -
331 if (error) {
evaluated: error
TRUEFALSE
yes
Evaluation Count:24
yes
Evaluation Count:2
2-24
332 error->offset = json - head;
executed (the execution status of this line is deduced): error->offset = json - head;
-
333 error->error = lastError;
executed (the execution status of this line is deduced): error->error = lastError;
-
334 }
executed: }
Execution Count:24
24
335 free(data);
executed (the execution status of this line is deduced): free(data);
-
336 return QJsonDocument();
executed: return QJsonDocument();
Execution Count:26
26
337} -
338 -
339 -
340void Parser::ParsedObject::insert(uint offset) { -
341 const QJsonPrivate::Entry *newEntry = reinterpret_cast<const QJsonPrivate::Entry *>(parser->data + objectPosition + offset);
executed (the execution status of this line is deduced): const QJsonPrivate::Entry *newEntry = reinterpret_cast<const QJsonPrivate::Entry *>(parser->data + objectPosition + offset);
-
342 int min = 0;
executed (the execution status of this line is deduced): int min = 0;
-
343 int n = offsets.size();
executed (the execution status of this line is deduced): int n = offsets.size();
-
344 while (n > 0) {
evaluated: n > 0
TRUEFALSE
yes
Evaluation Count:7317
yes
Evaluation Count:7418
7317-7418
345 int half = n >> 1;
executed (the execution status of this line is deduced): int half = n >> 1;
-
346 int middle = min + half;
executed (the execution status of this line is deduced): int middle = min + half;
-
347 if (*entryAt(middle) >= *newEntry) {
evaluated: *entryAt(middle) >= *newEntry
TRUEFALSE
yes
Evaluation Count:3732
yes
Evaluation Count:3585
3585-3732
348 n = half;
executed (the execution status of this line is deduced): n = half;
-
349 } else {
executed: }
Execution Count:3732
3732
350 min = middle + 1;
executed (the execution status of this line is deduced): min = middle + 1;
-
351 n -= half + 1;
executed (the execution status of this line is deduced): n -= half + 1;
-
352 }
executed: }
Execution Count:3585
3585
353 } -
354 if (min < offsets.size() && *entryAt(min) == *newEntry) {
evaluated: min < offsets.size()
TRUEFALSE
yes
Evaluation Count:2442
yes
Evaluation Count:4976
evaluated: *entryAt(min) == *newEntry
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:2441
1-4976
355 offsets[min] = offset;
executed (the execution status of this line is deduced): offsets[min] = offset;
-
356 } else {
executed: }
Execution Count:1
1
357 offsets.insert(min, offset);
executed (the execution status of this line is deduced): offsets.insert(min, offset);
-
358 }
executed: }
Execution Count:7417
7417
359} -
360 -
361/* -
362 object = begin-object [ member *( value-separator member ) ] -
363 end-object -
364*/ -
365 -
366bool Parser::parseObject() -
367{ -
368 if (++nestingLevel > nestingLimit) {
evaluated: ++nestingLevel > nestingLimit
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:4179
1-4179
369 lastError = QJsonParseError::DeepNesting;
executed (the execution status of this line is deduced): lastError = QJsonParseError::DeepNesting;
-
370 return false;
executed: return false;
Execution Count:1
1
371 } -
372 -
373 int objectOffset = reserveSpace(sizeof(QJsonPrivate::Object));
executed (the execution status of this line is deduced): int objectOffset = reserveSpace(sizeof(QJsonPrivate::Object));
-
374 BEGIN << "parseObject pos=" << objectOffset << current << json;
executed: ;
Execution Count:4179
never executed: QMessageLogger("json/qjsonparser.cpp", 374, __PRETTY_FUNCTION__).debug() << "parseObject pos=" << objectOffset << current << json;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:4179
no
Evaluation Count:0
0-4179
375 -
376 ParsedObject parsedObject(this, objectOffset);
executed (the execution status of this line is deduced): ParsedObject parsedObject(this, objectOffset);
-
377 -
378 char token = nextToken();
executed (the execution status of this line is deduced): char token = nextToken();
-
379 while (token == Quote) {
evaluated: token == Quote
TRUEFALSE
yes
Evaluation Count:8442
yes
Evaluation Count:14
14-8442
380 int off = current - objectOffset;
executed (the execution status of this line is deduced): int off = current - objectOffset;
-
381 if (!parseMember(objectOffset))
evaluated: !parseMember(objectOffset)
TRUEFALSE
yes
Evaluation Count:1024
yes
Evaluation Count:7418
1024-7418
382 return false;
executed: return false;
Execution Count:1024
1024
383 parsedObject.insert(off);
executed (the execution status of this line is deduced): parsedObject.insert(off);
-
384 token = nextToken();
executed (the execution status of this line is deduced): token = nextToken();
-
385 if (token != ValueSeparator)
evaluated: token != ValueSeparator
TRUEFALSE
yes
Evaluation Count:3140
yes
Evaluation Count:4278
3140-4278
386 break;
executed: break;
Execution Count:3140
3140
387 token = nextToken();
executed (the execution status of this line is deduced): token = nextToken();
-
388 if (token == EndObject) {
evaluated: token == EndObject
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:4277
1-4277
389 lastError = QJsonParseError::MissingObject;
executed (the execution status of this line is deduced): lastError = QJsonParseError::MissingObject;
-
390 return false;
executed: return false;
Execution Count:1
1
391 } -
392 }
executed: }
Execution Count:4277
4277
393 -
394 DEBUG << "end token=" << token;
executed: ;
Execution Count:3154
never executed: QMessageLogger("json/qjsonparser.cpp", 394, __PRETTY_FUNCTION__).debug() << "end token=" << token;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:3154
no
Evaluation Count:0
0-3154
395 if (token != EndObject) {
evaluated: token != EndObject
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:3151
3-3151
396 lastError = QJsonParseError::UnterminatedObject;
executed (the execution status of this line is deduced): lastError = QJsonParseError::UnterminatedObject;
-
397 return false;
executed: return false;
Execution Count:3
3
398 } -
399 -
400 DEBUG << "numEntries" << parsedObject.offsets.size();
executed: ;
Execution Count:3151
never executed: QMessageLogger("json/qjsonparser.cpp", 400, __PRETTY_FUNCTION__).debug() << "numEntries" << parsedObject.offsets.size();
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:3151
no
Evaluation Count:0
0-3151
401 int table = objectOffset;
executed (the execution status of this line is deduced): int table = objectOffset;
-
402 // finalize the object -
403 if (parsedObject.offsets.size()) {
evaluated: parsedObject.offsets.size()
TRUEFALSE
yes
Evaluation Count:3140
yes
Evaluation Count:11
11-3140
404 int tableSize = parsedObject.offsets.size()*sizeof(uint);
executed (the execution status of this line is deduced): int tableSize = parsedObject.offsets.size()*sizeof(uint);
-
405 table = reserveSpace(tableSize);
executed (the execution status of this line is deduced): table = reserveSpace(tableSize);
-
406#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN -
407 memcpy(data + table, parsedObject.offsets.constData(), tableSize);
executed (the execution status of this line is deduced): memcpy(data + table, parsedObject.offsets.constData(), tableSize);
-
408#else -
409 offset *o = (offset *)(data + table); -
410 for (int i = 0; i < parsedObject.offsets.size(); ++i) -
411 o[i] = parsedObject.offsets[i]; -
412 -
413#endif -
414 }
executed: }
Execution Count:3140
3140
415 -
416 QJsonPrivate::Object *o = (QJsonPrivate::Object *)(data + objectOffset);
executed (the execution status of this line is deduced): QJsonPrivate::Object *o = (QJsonPrivate::Object *)(data + objectOffset);
-
417 o->tableOffset = table - objectOffset;
executed (the execution status of this line is deduced): o->tableOffset = table - objectOffset;
-
418 o->size = current - objectOffset;
executed (the execution status of this line is deduced): o->size = current - objectOffset;
-
419 o->is_object = true;
executed (the execution status of this line is deduced): o->is_object = true;
-
420 o->length = parsedObject.offsets.size();
executed (the execution status of this line is deduced): o->length = parsedObject.offsets.size();
-
421 -
422 DEBUG << "current=" << current;
executed: ;
Execution Count:3151
never executed: QMessageLogger("json/qjsonparser.cpp", 422, __PRETTY_FUNCTION__).debug() << "current=" << current;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:3151
no
Evaluation Count:0
0-3151
423 END;
executed: }
Execution Count:3151
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:3151
0-3151
424 -
425 --nestingLevel;
executed (the execution status of this line is deduced): --nestingLevel;
-
426 return true;
executed: return true;
Execution Count:3151
3151
427} -
428 -
429/* -
430 member = string name-separator value -
431*/ -
432bool Parser::parseMember(int baseOffset) -
433{ -
434 int entryOffset = reserveSpace(sizeof(QJsonPrivate::Entry));
executed (the execution status of this line is deduced): int entryOffset = reserveSpace(sizeof(QJsonPrivate::Entry));
-
435 BEGIN << "parseMember pos=" << entryOffset;
executed: ;
Execution Count:8442
never executed: QMessageLogger("json/qjsonparser.cpp", 435, __PRETTY_FUNCTION__).debug() << "parseMember pos=" << entryOffset;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:8442
no
Evaluation Count:0
0-8442
436 -
437 bool latin1;
executed (the execution status of this line is deduced): bool latin1;
-
438 if (!parseString(&latin1))
partially evaluated: !parseString(&latin1)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:8442
0-8442
439 return false;
never executed: return false;
0
440 char token = nextToken();
executed (the execution status of this line is deduced): char token = nextToken();
-
441 if (token != NameSeparator) {
evaluated: token != NameSeparator
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:8441
1-8441
442 lastError = QJsonParseError::MissingNameSeparator;
executed (the execution status of this line is deduced): lastError = QJsonParseError::MissingNameSeparator;
-
443 return false;
executed: return false;
Execution Count:1
1
444 } -
445 QJsonPrivate::Value val;
executed (the execution status of this line is deduced): QJsonPrivate::Value val;
-
446 if (!parseValue(&val, baseOffset))
evaluated: !parseValue(&val, baseOffset)
TRUEFALSE
yes
Evaluation Count:1023
yes
Evaluation Count:7418
1023-7418
447 return false;
executed: return false;
Execution Count:1023
1023
448 -
449 // finalize the entry -
450 QJsonPrivate::Entry *e = (QJsonPrivate::Entry *)(data + entryOffset);
executed (the execution status of this line is deduced): QJsonPrivate::Entry *e = (QJsonPrivate::Entry *)(data + entryOffset);
-
451 e->value = val;
executed (the execution status of this line is deduced): e->value = val;
-
452 e->value.latinKey = latin1;
executed (the execution status of this line is deduced): e->value.latinKey = latin1;
-
453 -
454 END;
executed: }
Execution Count:7418
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7418
0-7418
455 return true;
executed: return true;
Execution Count:7418
7418
456} -
457 -
458/* -
459 array = begin-array [ value *( value-separator value ) ] end-array -
460*/ -
461bool Parser::parseArray() -
462{ -
463 BEGIN << "parseArray";
executed: ;
Execution Count:2767
never executed: QMessageLogger("json/qjsonparser.cpp", 463, __PRETTY_FUNCTION__).debug() << "parseArray";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:2767
no
Evaluation Count:0
0-2767
464 -
465 if (++nestingLevel > nestingLimit) {
evaluated: ++nestingLevel > nestingLimit
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:2766
1-2766
466 lastError = QJsonParseError::DeepNesting;
executed (the execution status of this line is deduced): lastError = QJsonParseError::DeepNesting;
-
467 return false;
executed: return false;
Execution Count:1
1
468 } -
469 -
470 int arrayOffset = reserveSpace(sizeof(QJsonPrivate::Array));
executed (the execution status of this line is deduced): int arrayOffset = reserveSpace(sizeof(QJsonPrivate::Array));
-
471 -
472 QVarLengthArray<QJsonPrivate::Value, 64> values;
executed (the execution status of this line is deduced): QVarLengthArray<QJsonPrivate::Value, 64> values;
-
473 -
474 if (!eatSpace()) {
evaluated: !eatSpace()
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:2765
1-2765
475 lastError = QJsonParseError::UnterminatedArray;
executed (the execution status of this line is deduced): lastError = QJsonParseError::UnterminatedArray;
-
476 return false;
executed: return false;
Execution Count:1
1
477 } -
478 if (*json == EndArray) {
evaluated: *json == EndArray
TRUEFALSE
yes
Evaluation Count:99
yes
Evaluation Count:2666
99-2666
479 nextToken();
executed (the execution status of this line is deduced): nextToken();
-
480 } else {
executed: }
Execution Count:99
99
481 while (1) {
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:3736
no
Evaluation Count:0
0-3736
482 QJsonPrivate::Value val;
executed (the execution status of this line is deduced): QJsonPrivate::Value val;
-
483 if (!parseValue(&val, arrayOffset))
evaluated: !parseValue(&val, arrayOffset)
TRUEFALSE
yes
Evaluation Count:1041
yes
Evaluation Count:2695
1041-2695
484 return false;
executed: return false;
Execution Count:1041
1041
485 values.append(val);
executed (the execution status of this line is deduced): values.append(val);
-
486 char token = nextToken();
executed (the execution status of this line is deduced): char token = nextToken();
-
487 if (token == EndArray)
evaluated: token == EndArray
TRUEFALSE
yes
Evaluation Count:1623
yes
Evaluation Count:1072
1072-1623
488 break;
executed: break;
Execution Count:1623
1623
489 else if (token != ValueSeparator) {
evaluated: token != ValueSeparator
TRUEFALSE
yes
Evaluation Count:2
yes
Evaluation Count:1070
2-1070
490 if (!eatSpace())
evaluated: !eatSpace()
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:1
1
491 lastError = QJsonParseError::UnterminatedArray;
executed: lastError = QJsonParseError::UnterminatedArray;
Execution Count:1
1
492 else -
493 lastError = QJsonParseError::MissingValueSeparator;
executed: lastError = QJsonParseError::MissingValueSeparator;
Execution Count:1
1
494 return false;
executed: return false;
Execution Count:2
2
495 } -
496 } -
497 }
executed: }
Execution Count:1623
1623
498 -
499 DEBUG << "size =" << values.size();
executed: ;
Execution Count:1722
never executed: QMessageLogger("json/qjsonparser.cpp", 499, __PRETTY_FUNCTION__).debug() << "size =" << values.size();
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:1722
no
Evaluation Count:0
0-1722
500 int table = arrayOffset;
executed (the execution status of this line is deduced): int table = arrayOffset;
-
501 // finalize the object -
502 if (values.size()) {
evaluated: values.size()
TRUEFALSE
yes
Evaluation Count:1623
yes
Evaluation Count:99
99-1623
503 int tableSize = values.size()*sizeof(QJsonPrivate::Value);
executed (the execution status of this line is deduced): int tableSize = values.size()*sizeof(QJsonPrivate::Value);
-
504 table = reserveSpace(tableSize);
executed (the execution status of this line is deduced): table = reserveSpace(tableSize);
-
505 memcpy(data + table, values.constData(), tableSize);
executed (the execution status of this line is deduced): memcpy(data + table, values.constData(), tableSize);
-
506 }
executed: }
Execution Count:1623
1623
507 -
508 QJsonPrivate::Array *a = (QJsonPrivate::Array *)(data + arrayOffset);
executed (the execution status of this line is deduced): QJsonPrivate::Array *a = (QJsonPrivate::Array *)(data + arrayOffset);
-
509 a->tableOffset = table - arrayOffset;
executed (the execution status of this line is deduced): a->tableOffset = table - arrayOffset;
-
510 a->size = current - arrayOffset;
executed (the execution status of this line is deduced): a->size = current - arrayOffset;
-
511 a->is_object = false;
executed (the execution status of this line is deduced): a->is_object = false;
-
512 a->length = values.size();
executed (the execution status of this line is deduced): a->length = values.size();
-
513 -
514 DEBUG << "current=" << current;
executed: ;
Execution Count:1722
never executed: QMessageLogger("json/qjsonparser.cpp", 514, __PRETTY_FUNCTION__).debug() << "current=" << current;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:1722
no
Evaluation Count:0
0-1722
515 END;
executed: }
Execution Count:1722
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:1722
0-1722
516 -
517 --nestingLevel;
executed (the execution status of this line is deduced): --nestingLevel;
-
518 return true;
executed: return true;
Execution Count:1722
1722
519} -
520 -
521/* -
522value = false / null / true / object / array / number / string -
523 -
524*/ -
525 -
526bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset) -
527{ -
528 BEGIN << "parse Value" << json;
executed: ;
Execution Count:12177
never executed: QMessageLogger("json/qjsonparser.cpp", 528, __PRETTY_FUNCTION__).debug() << "parse Value" << json;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:12177
no
Evaluation Count:0
0-12177
529 val->_dummy = 0;
executed (the execution status of this line is deduced): val->_dummy = 0;
-
530 -
531 switch (*json++) { -
532 case 'n': -
533 if (end - json < 4) {
evaluated: end - json < 4
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:12
1-12
534 lastError = QJsonParseError::IllegalValue;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalValue;
-
535 return false;
executed: return false;
Execution Count:1
1
536 } -
537 if (*json++ == 'u' &&
partially evaluated: *json++ == 'u'
TRUEFALSE
yes
Evaluation Count:12
no
Evaluation Count:0
0-12
538 *json++ == 'l' &&
partially evaluated: *json++ == 'l'
TRUEFALSE
yes
Evaluation Count:12
no
Evaluation Count:0
0-12
539 *json++ == 'l') {
evaluated: *json++ == 'l'
TRUEFALSE
yes
Evaluation Count:11
yes
Evaluation Count:1
1-11
540 val->type = QJsonValue::Null;
executed (the execution status of this line is deduced): val->type = QJsonValue::Null;
-
541 DEBUG << "value: null";
executed: ;
Execution Count:11
never executed: QMessageLogger("json/qjsonparser.cpp", 541, __PRETTY_FUNCTION__).debug() << "value: null";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:11
no
Evaluation Count:0
0-11
542 END;
executed: }
Execution Count:11
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:11
0-11
543 return true;
executed: return true;
Execution Count:11
11
544 } -
545 lastError = QJsonParseError::IllegalValue;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalValue;
-
546 return false;
executed: return false;
Execution Count:1
1
547 case 't': -
548 if (end - json < 4) {
evaluated: end - json < 4
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:19
1-19
549 lastError = QJsonParseError::IllegalValue;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalValue;
-
550 return false;
executed: return false;
Execution Count:1
1
551 } -
552 if (*json++ == 'r' &&
partially evaluated: *json++ == 'r'
TRUEFALSE
yes
Evaluation Count:19
no
Evaluation Count:0
0-19
553 *json++ == 'u' &&
partially evaluated: *json++ == 'u'
TRUEFALSE
yes
Evaluation Count:19
no
Evaluation Count:0
0-19
554 *json++ == 'e') {
evaluated: *json++ == 'e'
TRUEFALSE
yes
Evaluation Count:18
yes
Evaluation Count:1
1-18
555 val->type = QJsonValue::Bool;
executed (the execution status of this line is deduced): val->type = QJsonValue::Bool;
-
556 val->value = true;
executed (the execution status of this line is deduced): val->value = true;
-
557 DEBUG << "value: true";
executed: ;
Execution Count:18
never executed: QMessageLogger("json/qjsonparser.cpp", 557, __PRETTY_FUNCTION__).debug() << "value: true";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:18
no
Evaluation Count:0
0-18
558 END;
executed: }
Execution Count:18
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:18
0-18
559 return true;
executed: return true;
Execution Count:18
18
560 } -
561 lastError = QJsonParseError::IllegalValue;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalValue;
-
562 return false;
executed: return false;
Execution Count:1
1
563 case 'f': -
564 if (end - json < 5) {
evaluated: end - json < 5
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:13
1-13
565 lastError = QJsonParseError::IllegalValue;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalValue;
-
566 return false;
executed: return false;
Execution Count:1
1
567 } -
568 if (*json++ == 'a' &&
partially evaluated: *json++ == 'a'
TRUEFALSE
yes
Evaluation Count:13
no
Evaluation Count:0
0-13
569 *json++ == 'l' &&
partially evaluated: *json++ == 'l'
TRUEFALSE
yes
Evaluation Count:13
no
Evaluation Count:0
0-13
570 *json++ == 's' &&
partially evaluated: *json++ == 's'
TRUEFALSE
yes
Evaluation Count:13
no
Evaluation Count:0
0-13
571 *json++ == 'e') {
evaluated: *json++ == 'e'
TRUEFALSE
yes
Evaluation Count:12
yes
Evaluation Count:1
1-12
572 val->type = QJsonValue::Bool;
executed (the execution status of this line is deduced): val->type = QJsonValue::Bool;
-
573 val->value = false;
executed (the execution status of this line is deduced): val->value = false;
-
574 DEBUG << "value: false";
executed: ;
Execution Count:12
never executed: QMessageLogger("json/qjsonparser.cpp", 574, __PRETTY_FUNCTION__).debug() << "value: false";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:12
no
Evaluation Count:0
0-12
575 END;
executed: }
Execution Count:12
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:12
0-12
576 return true;
executed: return true;
Execution Count:12
12
577 } -
578 lastError = QJsonParseError::IllegalValue;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalValue;
-
579 return false;
executed: return false;
Execution Count:1
1
580 case Quote: { -
581 val->type = QJsonValue::String;
executed (the execution status of this line is deduced): val->type = QJsonValue::String;
-
582 val->value = current - baseOffset;
executed (the execution status of this line is deduced): val->value = current - baseOffset;
-
583 bool latin1;
executed (the execution status of this line is deduced): bool latin1;
-
584 if (!parseString(&latin1))
evaluated: !parseString(&latin1)
TRUEFALSE
yes
Evaluation Count:6
yes
Evaluation Count:2776
6-2776
585 return false;
executed: return false;
Execution Count:6
6
586 val->latinOrIntValue = latin1;
executed (the execution status of this line is deduced): val->latinOrIntValue = latin1;
-
587 DEBUG << "value: string";
executed: ;
Execution Count:2776
never executed: QMessageLogger("json/qjsonparser.cpp", 587, __PRETTY_FUNCTION__).debug() << "value: string";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:2776
no
Evaluation Count:0
0-2776
588 END;
executed: }
Execution Count:2776
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:2776
0-2776
589 return true;
executed: return true;
Execution Count:2776
2776
590 } -
591 case BeginArray: -
592 val->type = QJsonValue::Array;
executed (the execution status of this line is deduced): val->type = QJsonValue::Array;
-
593 val->value = current - baseOffset;
executed (the execution status of this line is deduced): val->value = current - baseOffset;
-
594 if (!parseArray())
evaluated: !parseArray()
TRUEFALSE
yes
Evaluation Count:1024
yes
Evaluation Count:1670
1024-1670
595 return false;
executed: return false;
Execution Count:1024
1024
596 DEBUG << "value: array";
executed: ;
Execution Count:1670
never executed: QMessageLogger("json/qjsonparser.cpp", 596, __PRETTY_FUNCTION__).debug() << "value: array";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:1670
no
Evaluation Count:0
0-1670
597 END;
executed: }
Execution Count:1670
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:1670
0-1670
598 return true;
executed: return true;
Execution Count:1670
1670
599 case BeginObject: -
600 val->type = QJsonValue::Object;
executed (the execution status of this line is deduced): val->type = QJsonValue::Object;
-
601 val->value = current - baseOffset;
executed (the execution status of this line is deduced): val->value = current - baseOffset;
-
602 if (!parseObject())
evaluated: !parseObject()
TRUEFALSE
yes
Evaluation Count:1024
yes
Evaluation Count:3141
1024-3141
603 return false;
executed: return false;
Execution Count:1024
1024
604 DEBUG << "value: object";
executed: ;
Execution Count:3141
never executed: QMessageLogger("json/qjsonparser.cpp", 604, __PRETTY_FUNCTION__).debug() << "value: object";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:3141
no
Evaluation Count:0
0-3141
605 END;
executed: }
Execution Count:3141
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:3141
0-3141
606 return true;
executed: return true;
Execution Count:3141
3141
607 case EndArray: -
608 lastError = QJsonParseError::MissingObject;
executed (the execution status of this line is deduced): lastError = QJsonParseError::MissingObject;
-
609 return false;
executed: return false;
Execution Count:1
1
610 default: -
611 --json;
executed (the execution status of this line is deduced): --json;
-
612 if (!parseNumber(val, baseOffset))
evaluated: !parseNumber(val, baseOffset)
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:2485
3-2485
613 return false;
executed: return false;
Execution Count:3
3
614 DEBUG << "value: number";
executed: ;
Execution Count:2485
never executed: QMessageLogger("json/qjsonparser.cpp", 614, __PRETTY_FUNCTION__).debug() << "value: number";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:2485
no
Evaluation Count:0
0-2485
615 END;
executed: }
Execution Count:2485
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:2485
0-2485
616 }
executed: }
Execution Count:2485
2485
617 -
618 return true;
executed: return true;
Execution Count:2485
2485
619} -
620 -
621 -
622 -
623 -
624 -
625/* -
626 number = [ minus ] int [ frac ] [ exp ] -
627 decimal-point = %x2E ; . -
628 digit1-9 = %x31-39 ; 1-9 -
629 e = %x65 / %x45 ; e E -
630 exp = e [ minus / plus ] 1*DIGIT -
631 frac = decimal-point 1*DIGIT -
632 int = zero / ( digit1-9 *DIGIT ) -
633 minus = %x2D ; - -
634 plus = %x2B ; + -
635 zero = %x30 ; 0 -
636 -
637*/ -
638 -
639bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset) -
640{ -
641 BEGIN << "parseNumber" << json;
executed: ;
Execution Count:2488
never executed: QMessageLogger("json/qjsonparser.cpp", 641, __PRETTY_FUNCTION__).debug() << "parseNumber" << json;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:2488
no
Evaluation Count:0
0-2488
642 val->type = QJsonValue::Double;
executed (the execution status of this line is deduced): val->type = QJsonValue::Double;
-
643 -
644 const char *start = json;
executed (the execution status of this line is deduced): const char *start = json;
-
645 bool isInt = true;
executed (the execution status of this line is deduced): bool isInt = true;
-
646 -
647 // minus -
648 if (json < end && *json == '-')
partially evaluated: json < end
TRUEFALSE
yes
Evaluation Count:2488
no
Evaluation Count:0
evaluated: *json == '-'
TRUEFALSE
yes
Evaluation Count:21
yes
Evaluation Count:2467
0-2488
649 ++json;
executed: ++json;
Execution Count:21
21
650 -
651 // int = zero / ( digit1-9 *DIGIT ) -
652 if (json < end && *json == '0') {
partially evaluated: json < end
TRUEFALSE
yes
Evaluation Count:2488
no
Evaluation Count:0
evaluated: *json == '0'
TRUEFALSE
yes
Evaluation Count:18
yes
Evaluation Count:2470
0-2488
653 ++json;
executed (the execution status of this line is deduced): ++json;
-
654 } else {
executed: }
Execution Count:18
18
655 while (json < end && *json >= '0' && *json <= '9')
evaluated: json < end
TRUEFALSE
yes
Evaluation Count:12496
yes
Evaluation Count:1
evaluated: *json >= '0'
TRUEFALSE
yes
Evaluation Count:11388
yes
Evaluation Count:1108
evaluated: *json <= '9'
TRUEFALSE
yes
Evaluation Count:10027
yes
Evaluation Count:1361
1-12496
656 ++json;
executed: ++json;
Execution Count:10027
10027
657 }
executed: }
Execution Count:2470
2470
658 -
659 // frac = decimal-point 1*DIGIT -
660 if (json < end && *json == '.') {
evaluated: json < end
TRUEFALSE
yes
Evaluation Count:2487
yes
Evaluation Count:1
evaluated: *json == '.'
TRUEFALSE
yes
Evaluation Count:199
yes
Evaluation Count:2288
1-2487
661 isInt = false;
executed (the execution status of this line is deduced): isInt = false;
-
662 ++json;
executed (the execution status of this line is deduced): ++json;
-
663 while (json < end && *json >= '0' && *json <= '9')
partially evaluated: json < end
TRUEFALSE
yes
Evaluation Count:1284
no
Evaluation Count:0
evaluated: *json >= '0'
TRUEFALSE
yes
Evaluation Count:1106
yes
Evaluation Count:178
evaluated: *json <= '9'
TRUEFALSE
yes
Evaluation Count:1085
yes
Evaluation Count:21
0-1284
664 ++json;
executed: ++json;
Execution Count:1085
1085
665 }
executed: }
Execution Count:199
199
666 -
667 // exp = e [ minus / plus ] 1*DIGIT -
668 if (json < end && (*json == 'e' || *json == 'E')) {
evaluated: json < end
TRUEFALSE
yes
Evaluation Count:2487
yes
Evaluation Count:1
evaluated: *json == 'e'
TRUEFALSE
yes
Evaluation Count:40
yes
Evaluation Count:2447
evaluated: *json == 'E'
TRUEFALSE
yes
Evaluation Count:10
yes
Evaluation Count:2437
1-2487
669 isInt = false;
executed (the execution status of this line is deduced): isInt = false;
-
670 ++json;
executed (the execution status of this line is deduced): ++json;
-
671 if (json < end && (*json == '-' || *json == '+'))
partially evaluated: json < end
TRUEFALSE
yes
Evaluation Count:50
no
Evaluation Count:0
evaluated: *json == '-'
TRUEFALSE
yes
Evaluation Count:15
yes
Evaluation Count:35
evaluated: *json == '+'
TRUEFALSE
yes
Evaluation Count:12
yes
Evaluation Count:23
0-50
672 ++json;
executed: ++json;
Execution Count:27
27
673 while (json < end && *json >= '0' && *json <= '9')
partially evaluated: json < end
TRUEFALSE
yes
Evaluation Count:152
no
Evaluation Count:0
evaluated: *json >= '0'
TRUEFALSE
yes
Evaluation Count:104
yes
Evaluation Count:48
evaluated: *json <= '9'
TRUEFALSE
yes
Evaluation Count:102
yes
Evaluation Count:2
0-152
674 ++json;
executed: ++json;
Execution Count:102
102
675 }
executed: }
Execution Count:50
50
676 -
677 if (json >= end) {
evaluated: json >= end
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:2487
1-2487
678 lastError = QJsonParseError::TerminationByNumber;
executed (the execution status of this line is deduced): lastError = QJsonParseError::TerminationByNumber;
-
679 return false;
executed: return false;
Execution Count:1
1
680 } -
681 -
682 QByteArray number(start, json - start);
executed (the execution status of this line is deduced): QByteArray number(start, json - start);
-
683 DEBUG << "numberstring" << number;
executed: ;
Execution Count:2487
never executed: QMessageLogger("json/qjsonparser.cpp", 683, __PRETTY_FUNCTION__).debug() << "numberstring" << number;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:2487
no
Evaluation Count:0
0-2487
684 -
685 if (isInt) {
evaluated: isInt
TRUEFALSE
yes
Evaluation Count:2259
yes
Evaluation Count:228
228-2259
686 bool ok;
executed (the execution status of this line is deduced): bool ok;
-
687 int n = number.toInt(&ok);
executed (the execution status of this line is deduced): int n = number.toInt(&ok);
-
688 if (ok && n < (1<<25) && n > -(1<<25)) {
evaluated: ok
TRUEFALSE
yes
Evaluation Count:2163
yes
Evaluation Count:96
evaluated: n < (1<<25)
TRUEFALSE
yes
Evaluation Count:2095
yes
Evaluation Count:68
partially evaluated: n > -(1<<25)
TRUEFALSE
yes
Evaluation Count:2095
no
Evaluation Count:0
0-2163
689 val->int_value = n;
executed (the execution status of this line is deduced): val->int_value = n;
-
690 val->latinOrIntValue = true;
executed (the execution status of this line is deduced): val->latinOrIntValue = true;
-
691 END;
executed: }
Execution Count:2095
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:2095
0-2095
692 return true;
executed: return true;
Execution Count:2095
2095
693 } -
694 }
executed: }
Execution Count:164
164
695 -
696 bool ok;
executed (the execution status of this line is deduced): bool ok;
-
697 union {
executed (the execution status of this line is deduced): union {
-
698 quint64 ui;
executed (the execution status of this line is deduced): quint64 ui;
-
699 double d;
executed (the execution status of this line is deduced): double d;
-
700 };
executed (the execution status of this line is deduced): };
-
701 d = number.toDouble(&ok);
executed (the execution status of this line is deduced): d = number.toDouble(&ok);
-
702 -
703 if (!ok) {
evaluated: !ok
TRUEFALSE
yes
Evaluation Count:2
yes
Evaluation Count:390
2-390
704 lastError = QJsonParseError::IllegalNumber;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalNumber;
-
705 return false;
executed: return false;
Execution Count:2
2
706 } -
707 -
708 int pos = reserveSpace(sizeof(double));
executed (the execution status of this line is deduced): int pos = reserveSpace(sizeof(double));
-
709 *(quint64 *)(data + pos) = qToLittleEndian(ui);
executed (the execution status of this line is deduced): *(quint64 *)(data + pos) = qToLittleEndian(ui);
-
710 val->value = pos - baseOffset;
executed (the execution status of this line is deduced): val->value = pos - baseOffset;
-
711 val->latinOrIntValue = false;
executed (the execution status of this line is deduced): val->latinOrIntValue = false;
-
712 -
713 END;
executed: }
Execution Count:390
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:390
0-390
714 return true;
executed: return true;
Execution Count:390
390
715} -
716 -
717/* -
718 -
719 string = quotation-mark *char quotation-mark -
720 -
721 char = unescaped / -
722 escape ( -
723 %x22 / ; " quotation mark U+0022 -
724 %x5C / ; \ reverse solidus U+005C -
725 %x2F / ; / solidus U+002F -
726 %x62 / ; b backspace U+0008 -
727 %x66 / ; f form feed U+000C -
728 %x6E / ; n line feed U+000A -
729 %x72 / ; r carriage return U+000D -
730 %x74 / ; t tab U+0009 -
731 %x75 4HEXDIG ) ; uXXXX U+XXXX -
732 -
733 escape = %x5C ; \ -
734 -
735 quotation-mark = %x22 ; " -
736 -
737 unescaped = %x20-21 / %x23-5B / %x5D-10FFFF -
738 */ -
739static inline bool addHexDigit(char digit, uint *result) -
740{ -
741 *result <<= 4;
executed (the execution status of this line is deduced): *result <<= 4;
-
742 if (digit >= '0' && digit <= '9')
evaluated: digit >= '0'
TRUEFALSE
yes
Evaluation Count:680
yes
Evaluation Count:2
evaluated: digit <= '9'
TRUEFALSE
yes
Evaluation Count:414
yes
Evaluation Count:266
2-680
743 *result |= (digit - '0');
executed: *result |= (digit - '0');
Execution Count:414
414
744 else if (digit >= 'a' && digit <= 'f')
evaluated: digit >= 'a'
TRUEFALSE
yes
Evaluation Count:49
yes
Evaluation Count:219
partially evaluated: digit <= 'f'
TRUEFALSE
yes
Evaluation Count:49
no
Evaluation Count:0
0-219
745 *result |= (digit - 'a') + 10;
executed: *result |= (digit - 'a') + 10;
Execution Count:49
49
746 else if (digit >= 'A' && digit <= 'F')
evaluated: digit >= 'A'
TRUEFALSE
yes
Evaluation Count:217
yes
Evaluation Count:2
partially evaluated: digit <= 'F'
TRUEFALSE
yes
Evaluation Count:217
no
Evaluation Count:0
0-217
747 *result |= (digit - 'A') + 10;
executed: *result |= (digit - 'A') + 10;
Execution Count:217
217
748 else -
749 return false;
executed: return false;
Execution Count:2
2
750 return true;
executed: return true;
Execution Count:680
680
751} -
752 -
753static inline bool scanEscapeSequence(const char *&json, const char *end, uint *ch) -
754{ -
755 ++json;
executed (the execution status of this line is deduced): ++json;
-
756 if (json >= end)
partially evaluated: json >= end
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:374
0-374
757 return false;
never executed: return false;
0
758 -
759 DEBUG << "scan escape" << (char)*json;
executed: ;
Execution Count:374
never executed: QMessageLogger("json/qjsonparser.cpp", 759, __PRETTY_FUNCTION__).debug() << "scan escape" << (char)*json;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:374
no
Evaluation Count:0
0-374
760 uint escaped = *json++;
executed (the execution status of this line is deduced): uint escaped = *json++;
-
761 switch (escaped) { -
762 case '"': -
763 *ch = '"'; break;
executed: break;
Execution Count:127
127
764 case '\\': -
765 *ch = '\\'; break;
executed: break;
Execution Count:9
9
766 case '/': -
767 *ch = '/'; break;
executed: break;
Execution Count:13
13
768 case 'b': -
769 *ch = 0x8; break;
executed: break;
Execution Count:9
9
770 case 'f': -
771 *ch = 0xc; break;
executed: break;
Execution Count:9
9
772 case 'n': -
773 *ch = 0xa; break;
executed: break;
Execution Count:9
9
774 case 'r': -
775 *ch = 0xd; break;
executed: break;
Execution Count:10
10
776 case 't': -
777 *ch = 0x9; break;
executed: break;
Execution Count:9
9
778 case 'u': { -
779 *ch = 0;
executed (the execution status of this line is deduced): *ch = 0;
-
780 if (json > end - 4)
partially evaluated: json > end - 4
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:171
0-171
781 return false;
never executed: return false;
0
782 for (int i = 0; i < 4; ++i) {
evaluated: i < 4
TRUEFALSE
yes
Evaluation Count:682
yes
Evaluation Count:169
169-682
783 if (!addHexDigit(*json, ch))
evaluated: !addHexDigit(*json, ch)
TRUEFALSE
yes
Evaluation Count:2
yes
Evaluation Count:680
2-680
784 return false;
executed: return false;
Execution Count:2
2
785 ++json;
executed (the execution status of this line is deduced): ++json;
-
786 }
executed: }
Execution Count:680
680
787 return true;
executed: return true;
Execution Count:169
169
788 } -
789 default: -
790 // this is not as strict as one could be, but allows for more Json files -
791 // to be parsed correctly. -
792 *ch = escaped;
executed (the execution status of this line is deduced): *ch = escaped;
-
793 return true;
executed: return true;
Execution Count:8
8
794 } -
795 return true;
executed: return true;
Execution Count:195
195
796} -
797 -
798static inline bool scanUtf8Char(const char *&json, const char *end, uint *result) -
799{ -
800 int need;
executed (the execution status of this line is deduced): int need;
-
801 uint min_uc;
executed (the execution status of this line is deduced): uint min_uc;
-
802 uint uc;
executed (the execution status of this line is deduced): uint uc;
-
803 uchar ch = *json++;
executed (the execution status of this line is deduced): uchar ch = *json++;
-
804 if (ch < 128) {
evaluated: ch < 128
TRUEFALSE
yes
Evaluation Count:184476
yes
Evaluation Count:42
42-184476
805 *result = ch;
executed (the execution status of this line is deduced): *result = ch;
-
806 return true;
executed: return true;
Execution Count:184476
184476
807 } else if ((ch & 0xe0) == 0xc0) {
evaluated: (ch & 0xe0) == 0xc0
TRUEFALSE
yes
Evaluation Count:40
yes
Evaluation Count:2
2-40
808 uc = ch & 0x1f;
executed (the execution status of this line is deduced): uc = ch & 0x1f;
-
809 need = 1;
executed (the execution status of this line is deduced): need = 1;
-
810 min_uc = 0x80;
executed (the execution status of this line is deduced): min_uc = 0x80;
-
811 } else if ((ch & 0xf0) == 0xe0) {
executed: }
Execution Count:40
partially evaluated: (ch & 0xf0) == 0xe0
TRUEFALSE
yes
Evaluation Count:2
no
Evaluation Count:0
0-40
812 uc = ch & 0x0f;
executed (the execution status of this line is deduced): uc = ch & 0x0f;
-
813 need = 2;
executed (the execution status of this line is deduced): need = 2;
-
814 min_uc = 0x800;
executed (the execution status of this line is deduced): min_uc = 0x800;
-
815 } else if ((ch&0xf8) == 0xf0) {
executed: }
Execution Count:2
never evaluated: (ch&0xf8) == 0xf0
0-2
816 uc = ch & 0x07;
never executed (the execution status of this line is deduced): uc = ch & 0x07;
-
817 need = 3;
never executed (the execution status of this line is deduced): need = 3;
-
818 min_uc = 0x10000;
never executed (the execution status of this line is deduced): min_uc = 0x10000;
-
819 } else {
never executed: }
0
820 return false;
never executed: return false;
0
821 } -
822 -
823 if (json >= end - need)
partially evaluated: json >= end - need
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:42
0-42
824 return false;
never executed: return false;
0
825 -
826 for (int i = 0; i < need; ++i) {
evaluated: i < need
TRUEFALSE
yes
Evaluation Count:44
yes
Evaluation Count:42
42-44
827 ch = *json++;
executed (the execution status of this line is deduced): ch = *json++;
-
828 if ((ch&0xc0) != 0x80)
partially evaluated: (ch&0xc0) != 0x80
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:44
0-44
829 return false;
never executed: return false;
0
830 uc = (uc << 6) | (ch & 0x3f);
executed (the execution status of this line is deduced): uc = (uc << 6) | (ch & 0x3f);
-
831 }
executed: }
Execution Count:44
44
832 -
833 if (uc < min_uc || QChar::isNonCharacter(uc) ||
partially evaluated: uc < min_uc
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:42
evaluated: QChar::isNonCharacter(uc)
TRUEFALSE
yes
Evaluation Count:2
yes
Evaluation Count:40
0-42
834 QChar::isSurrogate(uc) || uc > QChar::LastValidCodePoint) {
partially evaluated: QChar::isSurrogate(uc)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:40
partially evaluated: uc > QChar::LastValidCodePoint
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:40
0-40
835 return false;
executed: return false;
Execution Count:2
2
836 } -
837 -
838 *result = uc;
executed (the execution status of this line is deduced): *result = uc;
-
839 return true;
executed: return true;
Execution Count:40
40
840} -
841 -
842bool Parser::parseString(bool *latin1) -
843{ -
844 *latin1 = true;
executed (the execution status of this line is deduced): *latin1 = true;
-
845 -
846 const char *start = json;
executed (the execution status of this line is deduced): const char *start = json;
-
847 int outStart = current;
executed (the execution status of this line is deduced): int outStart = current;
-
848 -
849 // try to write out a latin1 string -
850 -
851 int stringPos = reserveSpace(2);
executed (the execution status of this line is deduced): int stringPos = reserveSpace(2);
-
852 BEGIN << "parse string stringPos=" << stringPos << json;
executed: ;
Execution Count:11224
never executed: QMessageLogger("json/qjsonparser.cpp", 852, __PRETTY_FUNCTION__).debug() << "parse string stringPos=" << stringPos << json;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:11224
no
Evaluation Count:0
0-11224
853 while (json < end) {
evaluated: json < end
TRUEFALSE
yes
Evaluation Count:195755
yes
Evaluation Count:1
1-195755
854 uint ch = 0;
executed (the execution status of this line is deduced): uint ch = 0;
-
855 if (*json == '"')
evaluated: *json == '"'
TRUEFALSE
yes
Evaluation Count:11198
yes
Evaluation Count:184557
11198-184557
856 break;
executed: break;
Execution Count:11198
11198
857 else if (*json == '\\') {
evaluated: *json == '\\'
TRUEFALSE
yes
Evaluation Count:196
yes
Evaluation Count:184361
196-184361
858 if (!scanEscapeSequence(json, end, &ch)) {
evaluated: !scanEscapeSequence(json, end, &ch)
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:195
1-195
859 lastError = QJsonParseError::IllegalEscapeSequence;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalEscapeSequence;
-
860 return false;
executed: return false;
Execution Count:1
1
861 } -
862 } else {
executed: }
Execution Count:195
195
863 if (!scanUtf8Char(json, end, &ch)) {
evaluated: !scanUtf8Char(json, end, &ch)
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:184360
1-184360
864 lastError = QJsonParseError::IllegalUTF8String;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalUTF8String;
-
865 return false;
executed: return false;
Execution Count:1
1
866 } -
867 }
executed: }
Execution Count:184360
184360
868 if (ch > 0xff) {
evaluated: ch > 0xff
TRUEFALSE
yes
Evaluation Count:23
yes
Evaluation Count:184532
23-184532
869 *latin1 = false;
executed (the execution status of this line is deduced): *latin1 = false;
-
870 break;
executed: break;
Execution Count:23
23
871 } -
872 int pos = reserveSpace(1);
executed (the execution status of this line is deduced): int pos = reserveSpace(1);
-
873 DEBUG << " " << ch << (char)ch;
executed: ;
Execution Count:184532
never executed: QMessageLogger("json/qjsonparser.cpp", 873, __PRETTY_FUNCTION__).debug() << " " << ch << (char)ch;
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:184532
no
Evaluation Count:0
0-184532
874 data[pos] = (uchar)ch;
executed (the execution status of this line is deduced): data[pos] = (uchar)ch;
-
875 }
executed: }
Execution Count:184532
184532
876 ++json;
executed (the execution status of this line is deduced): ++json;
-
877 DEBUG << "end of string";
executed: ;
Execution Count:11222
never executed: QMessageLogger("json/qjsonparser.cpp", 877, __PRETTY_FUNCTION__).debug() << "end of string";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:11222
no
Evaluation Count:0
0-11222
878 if (json >= end) {
evaluated: json >= end
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:11221
1-11221
879 lastError = QJsonParseError::UnterminatedString;
executed (the execution status of this line is deduced): lastError = QJsonParseError::UnterminatedString;
-
880 return false;
executed: return false;
Execution Count:1
1
881 } -
882 -
883 // no unicode string, we are done -
884 if (*latin1) {
evaluated: *latin1
TRUEFALSE
yes
Evaluation Count:11198
yes
Evaluation Count:23
23-11198
885 // write string length -
886 *(QJsonPrivate::qle_ushort *)(data + stringPos) = ushort(current - outStart - sizeof(ushort));
executed (the execution status of this line is deduced): *(QJsonPrivate::qle_ushort *)(data + stringPos) = ushort(current - outStart - sizeof(ushort));
-
887 int pos = reserveSpace((4 - current) & 3);
executed (the execution status of this line is deduced): int pos = reserveSpace((4 - current) & 3);
-
888 while (pos & 3)
evaluated: pos & 3
TRUEFALSE
yes
Evaluation Count:18526
yes
Evaluation Count:11198
11198-18526
889 data[pos++] = 0;
executed: data[pos++] = 0;
Execution Count:18526
18526
890 END;
executed: }
Execution Count:11198
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:11198
0-11198
891 return true;
executed: return true;
Execution Count:11198
11198
892 } -
893 -
894 *latin1 = false;
executed (the execution status of this line is deduced): *latin1 = false;
-
895 DEBUG << "not latin";
executed: ;
Execution Count:23
never executed: QMessageLogger("json/qjsonparser.cpp", 895, __PRETTY_FUNCTION__).debug() << "not latin";
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:23
no
Evaluation Count:0
0-23
896 -
897 json = start;
executed (the execution status of this line is deduced): json = start;
-
898 current = outStart + sizeof(int);
executed (the execution status of this line is deduced): current = outStart + sizeof(int);
-
899 -
900 while (json < end) {
evaluated: json < end
TRUEFALSE
yes
Evaluation Count:355
yes
Evaluation Count:1
1-355
901 uint ch = 0;
executed (the execution status of this line is deduced): uint ch = 0;
-
902 if (*json == '"')
evaluated: *json == '"'
TRUEFALSE
yes
Evaluation Count:20
yes
Evaluation Count:335
20-335
903 break;
executed: break;
Execution Count:20
20
904 else if (*json == '\\') {
evaluated: *json == '\\'
TRUEFALSE
yes
Evaluation Count:178
yes
Evaluation Count:157
157-178
905 if (!scanEscapeSequence(json, end, &ch)) {
evaluated: !scanEscapeSequence(json, end, &ch)
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:177
1-177
906 lastError = QJsonParseError::IllegalEscapeSequence;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalEscapeSequence;
-
907 return false;
executed: return false;
Execution Count:1
1
908 } -
909 } else {
executed: }
Execution Count:177
177
910 if (!scanUtf8Char(json, end, &ch)) {
evaluated: !scanUtf8Char(json, end, &ch)
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:156
1-156
911 lastError = QJsonParseError::IllegalUTF8String;
executed (the execution status of this line is deduced): lastError = QJsonParseError::IllegalUTF8String;
-
912 return false;
executed: return false;
Execution Count:1
1
913 } -
914 }
executed: }
Execution Count:156
156
915 if (QChar::requiresSurrogates(ch)) {
partially evaluated: QChar::requiresSurrogates(ch)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:333
0-333
916 int pos = reserveSpace(4);
never executed (the execution status of this line is deduced): int pos = reserveSpace(4);
-
917 *(QJsonPrivate::qle_ushort *)(data + pos) = QChar::highSurrogate(ch);
never executed (the execution status of this line is deduced): *(QJsonPrivate::qle_ushort *)(data + pos) = QChar::highSurrogate(ch);
-
918 *(QJsonPrivate::qle_ushort *)(data + pos + 2) = QChar::lowSurrogate(ch);
never executed (the execution status of this line is deduced): *(QJsonPrivate::qle_ushort *)(data + pos + 2) = QChar::lowSurrogate(ch);
-
919 } else {
never executed: }
0
920 int pos = reserveSpace(2);
executed (the execution status of this line is deduced): int pos = reserveSpace(2);
-
921 *(QJsonPrivate::qle_ushort *)(data + pos) = (ushort)ch;
executed (the execution status of this line is deduced): *(QJsonPrivate::qle_ushort *)(data + pos) = (ushort)ch;
-
922 }
executed: }
Execution Count:333
333
923 } -
924 ++json;
executed (the execution status of this line is deduced): ++json;
-
925 -
926 if (json >= end) {
evaluated: json >= end
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:20
1-20
927 lastError = QJsonParseError::UnterminatedString;
executed (the execution status of this line is deduced): lastError = QJsonParseError::UnterminatedString;
-
928 return false;
executed: return false;
Execution Count:1
1
929 } -
930 -
931 // write string length -
932 *(QJsonPrivate::qle_int *)(data + stringPos) = (current - outStart - sizeof(int))/2;
executed (the execution status of this line is deduced): *(QJsonPrivate::qle_int *)(data + stringPos) = (current - outStart - sizeof(int))/2;
-
933 int pos = reserveSpace((4 - current) & 3);
executed (the execution status of this line is deduced): int pos = reserveSpace((4 - current) & 3);
-
934 while (pos & 3)
evaluated: pos & 3
TRUEFALSE
yes
Evaluation Count:16
yes
Evaluation Count:20
16-20
935 data[pos++] = 0;
executed: data[pos++] = 0;
Execution Count:16
16
936 END;
executed: }
Execution Count:20
partially evaluated: 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:20
0-20
937 return true;
executed: return true;
Execution Count:20
20
938} -
939 -
940QT_END_NAMESPACE -
941 -
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial