Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(577)

Side by Side Diff: src/json-parser.h

Issue 11273075: Treat leading zeros in JSON.parse correctly. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-crbug-158185.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 297
298 AdvanceSkipWhitespace(); 298 AdvanceSkipWhitespace();
299 if (c0_ != '}') { 299 if (c0_ != '}') {
300 do { 300 do {
301 if (c0_ != '"') return ReportUnexpectedCharacter(); 301 if (c0_ != '"') return ReportUnexpectedCharacter();
302 302
303 int start_position = position_; 303 int start_position = position_;
304 Advance(); 304 Advance();
305 305
306 uint32_t index = 0; 306 uint32_t index = 0;
307 while (c0_ >= '0' && c0_ <= '9') { 307 if (c0_ >= '0' && c0_ <= '9') {
308 int d = c0_ - '0'; 308 // Maybe an array index, try to parse it.
309 if (index > 429496729U - ((d > 5) ? 1 : 0)) break; 309 if (c0_ == '0') {
310 index = (index * 10) + d; 310 // With a leading zero, the string has to be "0" only to be an index.
311 Advance(); 311 Advance();
312 } else {
313 do {
314 int d = c0_ - '0';
315 if (index > 429496729U - ((d > 5) ? 1 : 0)) break;
316 index = (index * 10) + d;
317 Advance();
318 } while (c0_ >= '0' && c0_ <= '9');
319 }
320
321 if (position_ != start_position + 1 && c0_ == '"') {
Toon Verwaest 2012/10/29 11:08:22 Now that this if moved into the parent if, the fir
Yang 2012/10/29 12:01:12 Done.
322 // Successfully parsed index, parse and store element.
323 AdvanceSkipWhitespace();
324
325 if (c0_ != ':') return ReportUnexpectedCharacter();
326 AdvanceSkipWhitespace();
327 Handle<Object> value = ParseJsonValue();
328 if (value.is_null()) return ReportUnexpectedCharacter();
329
330 JSObject::SetOwnElement(json_object, index, value, kNonStrictMode);
331 continue;
332 }
333 // Not an index, fallback to the slow path.
312 } 334 }
313 335
314 if (position_ != start_position + 1 && c0_ == '"') { 336 position_ = start_position;
315 AdvanceSkipWhitespace();
316
317 if (c0_ != ':') return ReportUnexpectedCharacter();
318 AdvanceSkipWhitespace();
319 Handle<Object> value = ParseJsonValue();
320 if (value.is_null()) return ReportUnexpectedCharacter();
321
322 JSObject::SetOwnElement(json_object, index, value, kNonStrictMode);
323 } else {
324 position_ = start_position;
325 #ifdef DEBUG 337 #ifdef DEBUG
326 c0_ = '"'; 338 c0_ = '"';
327 #endif 339 #endif
328 340
329 Handle<String> key = ParseJsonSymbol(); 341 Handle<String> key = ParseJsonSymbol();
330 if (key.is_null() || c0_ != ':') return ReportUnexpectedCharacter(); 342 if (key.is_null() || c0_ != ':') return ReportUnexpectedCharacter();
331 343
332 AdvanceSkipWhitespace(); 344 AdvanceSkipWhitespace();
333 Handle<Object> value = ParseJsonValue(); 345 Handle<Object> value = ParseJsonValue();
334 if (value.is_null()) return ReportUnexpectedCharacter(); 346 if (value.is_null()) return ReportUnexpectedCharacter();
335 347
336 if (key->Equals(isolate()->heap()->Proto_symbol())) { 348 if (key->Equals(isolate()->heap()->Proto_symbol())) {
337 prototype = value; 349 prototype = value;
350 } else {
351 if (JSObject::TryTransitionToField(json_object, key)) {
352 int index = json_object->LastAddedFieldIndex();
353 json_object->FastPropertyAtPut(index, *value);
338 } else { 354 } else {
339 if (JSObject::TryTransitionToField(json_object, key)) { 355 JSObject::SetLocalPropertyIgnoreAttributes(
340 int index = json_object->LastAddedFieldIndex(); 356 json_object, key, value, NONE);
341 json_object->FastPropertyAtPut(index, *value);
342 } else {
343 JSObject::SetLocalPropertyIgnoreAttributes(
344 json_object, key, value, NONE);
345 }
346 } 357 }
347 } 358 }
348 } while (MatchSkipWhiteSpace(',')); 359 } while (MatchSkipWhiteSpace(','));
349 if (c0_ != '}') { 360 if (c0_ != '}') {
350 return ReportUnexpectedCharacter(); 361 return ReportUnexpectedCharacter();
351 } 362 }
352 if (!prototype.is_null()) SetPrototype(json_object, prototype); 363 if (!prototype.is_null()) SetPrototype(json_object, prototype);
353 } 364 }
354 AdvanceSkipWhitespace(); 365 AdvanceSkipWhitespace();
355 return json_object; 366 return json_object;
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 } 695 }
685 ASSERT_EQ('"', c0_); 696 ASSERT_EQ('"', c0_);
686 // Advance past the last '"'. 697 // Advance past the last '"'.
687 AdvanceSkipWhitespace(); 698 AdvanceSkipWhitespace();
688 return result; 699 return result;
689 } 700 }
690 701
691 } } // namespace v8::internal 702 } } // namespace v8::internal
692 703
693 #endif // V8_JSON_PARSER_H_ 704 #endif // V8_JSON_PARSER_H_
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-crbug-158185.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698