Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/json/qjsonparser.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||||||||||||||
2 | static const int nestingLimit = 1024; | - | ||||||||||||||||||||||||||||||
3 | - | |||||||||||||||||||||||||||||||
4 | - | |||||||||||||||||||||||||||||||
5 | QString 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 | - | |||||||||||||||||||||||||||||||
62 | using namespace QJsonPrivate; | - | ||||||||||||||||||||||||||||||
63 | - | |||||||||||||||||||||||||||||||
64 | Parser::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 | } | - | ||||||||||||||||||||||||||||||
69 | enum { | - | ||||||||||||||||||||||||||||||
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 | - | |||||||||||||||||||||||||||||||
83 | void 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 | - | |||||||||||||||||||||||||||||||
94 | bool 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 | - | |||||||||||||||||||||||||||||||
109 | char 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 | - | |||||||||||||||||||||||||||||||
134 | QJsonDocument 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: else QMessageLogger(__FILE__, 313319, __PRETTY_FUNCTION__).debug() << hex << (uint)token;; Executed by:
dead code: QMessageLogger(__FILE__, 319, __PRETTY_FUNCTION__).debug() << hex << (uint)token; | - | ||||||||||||||||||||||||||||||
155 | if (token == BeginArray
| 1-9 | ||||||||||||||||||||||||||||||
156 | if (!parseArray()
| 0-1 | ||||||||||||||||||||||||||||||
157 | goto never executed: error;goto error; never executed: goto error; | 0 | ||||||||||||||||||||||||||||||
158 | } executed 1 time by 1 test: else if (token == BeginObjectend of block Executed by:
| 1-8 | ||||||||||||||||||||||||||||||
159 | if (!parseObject()
| 2-6 | ||||||||||||||||||||||||||||||
160 | goto executed 2 times by 1 test: error;goto error; Executed by:
executed 2 times by 1 test: goto error; Executed by:
| 2 | ||||||||||||||||||||||||||||||
161 | } executed 6 times by 2 tests: else {end of block Executed by:
| 6 | ||||||||||||||||||||||||||||||
162 | lastError = QJsonParseError::IllegalValue; | - | ||||||||||||||||||||||||||||||
163 | goto executed 1 time by 1 test: error;goto error; Executed by:
executed 1 time by 1 test: goto error; Executed by:
| 1 | ||||||||||||||||||||||||||||||
164 | } | - | ||||||||||||||||||||||||||||||
165 | - | |||||||||||||||||||||||||||||||
166 | eatSpace(); | - | ||||||||||||||||||||||||||||||
167 | if (json < end
| 0-7 | ||||||||||||||||||||||||||||||
168 | lastError = QJsonParseError::GarbageAtEnd; | - | ||||||||||||||||||||||||||||||
169 | goto never executed: error;goto error; never executed: goto error; | 0 | ||||||||||||||||||||||||||||||
170 | } | - | ||||||||||||||||||||||||||||||
171 | - | |||||||||||||||||||||||||||||||
172 | do {} while (0); | - | ||||||||||||||||||||||||||||||
173 | { | - | ||||||||||||||||||||||||||||||
174 | if (error
| 2-5 | ||||||||||||||||||||||||||||||
175 | error->offset = 0; | - | ||||||||||||||||||||||||||||||
176 | error->error = QJsonParseError::NoError; | - | ||||||||||||||||||||||||||||||
177 | } executed 5 times by 1 test: end of block Executed by:
| 5 | ||||||||||||||||||||||||||||||
178 | QJsonPrivate::Data *d = new QJsonPrivate::Data(data, current); | - | ||||||||||||||||||||||||||||||
179 | return executed 7 times by 3 tests: QJsonDocument(d);return QJsonDocument(d); Executed by:
executed 7 times by 3 tests: return QJsonDocument(d); Executed by:
| 7 | ||||||||||||||||||||||||||||||
180 | } | - | ||||||||||||||||||||||||||||||
181 | - | |||||||||||||||||||||||||||||||
182 | error: | - | ||||||||||||||||||||||||||||||
183 | - | |||||||||||||||||||||||||||||||
184 | - | |||||||||||||||||||||||||||||||
185 | - | |||||||||||||||||||||||||||||||
186 | if (error
| 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: QJsonDocument();return QJsonDocument(); Executed by:
executed 3 times by 2 tests: return QJsonDocument(); Executed by:
| 3 | ||||||||||||||||||||||||||||||
192 | } | - | ||||||||||||||||||||||||||||||
193 | - | |||||||||||||||||||||||||||||||
194 | - | |||||||||||||||||||||||||||||||
195 | void 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 | - | |||||||||||||||||||||||||||||||
221 | bool 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 | - | |||||||||||||||||||||||||||||||
292 | bool 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 | - | |||||||||||||||||||||||||||||||
320 | namespace { | - | ||||||||||||||||||||||||||||||
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 | - | |||||||||||||||||||||||||||||||
360 | bool 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 | - | |||||||||||||||||||||||||||||||
432 | bool 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 | } | - | ||||||||||||||||||||||||||||||
538 | bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset) | - | ||||||||||||||||||||||||||||||
539 | { | - | ||||||||||||||||||||||||||||||
540 | if (1) ; executed 51 times by 2 tests: else QMessageLogger(__FILE__, 718724, __PRETTY_FUNCTION__).debug() << "parseNumber" << json;; Executed by:
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
| 0-51 | ||||||||||||||||||||||||||||||
548 | ++ never executed: json;++json; never executed: ++json; | 0 | ||||||||||||||||||||||||||||||
549 | - | |||||||||||||||||||||||||||||||
550 | - | |||||||||||||||||||||||||||||||
551 | if (json < end
| 0-51 | ||||||||||||||||||||||||||||||
552 | ++json; | - | ||||||||||||||||||||||||||||||
553 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||||||||
554 | while (json < end
| 0-114 | ||||||||||||||||||||||||||||||
555 | ++ executed 63 times by 2 tests: json;++json; Executed by:
executed 63 times by 2 tests: ++json; Executed by:
| 63 | ||||||||||||||||||||||||||||||
556 | } executed 51 times by 2 tests: end of block Executed by:
| 51 | ||||||||||||||||||||||||||||||
557 | - | |||||||||||||||||||||||||||||||
558 | - | |||||||||||||||||||||||||||||||
559 | if (json < end
| 0-51 | ||||||||||||||||||||||||||||||
560 | isInt = false; | - | ||||||||||||||||||||||||||||||
561 | ++json; | - | ||||||||||||||||||||||||||||||
562 | while (json < end
| 0 | ||||||||||||||||||||||||||||||
563 | ++ never executed: json;++json; never executed: ++json; | 0 | ||||||||||||||||||||||||||||||
564 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
565 | - | |||||||||||||||||||||||||||||||
566 | - | |||||||||||||||||||||||||||||||
567 | if (json < end
| 0-51 | ||||||||||||||||||||||||||||||
568 | isInt = false; | - | ||||||||||||||||||||||||||||||
569 | ++json; | - | ||||||||||||||||||||||||||||||
570 | if (json < end
| 0 | ||||||||||||||||||||||||||||||
571 | ++ never executed: json;++json; never executed: ++json; | 0 | ||||||||||||||||||||||||||||||
572 | while (json < end
| 0 | ||||||||||||||||||||||||||||||
573 | ++ never executed: json;++json; never executed: ++json; | 0 | ||||||||||||||||||||||||||||||
574 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
575 | - | |||||||||||||||||||||||||||||||
576 | if (json >= end
| 0-51 | ||||||||||||||||||||||||||||||
577 | lastError = QJsonParseError::TerminationByNumber; | - | ||||||||||||||||||||||||||||||
578 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||||||||||||||||||||
579 | } | - | ||||||||||||||||||||||||||||||
580 | - | |||||||||||||||||||||||||||||||
581 | QByteArray number(start, json - start); | - | ||||||||||||||||||||||||||||||
582 | if (1) ; executed 51 times by 2 tests: else QMessageLogger(__FILE__, 760766, __PRETTY_FUNCTION__).debug() << "numberstring" << number;; Executed by:
dead code: QMessageLogger(__FILE__, 766, __PRETTY_FUNCTION__).debug() << "numberstring" << number; | - | ||||||||||||||||||||||||||||||
583 | - | |||||||||||||||||||||||||||||||
584 | if (isInt
| 0-51 | ||||||||||||||||||||||||||||||
585 | bool ok; | - | ||||||||||||||||||||||||||||||
586 | int n = number.toInt(&ok); | - | ||||||||||||||||||||||||||||||
587 | if (ok
| 0-51 | ||||||||||||||||||||||||||||||
588 | val->int_value = n; | - | ||||||||||||||||||||||||||||||
589 | val->latinOrIntValue = true; | - | ||||||||||||||||||||||||||||||
590 | do {} while (0); | - | ||||||||||||||||||||||||||||||
591 | return executed 51 times by 2 tests: true;return true; Executed by:
executed 51 times by 2 tests: return true; Executed by:
| 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
| 0 | ||||||||||||||||||||||||||||||
603 | lastError = QJsonParseError::IllegalNumber; | - | ||||||||||||||||||||||||||||||
604 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||||||||||||||||||||
605 | } | - | ||||||||||||||||||||||||||||||
606 | - | |||||||||||||||||||||||||||||||
607 | int pos = reserveSpace(sizeof(double)); | - | ||||||||||||||||||||||||||||||
608 | if (pos < 0
| 0 | ||||||||||||||||||||||||||||||
609 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||||||||||||||||||||
610 | qToLittleEndian(ui, reinterpret_cast<uchar *>(data + pos));); | - | ||||||||||||||||||||||||||||||
611 | if (current - baseOffset >= Value::MaxSize
| 0 | ||||||||||||||||||||||||||||||
612 | lastError = QJsonParseError::DocumentTooLarge; | - | ||||||||||||||||||||||||||||||
613 | return never executed: false;return 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: true;return true; never executed: return true; | 0 | ||||||||||||||||||||||||||||||
620 | } | - | ||||||||||||||||||||||||||||||
621 | static 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 | - | |||||||||||||||||||||||||||||||
635 | static 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 | - | |||||||||||||||||||||||||||||||
680 | static 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 | - | |||||||||||||||||||||||||||||||
695 | bool 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 code | Preprocessed file |