| 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 |