| OLD | NEW |
| 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 full_stop.AddChar('i'); | 127 full_stop.AddChar('i'); |
| 128 CHECK_EQ(i::Token::IDENTIFIER, full_stop.token()); | 128 CHECK_EQ(i::Token::IDENTIFIER, full_stop.token()); |
| 129 full_stop.Fail(); | 129 full_stop.Fail(); |
| 130 CHECK_EQ(i::Token::IDENTIFIER, full_stop.token()); | 130 CHECK_EQ(i::Token::IDENTIFIER, full_stop.token()); |
| 131 full_stop.AddChar('f'); | 131 full_stop.AddChar('f'); |
| 132 CHECK_EQ(i::Token::IDENTIFIER, full_stop.token()); | 132 CHECK_EQ(i::Token::IDENTIFIER, full_stop.token()); |
| 133 } | 133 } |
| 134 | 134 |
| 135 | 135 |
| 136 TEST(ScanHTMLEndComments) { | 136 TEST(ScanHTMLEndComments) { |
| 137 v8::V8::Initialize(); |
| 138 |
| 137 // Regression test. See: | 139 // Regression test. See: |
| 138 // http://code.google.com/p/chromium/issues/detail?id=53548 | 140 // http://code.google.com/p/chromium/issues/detail?id=53548 |
| 139 // Tests that --> is correctly interpreted as comment-to-end-of-line if there | 141 // Tests that --> is correctly interpreted as comment-to-end-of-line if there |
| 140 // is only whitespace before it on the line (with comments considered as | 142 // is only whitespace before it on the line (with comments considered as |
| 141 // whitespace, even a multiline-comment containing a newline). | 143 // whitespace, even a multiline-comment containing a newline). |
| 142 // This was not the case if it occurred before the first real token | 144 // This was not the case if it occurred before the first real token |
| 143 // in the input. | 145 // in the input. |
| 144 const char* tests[] = { | 146 const char* tests[] = { |
| 145 // Before first real token. | 147 // Before first real token. |
| 146 "--> is eol-comment\nvar y = 37;\n", | 148 "--> is eol-comment\nvar y = 37;\n", |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 CHECK_EQ(10, error_location.beg_pos); | 258 CHECK_EQ(10, error_location.beg_pos); |
| 257 CHECK_EQ(11, error_location.end_pos); | 259 CHECK_EQ(11, error_location.end_pos); |
| 258 // Should not crash. | 260 // Should not crash. |
| 259 const char* message = pre_impl->BuildMessage(); | 261 const char* message = pre_impl->BuildMessage(); |
| 260 i::Vector<const char*> args = pre_impl->BuildArgs(); | 262 i::Vector<const char*> args = pre_impl->BuildArgs(); |
| 261 CHECK_GT(strlen(message), 0); | 263 CHECK_GT(strlen(message), 0); |
| 262 } | 264 } |
| 263 | 265 |
| 264 | 266 |
| 265 TEST(StandAlonePreParser) { | 267 TEST(StandAlonePreParser) { |
| 268 v8::V8::Initialize(); |
| 269 |
| 266 int marker; | 270 int marker; |
| 267 i::Isolate::Current()->stack_guard()->SetStackLimit( | 271 i::Isolate::Current()->stack_guard()->SetStackLimit( |
| 268 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 272 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 269 | 273 |
| 270 const char* programs[] = { | 274 const char* programs[] = { |
| 271 "{label: 42}", | 275 "{label: 42}", |
| 272 "var x = 42;", | 276 "var x = 42;", |
| 273 "function foo(x, y) { return x + y; }", | 277 "function foo(x, y) { return x + y; }", |
| 274 "%ArgleBargle(glop);", | 278 "%ArgleBargle(glop);", |
| 275 "var x = new new Function('this.x = 42');", | 279 "var x = new new Function('this.x = 42');", |
| (...skipping 16 matching lines...) Expand all Loading... |
| 292 true, | 296 true, |
| 293 stack_limit); | 297 stack_limit); |
| 294 CHECK_EQ(v8::preparser::PreParser::kPreParseSuccess, result); | 298 CHECK_EQ(v8::preparser::PreParser::kPreParseSuccess, result); |
| 295 i::ScriptDataImpl data(log.ExtractData()); | 299 i::ScriptDataImpl data(log.ExtractData()); |
| 296 CHECK(!data.has_error()); | 300 CHECK(!data.has_error()); |
| 297 } | 301 } |
| 298 } | 302 } |
| 299 | 303 |
| 300 | 304 |
| 301 TEST(RegressChromium62639) { | 305 TEST(RegressChromium62639) { |
| 306 v8::V8::Initialize(); |
| 307 |
| 302 int marker; | 308 int marker; |
| 303 i::Isolate::Current()->stack_guard()->SetStackLimit( | 309 i::Isolate::Current()->stack_guard()->SetStackLimit( |
| 304 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 310 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 305 | 311 |
| 306 const char* program = "var x = 'something';\n" | 312 const char* program = "var x = 'something';\n" |
| 307 "escape: function() {}"; | 313 "escape: function() {}"; |
| 308 // Fails parsing expecting an identifier after "function". | 314 // Fails parsing expecting an identifier after "function". |
| 309 // Before fix, didn't check *ok after Expect(Token::Identifier, ok), | 315 // Before fix, didn't check *ok after Expect(Token::Identifier, ok), |
| 310 // and then used the invalid currently scanned literal. This always | 316 // and then used the invalid currently scanned literal. This always |
| 311 // failed in debug mode, and sometimes crashed in release mode. | 317 // failed in debug mode, and sometimes crashed in release mode. |
| 312 | 318 |
| 313 i::Utf8ToUC16CharacterStream stream(reinterpret_cast<const i::byte*>(program), | 319 i::Utf8ToUC16CharacterStream stream(reinterpret_cast<const i::byte*>(program), |
| 314 static_cast<unsigned>(strlen(program))); | 320 static_cast<unsigned>(strlen(program))); |
| 315 i::ScriptDataImpl* data = | 321 i::ScriptDataImpl* data = |
| 316 i::ParserApi::PreParse(&stream, NULL); | 322 i::ParserApi::PreParse(&stream, NULL); |
| 317 CHECK(data->HasError()); | 323 CHECK(data->HasError()); |
| 318 delete data; | 324 delete data; |
| 319 } | 325 } |
| 320 | 326 |
| 321 | 327 |
| 322 TEST(Regress928) { | 328 TEST(Regress928) { |
| 329 v8::V8::Initialize(); |
| 330 |
| 323 // Preparsing didn't consider the catch clause of a try statement | 331 // Preparsing didn't consider the catch clause of a try statement |
| 324 // as with-content, which made it assume that a function inside | 332 // as with-content, which made it assume that a function inside |
| 325 // the block could be lazily compiled, and an extra, unexpected, | 333 // the block could be lazily compiled, and an extra, unexpected, |
| 326 // entry was added to the data. | 334 // entry was added to the data. |
| 327 int marker; | 335 int marker; |
| 328 i::Isolate::Current()->stack_guard()->SetStackLimit( | 336 i::Isolate::Current()->stack_guard()->SetStackLimit( |
| 329 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 337 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 330 | 338 |
| 331 const char* program = | 339 const char* program = |
| 332 "try { } catch (e) { var foo = function () { /* first */ } }" | 340 "try { } catch (e) { var foo = function () { /* first */ } }" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 353 second_function + static_cast<int>(strlen("function () ")); | 361 second_function + static_cast<int>(strlen("function () ")); |
| 354 CHECK_EQ('{', program[second_lbrace]); | 362 CHECK_EQ('{', program[second_lbrace]); |
| 355 i::FunctionEntry entry2 = data->GetFunctionEntry(second_lbrace); | 363 i::FunctionEntry entry2 = data->GetFunctionEntry(second_lbrace); |
| 356 CHECK(entry2.is_valid()); | 364 CHECK(entry2.is_valid()); |
| 357 CHECK_EQ('}', program[entry2.end_pos() - 1]); | 365 CHECK_EQ('}', program[entry2.end_pos() - 1]); |
| 358 delete data; | 366 delete data; |
| 359 } | 367 } |
| 360 | 368 |
| 361 | 369 |
| 362 TEST(PreParseOverflow) { | 370 TEST(PreParseOverflow) { |
| 371 v8::V8::Initialize(); |
| 372 |
| 363 int marker; | 373 int marker; |
| 364 i::Isolate::Current()->stack_guard()->SetStackLimit( | 374 i::Isolate::Current()->stack_guard()->SetStackLimit( |
| 365 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 375 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 366 | 376 |
| 367 size_t kProgramSize = 1024 * 1024; | 377 size_t kProgramSize = 1024 * 1024; |
| 368 i::SmartPointer<char> program( | 378 i::SmartPointer<char> program( |
| 369 reinterpret_cast<char*>(malloc(kProgramSize + 1))); | 379 reinterpret_cast<char*>(malloc(kProgramSize + 1))); |
| 370 memset(*program, '(', kProgramSize); | 380 memset(*program, '(', kProgramSize); |
| 371 program[kProgramSize] = '\0'; | 381 program[kProgramSize] = '\0'; |
| 372 | 382 |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 i::Token::Value actual = scanner.Next(); | 613 i::Token::Value actual = scanner.Next(); |
| 604 CHECK_EQ(i::Token::String(expected), i::Token::String(actual)); | 614 CHECK_EQ(i::Token::String(expected), i::Token::String(actual)); |
| 605 if (scanner.location().end_pos == skip_pos) { | 615 if (scanner.location().end_pos == skip_pos) { |
| 606 scanner.SeekForward(skip_to); | 616 scanner.SeekForward(skip_to); |
| 607 } | 617 } |
| 608 i++; | 618 i++; |
| 609 } while (expected_tokens[i] != i::Token::ILLEGAL); | 619 } while (expected_tokens[i] != i::Token::ILLEGAL); |
| 610 } | 620 } |
| 611 | 621 |
| 612 TEST(StreamScanner) { | 622 TEST(StreamScanner) { |
| 623 v8::V8::Initialize(); |
| 624 |
| 613 const char* str1 = "{ foo get for : */ <- \n\n /*foo*/ bib"; | 625 const char* str1 = "{ foo get for : */ <- \n\n /*foo*/ bib"; |
| 614 i::Utf8ToUC16CharacterStream stream1(reinterpret_cast<const i::byte*>(str1), | 626 i::Utf8ToUC16CharacterStream stream1(reinterpret_cast<const i::byte*>(str1), |
| 615 static_cast<unsigned>(strlen(str1))); | 627 static_cast<unsigned>(strlen(str1))); |
| 616 i::Token::Value expectations1[] = { | 628 i::Token::Value expectations1[] = { |
| 617 i::Token::LBRACE, | 629 i::Token::LBRACE, |
| 618 i::Token::IDENTIFIER, | 630 i::Token::IDENTIFIER, |
| 619 i::Token::IDENTIFIER, | 631 i::Token::IDENTIFIER, |
| 620 i::Token::FOR, | 632 i::Token::FOR, |
| 621 i::Token::COLON, | 633 i::Token::COLON, |
| 622 i::Token::MUL, | 634 i::Token::MUL, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 CHECK(scanner.is_literal_ascii()); | 695 CHECK(scanner.is_literal_ascii()); |
| 684 i::Vector<const char> actual = scanner.literal_ascii_string(); | 696 i::Vector<const char> actual = scanner.literal_ascii_string(); |
| 685 for (int i = 0; i < actual.length(); i++) { | 697 for (int i = 0; i < actual.length(); i++) { |
| 686 CHECK_NE('\0', expected[i]); | 698 CHECK_NE('\0', expected[i]); |
| 687 CHECK_EQ(expected[i], actual[i]); | 699 CHECK_EQ(expected[i], actual[i]); |
| 688 } | 700 } |
| 689 } | 701 } |
| 690 | 702 |
| 691 | 703 |
| 692 TEST(RegExpScanning) { | 704 TEST(RegExpScanning) { |
| 705 v8::V8::Initialize(); |
| 706 |
| 693 // RegExp token with added garbage at the end. The scanner should only | 707 // RegExp token with added garbage at the end. The scanner should only |
| 694 // scan the RegExp until the terminating slash just before "flipperwald". | 708 // scan the RegExp until the terminating slash just before "flipperwald". |
| 695 TestScanRegExp("/b/flipperwald", "b"); | 709 TestScanRegExp("/b/flipperwald", "b"); |
| 696 // Incomplete escape sequences doesn't hide the terminating slash. | 710 // Incomplete escape sequences doesn't hide the terminating slash. |
| 697 TestScanRegExp("/\\x/flipperwald", "\\x"); | 711 TestScanRegExp("/\\x/flipperwald", "\\x"); |
| 698 TestScanRegExp("/\\u/flipperwald", "\\u"); | 712 TestScanRegExp("/\\u/flipperwald", "\\u"); |
| 699 TestScanRegExp("/\\u1/flipperwald", "\\u1"); | 713 TestScanRegExp("/\\u1/flipperwald", "\\u1"); |
| 700 TestScanRegExp("/\\u12/flipperwald", "\\u12"); | 714 TestScanRegExp("/\\u12/flipperwald", "\\u12"); |
| 701 TestScanRegExp("/\\u123/flipperwald", "\\u123"); | 715 TestScanRegExp("/\\u123/flipperwald", "\\u123"); |
| 702 TestScanRegExp("/\\c/flipperwald", "\\c"); | 716 TestScanRegExp("/\\c/flipperwald", "\\c"); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 715 TestScanRegExp("/[\\u12]/flipperwald", "[\\u12]"); | 729 TestScanRegExp("/[\\u12]/flipperwald", "[\\u12]"); |
| 716 TestScanRegExp("/[\\u123]/flipperwald", "[\\u123]"); | 730 TestScanRegExp("/[\\u123]/flipperwald", "[\\u123]"); |
| 717 // Escaped ']'s wont end the character class. | 731 // Escaped ']'s wont end the character class. |
| 718 TestScanRegExp("/[\\]/]/flipperwald", "[\\]/]"); | 732 TestScanRegExp("/[\\]/]/flipperwald", "[\\]/]"); |
| 719 // Escaped slashes are not terminating. | 733 // Escaped slashes are not terminating. |
| 720 TestScanRegExp("/\\//flipperwald", "\\/"); | 734 TestScanRegExp("/\\//flipperwald", "\\/"); |
| 721 // Starting with '=' works too. | 735 // Starting with '=' works too. |
| 722 TestScanRegExp("/=/", "="); | 736 TestScanRegExp("/=/", "="); |
| 723 TestScanRegExp("/=?/", "=?"); | 737 TestScanRegExp("/=?/", "=?"); |
| 724 } | 738 } |
| OLD | NEW |