OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 "Expected error on:\n" | 1291 "Expected error on:\n" |
1292 "\t%s\n" | 1292 "\t%s\n" |
1293 "However, parser and preparser succeeded", | 1293 "However, parser and preparser succeeded", |
1294 source->ToCString().get()); | 1294 source->ToCString().get()); |
1295 CHECK(false); | 1295 CHECK(false); |
1296 } | 1296 } |
1297 } | 1297 } |
1298 | 1298 |
1299 | 1299 |
1300 void TestParserSync(const char* source, | 1300 void TestParserSync(const char* source, |
1301 const ParserFlag* flag_list, | 1301 const ParserFlag* varying_flags, |
1302 size_t flag_list_length, | 1302 size_t varying_flags_length, |
1303 ParserSyncTestResult result = kSuccessOrError) { | 1303 ParserSyncTestResult result = kSuccessOrError, |
| 1304 const ParserFlag* always_true_flags = NULL, |
| 1305 size_t always_true_flags_length = 0) { |
1304 i::Handle<i::String> str = | 1306 i::Handle<i::String> str = |
1305 CcTest::i_isolate()->factory()->NewStringFromAsciiChecked(source); | 1307 CcTest::i_isolate()->factory()->NewStringFromAsciiChecked(source); |
1306 for (int bits = 0; bits < (1 << flag_list_length); bits++) { | 1308 for (int bits = 0; bits < (1 << varying_flags_length); bits++) { |
1307 i::EnumSet<ParserFlag> flags; | 1309 i::EnumSet<ParserFlag> flags; |
1308 for (size_t flag_index = 0; flag_index < flag_list_length; flag_index++) { | 1310 for (size_t flag_index = 0; flag_index < varying_flags_length; |
1309 if ((bits & (1 << flag_index)) != 0) flags.Add(flag_list[flag_index]); | 1311 ++flag_index) { |
| 1312 if ((bits & (1 << flag_index)) != 0) flags.Add(varying_flags[flag_index]); |
| 1313 } |
| 1314 for (size_t flag_index = 0; flag_index < always_true_flags_length; |
| 1315 ++flag_index) { |
| 1316 flags.Add(always_true_flags[flag_index]); |
1310 } | 1317 } |
1311 TestParserSyncWithFlags(str, flags, result); | 1318 TestParserSyncWithFlags(str, flags, result); |
1312 } | 1319 } |
1313 } | 1320 } |
1314 | 1321 |
1315 | 1322 |
1316 TEST(ParserSync) { | 1323 TEST(ParserSync) { |
1317 const char* context_data[][2] = { | 1324 const char* context_data[][2] = { |
1318 { "", "" }, | 1325 { "", "" }, |
1319 { "{", "}" }, | 1326 { "{", "}" }, |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1451 v8::String::Utf8Value exception(try_catch.Exception()); | 1458 v8::String::Utf8Value exception(try_catch.Exception()); |
1452 CHECK_EQ("SyntaxError: Octal literals are not allowed in strict mode.", | 1459 CHECK_EQ("SyntaxError: Octal literals are not allowed in strict mode.", |
1453 *exception); | 1460 *exception); |
1454 } | 1461 } |
1455 | 1462 |
1456 | 1463 |
1457 void RunParserSyncTest(const char* context_data[][2], | 1464 void RunParserSyncTest(const char* context_data[][2], |
1458 const char* statement_data[], | 1465 const char* statement_data[], |
1459 ParserSyncTestResult result, | 1466 ParserSyncTestResult result, |
1460 const ParserFlag* flags = NULL, | 1467 const ParserFlag* flags = NULL, |
1461 int flags_len = 0) { | 1468 int flags_len = 0, |
| 1469 const ParserFlag* always_true_flags = NULL, |
| 1470 int always_true_flags_len = 0) { |
1462 v8::HandleScope handles(CcTest::isolate()); | 1471 v8::HandleScope handles(CcTest::isolate()); |
1463 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 1472 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
1464 v8::Context::Scope context_scope(context); | 1473 v8::Context::Scope context_scope(context); |
1465 | 1474 |
1466 int marker; | 1475 int marker; |
1467 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 1476 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
1468 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 1477 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
1469 | 1478 |
1470 static const ParserFlag default_flags[] = { | 1479 static const ParserFlag default_flags[] = { |
1471 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, | 1480 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, |
1472 kAllowForOf, kAllowNativesSyntax | 1481 kAllowForOf, kAllowNativesSyntax |
1473 }; | 1482 }; |
1474 if (!flags) { | 1483 ParserFlag* generated_flags = NULL; |
| 1484 if (flags == NULL) { |
1475 flags = default_flags; | 1485 flags = default_flags; |
1476 flags_len = ARRAY_SIZE(default_flags); | 1486 flags_len = ARRAY_SIZE(default_flags); |
| 1487 if (always_true_flags != NULL) { |
| 1488 // Remove always_true_flags from default_flags. |
| 1489 CHECK(always_true_flags_len < flags_len); |
| 1490 generated_flags = new ParserFlag[flags_len - always_true_flags_len]; |
| 1491 int flag_index = 0; |
| 1492 for (int i = 0; i < flags_len; ++i) { |
| 1493 bool use_flag = true; |
| 1494 for (int j = 0; j < always_true_flags_len; ++j) { |
| 1495 if (flags[i] == always_true_flags[j]) { |
| 1496 use_flag = false; |
| 1497 break; |
| 1498 } |
| 1499 } |
| 1500 if (use_flag) generated_flags[flag_index++] = flags[i]; |
| 1501 } |
| 1502 CHECK(flag_index == flags_len - always_true_flags_len); |
| 1503 flags_len = flag_index; |
| 1504 flags = generated_flags; |
| 1505 } |
1477 } | 1506 } |
1478 for (int i = 0; context_data[i][0] != NULL; ++i) { | 1507 for (int i = 0; context_data[i][0] != NULL; ++i) { |
1479 for (int j = 0; statement_data[j] != NULL; ++j) { | 1508 for (int j = 0; statement_data[j] != NULL; ++j) { |
1480 int kPrefixLen = i::StrLength(context_data[i][0]); | 1509 int kPrefixLen = i::StrLength(context_data[i][0]); |
1481 int kStatementLen = i::StrLength(statement_data[j]); | 1510 int kStatementLen = i::StrLength(statement_data[j]); |
1482 int kSuffixLen = i::StrLength(context_data[i][1]); | 1511 int kSuffixLen = i::StrLength(context_data[i][1]); |
1483 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | 1512 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; |
1484 | 1513 |
1485 // Plug the source code pieces together. | 1514 // Plug the source code pieces together. |
1486 i::ScopedVector<char> program(kProgramSize + 1); | 1515 i::ScopedVector<char> program(kProgramSize + 1); |
1487 int length = i::SNPrintF(program, | 1516 int length = i::SNPrintF(program, |
1488 "%s%s%s", | 1517 "%s%s%s", |
1489 context_data[i][0], | 1518 context_data[i][0], |
1490 statement_data[j], | 1519 statement_data[j], |
1491 context_data[i][1]); | 1520 context_data[i][1]); |
1492 CHECK(length == kProgramSize); | 1521 CHECK(length == kProgramSize); |
1493 TestParserSync(program.start(), | 1522 TestParserSync(program.start(), |
1494 flags, | 1523 flags, |
1495 flags_len, | 1524 flags_len, |
1496 result); | 1525 result, |
| 1526 always_true_flags, |
| 1527 always_true_flags_len); |
1497 } | 1528 } |
1498 } | 1529 } |
| 1530 delete[] generated_flags; |
1499 } | 1531 } |
1500 | 1532 |
1501 | 1533 |
1502 TEST(ErrorsEvalAndArguments) { | 1534 TEST(ErrorsEvalAndArguments) { |
1503 // Tests that both preparsing and parsing produce the right kind of errors for | 1535 // Tests that both preparsing and parsing produce the right kind of errors for |
1504 // using "eval" and "arguments" as identifiers. Without the strict mode, it's | 1536 // using "eval" and "arguments" as identifiers. Without the strict mode, it's |
1505 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it | 1537 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it |
1506 // isn't. | 1538 // isn't. |
1507 const char* context_data[][2] = { | 1539 const char* context_data[][2] = { |
1508 { "\"use strict\";", "" }, | 1540 { "\"use strict\";", "" }, |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1757 "var foo = yield = 1;", | 1789 "var foo = yield = 1;", |
1758 "++yield;", | 1790 "++yield;", |
1759 "yield++;", | 1791 "yield++;", |
1760 NULL | 1792 NULL |
1761 }; | 1793 }; |
1762 | 1794 |
1763 RunParserSyncTest(context_data, statement_data, kError); | 1795 RunParserSyncTest(context_data, statement_data, kError); |
1764 } | 1796 } |
1765 | 1797 |
1766 | 1798 |
1767 TEST(ErrorsYield) { | 1799 TEST(NoErrorsYield) { |
1768 const char* context_data[][2] = { | 1800 const char* context_data[][2] = { |
1769 { "function * is_gen() {", "}" }, | 1801 { "function * is_gen() {", "}" }, |
1770 { NULL, NULL } | 1802 { NULL, NULL } |
1771 }; | 1803 }; |
1772 | 1804 |
1773 const char* statement_data[] = { | 1805 const char* statement_data[] = { |
1774 "yield 2;", // this is legal inside generator | 1806 "yield 2;", // this is legal inside generator |
1775 "yield * 2;", // this is legal inside generator | 1807 "yield * 2;", // this is legal inside generator |
1776 NULL | 1808 NULL |
1777 }; | 1809 }; |
1778 | 1810 |
1779 // Here we cannot assert that there is no error, since there will be without | 1811 // This test requires kAllowGenerators to succeed. |
1780 // the kAllowGenerators flag. However, we test that Parser and PreParser | 1812 static const ParserFlag always_true_flags[] = { |
1781 // produce the same errors. | 1813 kAllowGenerators |
1782 RunParserSyncTest(context_data, statement_data, kSuccessOrError); | 1814 }; |
| 1815 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 1816 always_true_flags, 1); |
1783 } | 1817 } |
1784 | 1818 |
1785 | 1819 |
1786 TEST(ErrorsNameOfStrictFunction) { | 1820 TEST(ErrorsNameOfStrictFunction) { |
1787 // Tests that illegal tokens as names of a strict function produce the correct | 1821 // Tests that illegal tokens as names of a strict function produce the correct |
1788 // errors. | 1822 // errors. |
1789 const char* context_data[][2] = { | 1823 const char* context_data[][2] = { |
1790 { "", ""}, | 1824 { "", ""}, |
1791 { "\"use strict\";", ""}, | 1825 { "\"use strict\";", ""}, |
1792 { NULL, NULL } | 1826 { NULL, NULL } |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2123 const char* context_data[][2] = { | 2157 const char* context_data[][2] = { |
2124 {"", ""}, | 2158 {"", ""}, |
2125 { NULL, NULL } | 2159 { NULL, NULL } |
2126 }; | 2160 }; |
2127 | 2161 |
2128 const char* statement_data[] = { | 2162 const char* statement_data[] = { |
2129 "%someintrinsic(arg)", | 2163 "%someintrinsic(arg)", |
2130 NULL | 2164 NULL |
2131 }; | 2165 }; |
2132 | 2166 |
2133 // Parsing will fail or succeed depending on whether we allow natives syntax | 2167 // This test requires kAllowNativesSyntax to succeed. |
2134 // or not. | 2168 static const ParserFlag always_true_flags[] = { |
2135 RunParserSyncTest(context_data, statement_data, kSuccessOrError); | 2169 kAllowNativesSyntax |
| 2170 }; |
| 2171 |
| 2172 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 2173 always_true_flags, 1); |
2136 } | 2174 } |
2137 | 2175 |
2138 | 2176 |
2139 TEST(NoErrorsNewExpression) { | 2177 TEST(NoErrorsNewExpression) { |
2140 const char* context_data[][2] = { | 2178 const char* context_data[][2] = { |
2141 {"", ""}, | 2179 {"", ""}, |
2142 {"var f =", ""}, | 2180 {"var f =", ""}, |
2143 { NULL, NULL } | 2181 { NULL, NULL } |
2144 }; | 2182 }; |
2145 | 2183 |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2542 v8::Local<v8::String> source = | 2580 v8::Local<v8::String> source = |
2543 v8::String::NewFromTwoByte(isolate, two_byte_source); | 2581 v8::String::NewFromTwoByte(isolate, two_byte_source); |
2544 v8::Local<v8::Value> result = CompileRun(source); | 2582 v8::Local<v8::Value> result = CompileRun(source); |
2545 CHECK(result->IsString()); | 2583 CHECK(result->IsString()); |
2546 v8::Local<v8::String> expected_name = | 2584 v8::Local<v8::String> expected_name = |
2547 v8::String::NewFromTwoByte(isolate, two_byte_name); | 2585 v8::String::NewFromTwoByte(isolate, two_byte_name); |
2548 CHECK(result->Equals(expected_name)); | 2586 CHECK(result->Equals(expected_name)); |
2549 i::DeleteArray(two_byte_source); | 2587 i::DeleteArray(two_byte_source); |
2550 i::DeleteArray(two_byte_name); | 2588 i::DeleteArray(two_byte_name); |
2551 } | 2589 } |
OLD | NEW |