qjsonparser.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/corelib/json/qjsonparser.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2static const int nestingLimit = 1024;-
3-
4-
5QString QJsonParseError::errorString() const-
6{-
7 const char *sz = "";-
8 switch (error) {-
9 case NoError:-
10 sz = "no error occurred";-
11 break;-
12 case UnterminatedObject:-
13 sz = "unterminated object";-
14 break;-
15 case MissingNameSeparator:-
16 sz = "missing name separator";-
17 break;-
18 case UnterminatedArray:-
19 sz = "unterminated array";-
20 break;-
21 case MissingValueSeparator:-
22 sz = "missing value separator";-
23 break;-
24 case IllegalValue:-
25 sz = "illegal value";-
26 break;-
27 case TerminationByNumber:-
28 sz = "invalid termination by number";-
29 break;-
30 case IllegalNumber:-
31 sz = "illegal number";-
32 break;-
33 case IllegalEscapeSequence:-
34 sz = "invalid escape sequence";-
35 break;-
36 case IllegalUTF8String:-
37 sz = "invalid UTF8 string";-
38 break;-
39 case UnterminatedString:-
40 sz = "unterminated string";-
41 break;-
42 case MissingObject:-
43 sz = "object is missing after a comma";-
44 break;-
45 case DeepNesting:-
46 sz = "too deeply nested document";-
47 break;-
48 case DocumentTooLarge:-
49 sz = "too large document";-
50 break;-
51 case GarbageAtEnd:-
52 sz = "garbage at the end of the document";-
53 break;-
54 }-
55-
56 return QCoreApplication::translate("QJsonParseError", sz);-
57-
58-
59-
60}-
61-
62using namespace QJsonPrivate;-
63-
64Parser::Parser(const char *json, int length)-
65 : head(json), json(json), data(0), dataLength(0), current(0), nestingLevel(0), lastError(QJsonParseError::NoError)-
66{-
67 end = json + length;-
68}-
69enum {-
70 Space = 0x20,-
71 Tab = 0x09,-
72 LineFeed = 0x0a,-
73 Return = 0x0d,-
74 BeginArray = 0x5b,-
75 BeginObject = 0x7b,-
76 EndArray = 0x5d,-
77 EndObject = 0x7d,-
78 NameSeparator = 0x3a,-
79 ValueSeparator = 0x2c,-
80 Quote = 0x22-
81};-
82-
83void Parser::eatBOM()-
84{-
85-
86 uchar utf8bom[3] = { 0xef, 0xbb, 0xbf };-
87 if (end - json > 3 &&-
88 (uchar)json[0] == utf8bom[0] &&-
89 (uchar)json[1] == utf8bom[1] &&-
90 (uchar)json[2] == utf8bom[2])-
91 json += 3;-
92}-
93-
94bool Parser::eatSpace()-
95{-
96 while (json < end) {-
97 if (*json > Space)-
98 break;-
99 if (*json != Space &&-
100 *json != Tab &&-
101 *json != LineFeed &&-
102 *json != Return)-
103 break;-
104 ++json;-
105 }-
106 return (json < end);-
107}-
108-
109char Parser::nextToken()-
110{-
111 if (!eatSpace())-
112 return 0;-
113 char token = *json++;-
114 switch (token) {-
115 case BeginArray:-
116 case BeginObject:-
117 case NameSeparator:-
118 case ValueSeparator:-
119 case EndArray:-
120 case EndObject:-
121 eatSpace();-
122 case Quote:-
123 break;-
124 default:-
125 token = 0;-
126 break;-
127 }-
128 return token;-
129}-
130-
131-
132-
133-
134QJsonDocument Parser::parse(QJsonParseError *error)-
135{-
136-
137-
138-
139-
140-
141 dataLength = qMax(end - json, (ptrdiff_t) 256);-
142 data = (char *)malloc(dataLength);-
143-
144-
145 QJsonPrivate::Header *h = (QJsonPrivate::Header *)data;-
146 h->tag = QJsonDocument::BinaryFormatTag;-
147 h->version = 1u;-
148-
149 current = sizeof(QJsonPrivate::Header);-
150-
151 eatBOM();-
152 char token = nextToken();-
153-
154 if (1) ;
executed 10 times by 4 tests: ;
Executed by:
  • tst_QMetaType
  • tst_QNetworkCookieJar
  • tst_QOpenGlConfig
  • tst_qmakelib
else QMessageLogger(__FILE__, 313319, __PRETTY_FUNCTION__).debug() << hex << (uint)token;
dead code: QMessageLogger(__FILE__, 319, __PRETTY_FUNCTION__).debug() << hex << (uint)token;
-
155 if (token == BeginArray
token == BeginArrayDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • tst_QNetworkCookieJar
FALSEevaluated 9 times by 3 tests
Evaluated by:
  • tst_QMetaType
  • tst_QOpenGlConfig
  • tst_qmakelib
) {
1-9
156 if (!parseArray()
!parseArray()Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • tst_QNetworkCookieJar
)
0-1
157 goto
never executed: goto error;
error;
never executed: goto error;
0
158 }
executed 1 time by 1 test: end of block
Executed by:
  • tst_QNetworkCookieJar
else if (token == BeginObject
token == BeginObjectDescription
TRUEevaluated 8 times by 3 tests
Evaluated by:
  • tst_QMetaType
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEevaluated 1 time by 1 test
Evaluated by:
  • tst_qmakelib
) {
1-8
159 if (!parseObject()
!parseObject()Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_QMetaType
FALSEevaluated 6 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
)
2-6
160 goto
executed 2 times by 1 test: goto error;
Executed by:
  • tst_QMetaType
error;
executed 2 times by 1 test: goto error;
Executed by:
  • tst_QMetaType
2
161 }
executed 6 times by 2 tests: end of block
Executed by:
  • tst_QOpenGlConfig
  • tst_qmakelib
else {
6
162 lastError = QJsonParseError::IllegalValue;-
163 goto
executed 1 time by 1 test: goto error;
Executed by:
  • tst_qmakelib
error;
executed 1 time by 1 test: goto error;
Executed by:
  • tst_qmakelib
1
164 }-
165-
166 eatSpace();-
167 if (json < end
json < endDescription
TRUEnever evaluated
FALSEevaluated 7 times by 3 tests
Evaluated by:
  • tst_QNetworkCookieJar
  • tst_QOpenGlConfig
  • tst_qmakelib
) {
0-7
168 lastError = QJsonParseError::GarbageAtEnd;-
169 goto
never executed: goto error;
error;
never executed: goto error;
0
170 }-
171-
172 do {} while (0);-
173 {-
174 if (error
errorDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • tst_QOpenGlConfig
FALSEevaluated 2 times by 2 tests
Evaluated by:
  • tst_QNetworkCookieJar
  • tst_qmakelib
) {
2-5
175 error->offset = 0;-
176 error->error = QJsonParseError::NoError;-
177 }
executed 5 times by 1 test: end of block
Executed by:
  • tst_QOpenGlConfig
5
178 QJsonPrivate::Data *d = new QJsonPrivate::Data(data, current);-
179 return
executed 7 times by 3 tests: return QJsonDocument(d);
Executed by:
  • tst_QNetworkCookieJar
  • tst_QOpenGlConfig
  • tst_qmakelib
QJsonDocument(d);
executed 7 times by 3 tests: return QJsonDocument(d);
Executed by:
  • tst_QNetworkCookieJar
  • tst_QOpenGlConfig
  • tst_qmakelib
7
180 }-
181-
182error:-
183-
184-
185-
186 if (error
errorDescription
TRUEnever evaluated
FALSEevaluated 3 times by 2 tests
Evaluated by:
  • tst_QMetaType
  • tst_qmakelib
) {
0-3
187 error->offset = json - head;-
188 error->error = lastError;-
189 }
never executed: end of block
0
190 free(data);-
191 return
executed 3 times by 2 tests: return QJsonDocument();
Executed by:
  • tst_QMetaType
  • tst_qmakelib
QJsonDocument();
executed 3 times by 2 tests: return QJsonDocument();
Executed by:
  • tst_QMetaType
  • tst_qmakelib
3
192}-
193-
194-
195void Parser::ParsedObject::insert(uint offset) {-
196 const QJsonPrivate::Entry *newEntry = reinterpret_cast<const QJsonPrivate::Entry *>(parser->data + objectPosition + offset);-
197 int min = 0;-
198 int n = offsets.size();-
199 while (n > 0) {-
200 int half = n >> 1;-
201 int middle = min + half;-
202 if (*entryAt(middle) >= *newEntry) {-
203 n = half;-
204 } else {-
205 min = middle + 1;-
206 n -= half + 1;-
207 }-
208 }-
209 if (min < offsets.size() && *entryAt(min) == *newEntry) {-
210 offsets[min] = offset;-
211 } else {-
212 offsets.insert(min, offset);-
213 }-
214}-
215-
216-
217-
218-
219-
220-
221bool Parser::parseObject()-
222{-
223 if (++nestingLevel > nestingLimit) {-
224 lastError = QJsonParseError::DeepNesting;-
225 return false;-
226 }-
227-
228 int objectOffset = reserveSpace(sizeof(QJsonPrivate::Object));-
229 if (objectOffset < 0)-
230 return false;-
231 if (1) ; else QMessageLogger(__FILE__, 390396, __PRETTY_FUNCTION__).debug() << "parseObject pos=" << objectOffset << current << json;
dead code: QMessageLogger(__FILE__, 396, __PRETTY_FUNCTION__).debug() << "parseObject pos=" << objectOffset << current << json;
-
232-
233 ParsedObject parsedObject(this, objectOffset);-
234-
235 char token = nextToken();-
236 while (token == Quote) {-
237 int off = current - objectOffset;-
238 if (!parseMember(objectOffset))-
239 return false;-
240 parsedObject.insert(off);-
241 token = nextToken();-
242 if (token != ValueSeparator)-
243 break;-
244 token = nextToken();-
245 if (token == EndObject) {-
246 lastError = QJsonParseError::MissingObject;-
247 return false;-
248 }-
249 }-
250-
251 if (1) ; else QMessageLogger(__FILE__, 410416, __PRETTY_FUNCTION__).debug() << "end token=" << token;
dead code: QMessageLogger(__FILE__, 416, __PRETTY_FUNCTION__).debug() << "end token=" << token;
-
252 if (token != EndObject) {-
253 lastError = QJsonParseError::UnterminatedObject;-
254 return false;-
255 }-
256-
257 if (1) ; else QMessageLogger(__FILE__, 416422, __PRETTY_FUNCTION__).debug() << "numEntries" << parsedObject.offsets.size();
dead code: QMessageLogger(__FILE__, 422, __PRETTY_FUNCTION__).debug() << "numEntries" << parsedObject.offsets.size();
-
258 int table = objectOffset;-
259-
260 if (parsedObject.offsets.size()) {-
261 int tableSize = parsedObject.offsets.size()*sizeof(uint);-
262 table = reserveSpace(tableSize);-
263 if (table < 0)-
264 return false;-
265-
266-
267 memcpy(data + table, parsedObject.offsets.constData(), tableSize);-
268-
269-
270-
271-
272-
273-
274 }-
275-
276 QJsonPrivate::Object *o = (QJsonPrivate::Object *)(data + objectOffset);-
277 o->tableOffset = table - objectOffset;-
278 o->size = current - objectOffset;-
279 o->is_object = true;-
280 o->length = parsedObject.offsets.size();-
281-
282 if (1) ; else QMessageLogger(__FILE__, 441447, __PRETTY_FUNCTION__).debug() << "current=" << current;
dead code: QMessageLogger(__FILE__, 447, __PRETTY_FUNCTION__).debug() << "current=" << current;
-
283 do {} while (0);-
284-
285 --nestingLevel;-
286 return true;-
287}-
288-
289-
290-
291-
292bool Parser::parseMember(int baseOffset)-
293{-
294 int entryOffset = reserveSpace(sizeof(QJsonPrivate::Entry));-
295 if (entryOffset < 0)-
296 return false;-
297 if (1) ; else QMessageLogger(__FILE__, 456462, __PRETTY_FUNCTION__).debug() << "parseMember pos=" << entryOffset;
dead code: QMessageLogger(__FILE__, 462, __PRETTY_FUNCTION__).debug() << "parseMember pos=" << entryOffset;
-
298-
299 bool latin1;-
300 if (!parseString(&latin1))-
301 return false;-
302 char token = nextToken();-
303 if (token != NameSeparator) {-
304 lastError = QJsonParseError::MissingNameSeparator;-
305 return false;-
306 }-
307 QJsonPrivate::Value val;-
308 if (!parseValue(&val, baseOffset))-
309 return false;-
310-
311-
312 QJsonPrivate::Entry *e = (QJsonPrivate::Entry *)(data + entryOffset);-
313 e->value = val;-
314 e->value.latinKey = latin1;-
315-
316 do {} while (0);-
317 return true;-
318}-
319-
320namespace {-
321 struct ValueArray {-
322 static const int prealloc = 128;-
323 ValueArray() : data(stackValues), alloc(prealloc), size(0) {}-
324 ~ValueArray() { if (data != stackValues) free(data); }-
325-
326 inline bool grow() {-
327 alloc *= 2;-
328 if (data == stackValues) {-
329 QJsonPrivate::Value *newValues = static_cast<QJsonPrivate::Value *>(malloc(alloc*sizeof(QJsonPrivate::Value)));-
330 if (!newValues)-
331 return false;-
332 memcpy(newValues, data, size*sizeof(QJsonPrivate::Value));-
333 data = newValues;-
334 } else {-
335 void *newValues = realloc(data, alloc * sizeof(QJsonPrivate::Value));-
336 if (!newValues)-
337 return false;-
338 data = static_cast<QJsonPrivate::Value *>(newValues);-
339 }-
340 return true;-
341 }-
342 bool append(const QJsonPrivate::Value &v) {-
343 if (alloc == size && !grow())-
344 return false;-
345 data[size] = v;-
346 ++size;-
347 return true;-
348 }-
349-
350 QJsonPrivate::Value stackValues[prealloc];-
351 QJsonPrivate::Value *data;-
352 int alloc;-
353 int size;-
354 };-
355}-
356-
357-
358-
359-
360bool Parser::parseArray()-
361{-
362 if (1) ; else QMessageLogger(__FILE__, 521527, __PRETTY_FUNCTION__).debug() << "parseArray";
dead code: QMessageLogger(__FILE__, 527, __PRETTY_FUNCTION__).debug() << "parseArray";
-
363-
364 if (++nestingLevel > nestingLimit) {-
365 lastError = QJsonParseError::DeepNesting;-
366 return false;-
367 }-
368-
369 int arrayOffset = reserveSpace(sizeof(QJsonPrivate::Array));-
370 if (arrayOffset < 0)-
371 return false;-
372-
373 ValueArray values;-
374-
375 if (!eatSpace()) {-
376 lastError = QJsonParseError::UnterminatedArray;-
377 return false;-
378 }-
379 if (*json == EndArray) {-
380 nextToken();-
381 } else {-
382 while (1) {-
383 QJsonPrivate::Value val;-
384 if (!parseValue(&val, arrayOffset))-
385 return false;-
386 if (!values.append(val)) {-
387 lastError = QJsonParseError::DocumentTooLarge;-
388 return false;-
389 }-
390 char token = nextToken();-
391 if (token == EndArray)-
392 break;-
393 else if (token != ValueSeparator) {-
394 if (!eatSpace())-
395 lastError = QJsonParseError::UnterminatedArray;-
396 else-
397 lastError = QJsonParseError::MissingValueSeparator;-
398 return false;-
399 }-
400 }-
401 }-
402-
403 if (1) ; else QMessageLogger(__FILE__, 562568, __PRETTY_FUNCTION__).debug() << "size =" << values.size;
dead code: QMessageLogger(__FILE__, 568, __PRETTY_FUNCTION__).debug() << "size =" << values.size;
-
404 int table = arrayOffset;-
405-
406 if (values.size) {-
407 int tableSize = values.size*sizeof(QJsonPrivate::Value);-
408 table = reserveSpace(tableSize);-
409 if (table < 0)-
410 return false;-
411 memcpy(data + table, values.data, tableSize);-
412 }-
413-
414 QJsonPrivate::Array *a = (QJsonPrivate::Array *)(data + arrayOffset);-
415 a->tableOffset = table - arrayOffset;-
416 a->size = current - arrayOffset;-
417 a->is_object = false;-
418 a->length = values.size;-
419-
420 if (1) ; else QMessageLogger(__FILE__, 579585, __PRETTY_FUNCTION__).debug() << "current=" << current;
dead code: QMessageLogger(__FILE__, 585, __PRETTY_FUNCTION__).debug() << "current=" << current;
-
421 do {} while (0);-
422-
423 --nestingLevel;-
424 return true;-
425}-
426-
427-
428-
429-
430-
431-
432bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)-
433{-
434 if (1) ; else QMessageLogger(__FILE__, 593599, __PRETTY_FUNCTION__).debug() << "parse Value" << json;
dead code: QMessageLogger(__FILE__, 599, __PRETTY_FUNCTION__).debug() << "parse Value" << json;
-
435 val->_dummy = 0;-
436-
437 switch (*json++) {-
438 case 'n':-
439 if (end - json < 4) {-
440 lastError = QJsonParseError::IllegalValue;-
441 return false;-
442 }-
443 if (*json++ == 'u' &&-
444 *json++ == 'l' &&-
445 *json++ == 'l') {-
446 val->type = QJsonValue::Null;-
447 if (1) ; else QMessageLogger(__FILE__, 606612, __PRETTY_FUNCTION__).debug() << "value: null";
dead code: QMessageLogger(__FILE__, 612, __PRETTY_FUNCTION__).debug() << "value: null";
-
448 do {} while (0);-
449 return true;-
450 }-
451 lastError = QJsonParseError::IllegalValue;-
452 return false;-
453 case 't':-
454 if (end - json < 4) {-
455 lastError = QJsonParseError::IllegalValue;-
456 return false;-
457 }-
458 if (*json++ == 'r' &&-
459 *json++ == 'u' &&-
460 *json++ == 'e') {-
461 val->type = QJsonValue::Bool;-
462 val->value = true;-
463 if (1) ; else QMessageLogger(__FILE__, 622628, __PRETTY_FUNCTION__).debug() << "value: true";
dead code: QMessageLogger(__FILE__, 628, __PRETTY_FUNCTION__).debug() << "value: true";
-
464 do {} while (0);-
465 return true;-
466 }-
467 lastError = QJsonParseError::IllegalValue;-
468 return false;-
469 case 'f':-
470 if (end - json < 5) {-
471 lastError = QJsonParseError::IllegalValue;-
472 return false;-
473 }-
474 if (*json++ == 'a' &&-
475 *json++ == 'l' &&-
476 *json++ == 's' &&-
477 *json++ == 'e') {-
478 val->type = QJsonValue::Bool;-
479 val->value = false;-
480 if (1) ; else QMessageLogger(__FILE__, 639645, __PRETTY_FUNCTION__).debug() << "value: false";
dead code: QMessageLogger(__FILE__, 645, __PRETTY_FUNCTION__).debug() << "value: false";
-
481 do {} while (0);-
482 return true;-
483 }-
484 lastError = QJsonParseError::IllegalValue;-
485 return false;-
486 case Quote: {-
487 val->type = QJsonValue::String;-
488 if (current - baseOffset >= Value::MaxSize) {-
489 lastError = QJsonParseError::DocumentTooLarge;-
490 return false;-
491 }-
492 val->value = current - baseOffset;-
493 bool latin1;-
494 if (!parseString(&latin1))-
495 return false;-
496 val->latinOrIntValue = latin1;-
497 if (1) ; else QMessageLogger(__FILE__, 656662, __PRETTY_FUNCTION__).debug() << "value: string";
dead code: QMessageLogger(__FILE__, 662, __PRETTY_FUNCTION__).debug() << "value: string";
-
498 do {} while (0);-
499 return true;-
500 }-
501 case BeginArray:-
502 val->type = QJsonValue::Array;-
503 if (current - baseOffset >= Value::MaxSize) {-
504 lastError = QJsonParseError::DocumentTooLarge;-
505 return false;-
506 }-
507 val->value = current - baseOffset;-
508 if (!parseArray())-
509 return false;-
510 if (1) ; else QMessageLogger(__FILE__, 669675, __PRETTY_FUNCTION__).debug() << "value: array";
dead code: QMessageLogger(__FILE__, 675, __PRETTY_FUNCTION__).debug() << "value: array";
-
511 do {} while (0);-
512 return true;-
513 case BeginObject:-
514 val->type = QJsonValue::Object;-
515 if (current - baseOffset >= Value::MaxSize) {-
516 lastError = QJsonParseError::DocumentTooLarge;-
517 return false;-
518 }-
519 val->value = current - baseOffset;-
520 if (!parseObject())-
521 return false;-
522 if (1) ; else QMessageLogger(__FILE__, 681687, __PRETTY_FUNCTION__).debug() << "value: object";
dead code: QMessageLogger(__FILE__, 687, __PRETTY_FUNCTION__).debug() << "value: object";
-
523 do {} while (0);-
524 return true;-
525 case EndArray:-
526 lastError = QJsonParseError::MissingObject;-
527 return false;-
528 default:-
529 --json;-
530 if (!parseNumber(val, baseOffset))-
531 return false;-
532 if (1) ; else QMessageLogger(__FILE__, 691697, __PRETTY_FUNCTION__).debug() << "value: number";
dead code: QMessageLogger(__FILE__, 697, __PRETTY_FUNCTION__).debug() << "value: number";
-
533 do {} while (0);-
534 }-
535-
536 return true;-
537}-
538bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset)-
539{-
540 if (1) ;
executed 51 times by 2 tests: ;
Executed by:
  • tst_QOpenGlConfig
  • tst_qmakelib
else QMessageLogger(__FILE__, 718724, __PRETTY_FUNCTION__).debug() << "parseNumber" << json;
dead code: QMessageLogger(__FILE__, 724, __PRETTY_FUNCTION__).debug() << "parseNumber" << json;
-
541 val->type = QJsonValue::Double;-
542-
543 const char *start = json;-
544 bool isInt = true;-
545-
546-
547 if (json < end
json < endDescription
TRUEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
&& *
*json == '-'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
json == '-'
*json == '-'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
)
0-51
548 ++
never executed: ++json;
json;
never executed: ++json;
0
549-
550-
551 if (json < end
json < endDescription
TRUEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
&& *
*json == '0'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
json == '0'
*json == '0'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
) {
0-51
552 ++json;-
553 }
never executed: end of block
else {
0
554 while (json < end
json < endDescription
TRUEevaluated 114 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
&& *
*json >= '0'Description
TRUEevaluated 63 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
json >= '0'
*json >= '0'Description
TRUEevaluated 63 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
&& *
*json <= '9'Description
TRUEevaluated 63 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
json <= '9'
*json <= '9'Description
TRUEevaluated 63 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
)
0-114
555 ++
executed 63 times by 2 tests: ++json;
Executed by:
  • tst_QOpenGlConfig
  • tst_qmakelib
json;
executed 63 times by 2 tests: ++json;
Executed by:
  • tst_QOpenGlConfig
  • tst_qmakelib
63
556 }
executed 51 times by 2 tests: end of block
Executed by:
  • tst_QOpenGlConfig
  • tst_qmakelib
51
557-
558-
559 if (json < end
json < endDescription
TRUEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
&& *
*json == '.'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
json == '.'
*json == '.'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
) {
0-51
560 isInt = false;-
561 ++json;-
562 while (json < end
json < endDescription
TRUEnever evaluated
FALSEnever evaluated
&& *
*json >= '0'Description
TRUEnever evaluated
FALSEnever evaluated
json >= '0'
*json >= '0'Description
TRUEnever evaluated
FALSEnever evaluated
&& *
*json <= '9'Description
TRUEnever evaluated
FALSEnever evaluated
json <= '9'
*json <= '9'Description
TRUEnever evaluated
FALSEnever evaluated
)
0
563 ++
never executed: ++json;
json;
never executed: ++json;
0
564 }
never executed: end of block
0
565-
566-
567 if (json < end
json < endDescription
TRUEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
&& (*
*json == 'e'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
json == 'e'
*json == 'e'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
|| *
*json == 'E'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
json == 'E'
*json == 'E'Description
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
)) {
0-51
568 isInt = false;-
569 ++json;-
570 if (json < end
json < endDescription
TRUEnever evaluated
FALSEnever evaluated
&& (*
*json == '-'Description
TRUEnever evaluated
FALSEnever evaluated
json == '-'
*json == '-'Description
TRUEnever evaluated
FALSEnever evaluated
|| *
*json == '+'Description
TRUEnever evaluated
FALSEnever evaluated
json == '+'
*json == '+'Description
TRUEnever evaluated
FALSEnever evaluated
))
0
571 ++
never executed: ++json;
json;
never executed: ++json;
0
572 while (json < end
json < endDescription
TRUEnever evaluated
FALSEnever evaluated
&& *
*json >= '0'Description
TRUEnever evaluated
FALSEnever evaluated
json >= '0'
*json >= '0'Description
TRUEnever evaluated
FALSEnever evaluated
&& *
*json <= '9'Description
TRUEnever evaluated
FALSEnever evaluated
json <= '9'
*json <= '9'Description
TRUEnever evaluated
FALSEnever evaluated
)
0
573 ++
never executed: ++json;
json;
never executed: ++json;
0
574 }
never executed: end of block
0
575-
576 if (json >= end
json >= endDescription
TRUEnever evaluated
FALSEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
) {
0-51
577 lastError = QJsonParseError::TerminationByNumber;-
578 return
never executed: return false;
false;
never executed: return false;
0
579 }-
580-
581 QByteArray number(start, json - start);-
582 if (1) ;
executed 51 times by 2 tests: ;
Executed by:
  • tst_QOpenGlConfig
  • tst_qmakelib
else QMessageLogger(__FILE__, 760766, __PRETTY_FUNCTION__).debug() << "numberstring" << number;
dead code: QMessageLogger(__FILE__, 766, __PRETTY_FUNCTION__).debug() << "numberstring" << number;
-
583-
584 if (isInt
isIntDescription
TRUEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
) {
0-51
585 bool ok;-
586 int n = number.toInt(&ok);-
587 if (ok
okDescription
TRUEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
&& n < (1<<25)
n < (1<<25)Description
TRUEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
&& n > -(1<<25)
n > -(1<<25)Description
TRUEevaluated 51 times by 2 tests
Evaluated by:
  • tst_QOpenGlConfig
  • tst_qmakelib
FALSEnever evaluated
) {
0-51
588 val->int_value = n;-
589 val->latinOrIntValue = true;-
590 do {} while (0);-
591 return
executed 51 times by 2 tests: return true;
Executed by:
  • tst_QOpenGlConfig
  • tst_qmakelib
true;
executed 51 times by 2 tests: return true;
Executed by:
  • tst_QOpenGlConfig
  • tst_qmakelib
51
592 }-
593 }
never executed: end of block
0
594-
595 bool ok;-
596 union {-
597 quint64 ui;-
598 double d;-
599 };-
600 d = number.toDouble(&ok);-
601-
602 if (!ok
!okDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
603 lastError = QJsonParseError::IllegalNumber;-
604 return
never executed: return false;
false;
never executed: return false;
0
605 }-
606-
607 int pos = reserveSpace(sizeof(double));-
608 if (pos < 0
pos < 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
609 return
never executed: return false;
false;
never executed: return false;
0
610 qToLittleEndian(ui, reinterpret_cast<uchar *>(data + pos)););-
611 if (current - baseOffset >= Value::MaxSize
current - base...Value::MaxSizeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
612 lastError = QJsonParseError::DocumentTooLarge;-
613 return
never executed: return false;
false;
never executed: return false;
0
614 }-
615 val->value = pos - baseOffset;-
616 val->latinOrIntValue = false;-
617-
618 do {} while (0);-
619 return
never executed: return true;
true;
never executed: return true;
0
620}-
621static inline bool addHexDigit(char digit, uint *result)-
622{-
623 *result <<= 4;-
624 if (digit >= '0' && digit <= '9')-
625 *result |= (digit - '0');-
626 else if (digit >= 'a' && digit <= 'f')-
627 *result |= (digit - 'a') + 10;-
628 else if (digit >= 'A' && digit <= 'F')-
629 *result |= (digit - 'A') + 10;-
630 else-
631 return false;-
632 return true;-
633}-
634-
635static inline bool scanEscapeSequence(const char *&json, const char *end, uint *ch)-
636{-
637 ++json;-
638 if (json >= end)-
639 return false;-
640-
641 if (1) ; else QMessageLogger(__FILE__, 842848, __PRETTY_FUNCTION__).debug() << "scan escape" << (char)*json;
dead code: QMessageLogger(__FILE__, 848, __PRETTY_FUNCTION__).debug() << "scan escape" << (char)*json;
-
642 uint escaped = *json++;-
643 switch (escaped) {-
644 case '"':-
645 *ch = '"'; break;-
646 case '\\':-
647 *ch = '\\'; break;-
648 case '/':-
649 *ch = '/'; break;-
650 case 'b':-
651 *ch = 0x8; break;-
652 case 'f':-
653 *ch = 0xc; break;-
654 case 'n':-
655 *ch = 0xa; break;-
656 case 'r':-
657 *ch = 0xd; break;-
658 case 't':-
659 *ch = 0x9; break;-
660 case 'u': {-
661 *ch = 0;-
662 if (json > end - 4)-
663 return false;-
664 for (int i = 0; i < 4; ++i) {-
665 if (!addHexDigit(*json, ch))-
666 return false;-
667 ++json;-
668 }-
669 return true;-
670 }-
671 default:-
672-
673-
674 *ch = escaped;-
675 return true;-
676 }-
677 return true;-
678}-
679-
680static inline bool scanUtf8Char(const char *&json, const char *end, uint *result)-
681{-
682 const uchar *&src = reinterpret_cast<const uchar *&>(json);-
683 const uchar *uend = reinterpret_cast<const uchar *>(end);-
684 uchar b = *src++;-
685 int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, result, src, uend);-
686 if (res < 0) {-
687-
688 --json;-
689 return false;-
690 }-
691-
692 return true;-
693}-
694-
695bool Parser::parseString(bool *latin1)-
696{-
697 *latin1 = true;-
698-
699 const char *start = json;-
700 int outStart = current;-
701-
702-
703-
704 int stringPos = reserveSpace(2);-
705 if (stringPos < 0)-
706 return false;-
707-
708 if (1) ; else QMessageLogger(__FILE__, 909915, __PRETTY_FUNCTION__).debug() << "parse string stringPos=" << stringPos << json;
dead code: QMessageLogger(__FILE__, 915, __PRETTY_FUNCTION__).debug() << "parse string stringPos=" << stringPos << json;
-
709 while (json < end) {-
710 uint ch = 0;-
711 if (*json == '"')-
712 break;-
713 else if (*json == '\\') {-
714 if (!scanEscapeSequence(json, end, &ch)) {-
715 lastError = QJsonParseError::IllegalEscapeSequence;-
716 return false;-
717 }-
718 } else {-
719 if (!scanUtf8Char(json, end, &ch)) {-
720 lastError = QJsonParseError::IllegalUTF8String;-
721 return false;-
722 }-
723 }-
724-
725 if (ch > 0xff || json - start >= 0x8000) {-
726 *latin1 = false;-
727 break;-
728 }-
729 int pos = reserveSpace(1);-
730 if (pos < 0)-
731 return false;-
732 if (1) ; else QMessageLogger(__FILE__, 933939, __PRETTY_FUNCTION__).debug() << " " << ch << (char)ch;
dead code: QMessageLogger(__FILE__, 939, __PRETTY_FUNCTION__).debug() << " " << ch << (char)ch;
-
733 data[pos] = (uchar)ch;-
734 }-
735 ++json;-
736 if (1) ; else QMessageLogger(__FILE__, 937943, __PRETTY_FUNCTION__).debug() << "end of string";
dead code: QMessageLogger(__FILE__, 943, __PRETTY_FUNCTION__).debug() << "end of string";
-
737 if (json >= end) {-
738 lastError = QJsonParseError::UnterminatedString;-
739 return false;-
740 }-
741-
742-
743 if (*latin1) {-
744-
745 *(QJsonPrivate::qle_ushort *)(data + stringPos) = ushort(current - outStart - sizeof(ushort));-
746 int pos = reserveSpace((4 - current) & 3);-
747 if (pos < 0)-
748 return false;-
749 while (pos & 3)-
750 data[pos++] = 0;-
751 do {} while (0);-
752 return true;-
753 }-
754-
755 *latin1 = false;-
756 if (1) ; else QMessageLogger(__FILE__, 957963, __PRETTY_FUNCTION__).debug() << "not latin";
dead code: QMessageLogger(__FILE__, 963, __PRETTY_FUNCTION__).debug() << "not latin";
-
757-
758 json = start;-
759 current = outStart + sizeof(int);-
760-
761 while (json < end) {-
762 uint ch = 0;-
763 if (*json == '"')-
764 break;-
765 else if (*json == '\\') {-
766 if (!scanEscapeSequence(json, end, &ch)) {-
767 lastError = QJsonParseError::IllegalEscapeSequence;-
768 return false;-
769 }-
770 } else {-
771 if (!scanUtf8Char(json, end, &ch)) {-
772 lastError = QJsonParseError::IllegalUTF8String;-
773 return false;-
774 }-
775 }-
776 if (QChar::requiresSurrogates(ch)) {-
777 int pos = reserveSpace(4);-
778 if (pos < 0)-
779 return false;-
780 *(QJsonPrivate::qle_ushort *)(data + pos) = QChar::highSurrogate(ch);-
781 *(QJsonPrivate::qle_ushort *)(data + pos + 2) = QChar::lowSurrogate(ch);-
782 } else {-
783 int pos = reserveSpace(2);-
784 if (pos < 0)-
785 return false;-
786 *(QJsonPrivate::qle_ushort *)(data + pos) = (ushort)ch;-
787 }-
788 }-
789 ++json;-
790-
791 if (json >= end) {-
792 lastError = QJsonParseError::UnterminatedString;-
793 return false;-
794 }-
795-
796-
797 *(QJsonPrivate::qle_int *)(data + stringPos) = (current - outStart - sizeof(int))/2;-
798 int pos = reserveSpace((4 - current) & 3);-
799 if (pos < 0)-
800 return false;-
801 while (pos & 3)-
802 data[pos++] = 0;-
803 do {} while (0);-
804 return true;-
805}-
806-
807-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9