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

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

Issue 7020028: Untank compilation and fix JSON parse bug introduced in r8147. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 6 months 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 | « src/json-parser.h ('k') | no next file » | 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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 Handle<Object> JsonParser::ParseJsonObject() { 160 Handle<Object> JsonParser::ParseJsonObject() {
161 Handle<JSFunction> object_constructor( 161 Handle<JSFunction> object_constructor(
162 isolate()->global_context()->object_function()); 162 isolate()->global_context()->object_function());
163 Handle<JSObject> json_object = 163 Handle<JSObject> json_object =
164 isolate()->factory()->NewJSObject(object_constructor); 164 isolate()->factory()->NewJSObject(object_constructor);
165 ASSERT_EQ(c0_, '{'); 165 ASSERT_EQ(c0_, '{');
166 166
167 AdvanceSkipWhitespace(); 167 AdvanceSkipWhitespace();
168 if (c0_ != '}') { 168 if (c0_ != '}') {
169 do { 169 do {
170 if (c0_ != '"') return ReportUnexpectedCharacter();
170 Handle<String> key = ParseJsonSymbol(); 171 Handle<String> key = ParseJsonSymbol();
171 if (key.is_null() || c0_ != ':') return ReportUnexpectedCharacter(); 172 if (key.is_null() || c0_ != ':') return ReportUnexpectedCharacter();
172 AdvanceSkipWhitespace(); 173 AdvanceSkipWhitespace();
173 Handle<Object> value = ParseJsonValue(); 174 Handle<Object> value = ParseJsonValue();
174 if (value.is_null()) return ReportUnexpectedCharacter(); 175 if (value.is_null()) return ReportUnexpectedCharacter();
175 176
176 uint32_t index; 177 uint32_t index;
177 if (key->AsArrayIndex(&index)) { 178 if (key->AsArrayIndex(&index)) {
178 SetOwnElement(json_object, index, value, kNonStrictMode); 179 SetOwnElement(json_object, index, value, kNonStrictMode);
179 } else if (key->Equals(isolate()->heap()->Proto_symbol())) { 180 } else if (key->Equals(isolate()->heap()->Proto_symbol())) {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 number_ = StringToDouble(isolate()->unicode_cache(), 277 number_ = StringToDouble(isolate()->unicode_cache(),
277 result, 278 result,
278 NO_FLAGS, // Hex, octal or trailing junk. 279 NO_FLAGS, // Hex, octal or trailing junk.
279 0.0); 280 0.0);
280 buffer.Dispose(); 281 buffer.Dispose();
281 } 282 }
282 SkipWhitespace(); 283 SkipWhitespace();
283 return isolate()->factory()->NewNumber(number_); 284 return isolate()->factory()->NewNumber(number_);
284 } 285 }
285 286
286 Handle<Object> JsonParser::SlowScanJsonString() { 287 Handle<String> JsonParser::SlowScanJsonString() {
287 // The currently scanned ascii characters. 288 // The currently scanned ascii characters.
288 Handle<String> ascii(isolate()->factory()->NewSubString(source_, 289 Handle<String> ascii(isolate()->factory()->NewSubString(source_,
289 beg_pos_, 290 beg_pos_,
290 position_)); 291 position_));
291 Handle<String> two_byte = 292 Handle<String> two_byte =
292 isolate()->factory()->NewRawTwoByteString(kInitialSpecialStringSize, 293 isolate()->factory()->NewRawTwoByteString(kInitialSpecialStringSize,
293 NOT_TENURED); 294 NOT_TENURED);
294 Handle<SeqTwoByteString> seq_two_byte = 295 Handle<SeqTwoByteString> seq_two_byte =
295 Handle<SeqTwoByteString>::cast(two_byte); 296 Handle<SeqTwoByteString>::cast(two_byte);
296 297
297 int allocation_count = 1; 298 int allocation_count = 1;
298 int count = 0; 299 int count = 0;
299 300
300 while (c0_ != '"') { 301 while (c0_ != '"') {
301 // Create new seq string 302 // Create new seq string
302 if (count >= kInitialSpecialStringSize * allocation_count) { 303 if (count >= kInitialSpecialStringSize * allocation_count) {
303 allocation_count = allocation_count * 2; 304 allocation_count = allocation_count * 2;
304 int new_size = allocation_count * kInitialSpecialStringSize; 305 int new_size = allocation_count * kInitialSpecialStringSize;
305 Handle<String> new_two_byte = 306 Handle<String> new_two_byte =
306 isolate()->factory()->NewRawTwoByteString(new_size, 307 isolate()->factory()->NewRawTwoByteString(new_size,
307 NOT_TENURED); 308 NOT_TENURED);
308 uc16* char_start = 309 uc16* char_start =
309 Handle<SeqTwoByteString>::cast(new_two_byte)->GetChars(); 310 Handle<SeqTwoByteString>::cast(new_two_byte)->GetChars();
310 String::WriteToFlat(*seq_two_byte, char_start, 0, count); 311 String::WriteToFlat(*seq_two_byte, char_start, 0, count);
311 seq_two_byte = Handle<SeqTwoByteString>::cast(new_two_byte); 312 seq_two_byte = Handle<SeqTwoByteString>::cast(new_two_byte);
312 } 313 }
313 314
314 // Check for control character (0x00-0x1f) or unterminated string (<0). 315 // Check for control character (0x00-0x1f) or unterminated string (<0).
315 if (c0_ < 0x20) return ReportUnexpectedCharacter(); 316 if (c0_ < 0x20) return Handle<String>::null();
316 if (c0_ != '\\') { 317 if (c0_ != '\\') {
317 seq_two_byte->SeqTwoByteStringSet(count++, c0_); 318 seq_two_byte->SeqTwoByteStringSet(count++, c0_);
318 Advance(); 319 Advance();
319 } else { 320 } else {
320 Advance(); 321 Advance();
321 switch (c0_) { 322 switch (c0_) {
322 case '"': 323 case '"':
323 case '\\': 324 case '\\':
324 case '/': 325 case '/':
325 seq_two_byte->SeqTwoByteStringSet(count++, c0_); 326 seq_two_byte->SeqTwoByteStringSet(count++, c0_);
(...skipping 12 matching lines...) Expand all
338 break; 339 break;
339 case 't': 340 case 't':
340 seq_two_byte->SeqTwoByteStringSet(count++, '\x09'); 341 seq_two_byte->SeqTwoByteStringSet(count++, '\x09');
341 break; 342 break;
342 case 'u': { 343 case 'u': {
343 uc32 value = 0; 344 uc32 value = 0;
344 for (int i = 0; i < 4; i++) { 345 for (int i = 0; i < 4; i++) {
345 Advance(); 346 Advance();
346 int digit = HexValue(c0_); 347 int digit = HexValue(c0_);
347 if (digit < 0) { 348 if (digit < 0) {
348 return ReportUnexpectedCharacter(); 349 return Handle<String>::null();
349 } 350 }
350 value = value * 16 + digit; 351 value = value * 16 + digit;
351 } 352 }
352 seq_two_byte->SeqTwoByteStringSet(count++, value); 353 seq_two_byte->SeqTwoByteStringSet(count++, value);
353 break; 354 break;
354 } 355 }
355 default: 356 default:
356 return ReportUnexpectedCharacter(); 357 return Handle<String>::null();
357 } 358 }
358 Advance(); 359 Advance();
359 } 360 }
360 } 361 }
361 // Advance past the last '"'. 362 // Advance past the last '"'.
362 ASSERT_EQ('"', c0_); 363 ASSERT_EQ('"', c0_);
363 AdvanceSkipWhitespace(); 364 AdvanceSkipWhitespace();
364 365
365 // Shrink the the string to our length. 366 // Shrink the the string to our length.
366 if (isolate()->heap()->InNewSpace(*seq_two_byte)) { 367 if (isolate()->heap()->InNewSpace(*seq_two_byte)) {
367 isolate()->heap()->new_space()-> 368 isolate()->heap()->new_space()->
368 ShrinkStringAtAllocationBoundary<SeqTwoByteString>(*seq_two_byte, 369 ShrinkStringAtAllocationBoundary<SeqTwoByteString>(*seq_two_byte,
369 count); 370 count);
370 } else { 371 } else {
371 int string_size = SeqTwoByteString::SizeFor(count); 372 int string_size = SeqTwoByteString::SizeFor(count);
372 int allocated_string_size = 373 int allocated_string_size =
373 SeqTwoByteString::SizeFor(kInitialSpecialStringSize * allocation_count); 374 SeqTwoByteString::SizeFor(kInitialSpecialStringSize * allocation_count);
374 int delta = allocated_string_size - string_size; 375 int delta = allocated_string_size - string_size;
375 Address start_filler_object = seq_two_byte->address() + string_size; 376 Address start_filler_object = seq_two_byte->address() + string_size;
376 seq_two_byte->set_length(count); 377 seq_two_byte->set_length(count);
377 isolate()->heap()->CreateFillerObjectAt(start_filler_object, delta); 378 isolate()->heap()->CreateFillerObjectAt(start_filler_object, delta);
378 } 379 }
379 return isolate()->factory()->NewConsString(ascii, seq_two_byte); 380 return isolate()->factory()->NewConsString(ascii, seq_two_byte);
380 } 381 }
381 382
382 383
383 template <bool is_symbol> 384 template <bool is_symbol>
384 Handle<Object> JsonParser::ScanJsonString() { 385 Handle<String> JsonParser::ScanJsonString() {
385 ASSERT_EQ('"', c0_); 386 ASSERT_EQ('"', c0_);
386 Advance(); 387 Advance();
387 beg_pos_ = position_; 388 beg_pos_ = position_;
388 // Fast case for ascii only without escape characters. 389 // Fast case for ascii only without escape characters.
389 while (c0_ != '"') { 390 while (c0_ != '"') {
390 // Check for control character (0x00-0x1f) or unterminated string (<0). 391 // Check for control character (0x00-0x1f) or unterminated string (<0).
391 if (c0_ < 0x20) return ReportUnexpectedCharacter(); 392 if (c0_ < 0x20) return Handle<String>::null();
392 if (c0_ != '\\' && c0_ < kMaxAsciiCharCode) { 393 if (c0_ != '\\' && c0_ < kMaxAsciiCharCode) {
393 Advance(); 394 Advance();
394 } else { 395 } else {
395 return SlowScanJsonString(); 396 return SlowScanJsonString();
396 } 397 }
397 } 398 }
398 ASSERT_EQ('"', c0_); 399 ASSERT_EQ('"', c0_);
399 end_pos_ = position_; 400 end_pos_ = position_;
400 // Advance past the last '"'. 401 // Advance past the last '"'.
401 AdvanceSkipWhitespace(); 402 AdvanceSkipWhitespace();
402 if (is_sequential_ascii_ && is_symbol) { 403 if (is_sequential_ascii_ && is_symbol) {
403 return isolate()->factory()->LookupAsciiSymbol(seq_source_, 404 return isolate()->factory()->LookupAsciiSymbol(seq_source_,
404 beg_pos_, 405 beg_pos_,
405 end_pos_ - beg_pos_); 406 end_pos_ - beg_pos_);
406 } else { 407 } else {
407 return isolate()->factory()->NewSubString(source_, beg_pos_, end_pos_); 408 return isolate()->factory()->NewSubString(source_, beg_pos_, end_pos_);
408 } 409 }
409 } 410 }
410 411
411 } } // namespace v8::internal 412 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/json-parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698