Chromium Code Reviews| 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 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1105 parser->set_allow_harmony_scoping(flags.Contains(kAllowHarmonyScoping)); | 1105 parser->set_allow_harmony_scoping(flags.Contains(kAllowHarmonyScoping)); |
| 1106 parser->set_allow_modules(flags.Contains(kAllowModules)); | 1106 parser->set_allow_modules(flags.Contains(kAllowModules)); |
| 1107 parser->set_allow_generators(flags.Contains(kAllowGenerators)); | 1107 parser->set_allow_generators(flags.Contains(kAllowGenerators)); |
| 1108 parser->set_allow_for_of(flags.Contains(kAllowForOf)); | 1108 parser->set_allow_for_of(flags.Contains(kAllowForOf)); |
| 1109 parser->set_allow_harmony_numeric_literals( | 1109 parser->set_allow_harmony_numeric_literals( |
| 1110 flags.Contains(kAllowHarmonyNumericLiterals)); | 1110 flags.Contains(kAllowHarmonyNumericLiterals)); |
| 1111 } | 1111 } |
| 1112 | 1112 |
| 1113 | 1113 |
| 1114 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1114 void TestParserSyncWithFlags(i::Handle<i::String> source, |
| 1115 i::EnumSet<ParserFlag> flags) { | 1115 i::EnumSet<ParserFlag> flags, |
| 1116 bool assert_success, | |
|
ulan
2014/02/05 15:00:10
Maybe enum is better than two flags? Looks like th
marja
2014/02/05 15:28:12
Done.
| |
| 1117 bool assert_error) { | |
| 1116 i::Isolate* isolate = CcTest::i_isolate(); | 1118 i::Isolate* isolate = CcTest::i_isolate(); |
| 1117 i::Factory* factory = isolate->factory(); | 1119 i::Factory* factory = isolate->factory(); |
| 1118 | 1120 |
| 1119 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); | 1121 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); |
| 1120 | 1122 |
| 1121 // Preparse the data. | 1123 // Preparse the data. |
| 1122 i::CompleteParserRecorder log; | 1124 i::CompleteParserRecorder log; |
| 1123 { | 1125 { |
| 1124 i::Scanner scanner(isolate->unicode_cache()); | 1126 i::Scanner scanner(isolate->unicode_cache()); |
| 1125 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); | 1127 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1147 if (function == NULL) { | 1149 if (function == NULL) { |
| 1148 // Extract exception from the parser. | 1150 // Extract exception from the parser. |
| 1149 CHECK(isolate->has_pending_exception()); | 1151 CHECK(isolate->has_pending_exception()); |
| 1150 i::MaybeObject* maybe_object = isolate->pending_exception(); | 1152 i::MaybeObject* maybe_object = isolate->pending_exception(); |
| 1151 i::JSObject* exception = NULL; | 1153 i::JSObject* exception = NULL; |
| 1152 CHECK(maybe_object->To(&exception)); | 1154 CHECK(maybe_object->To(&exception)); |
| 1153 i::Handle<i::JSObject> exception_handle(exception); | 1155 i::Handle<i::JSObject> exception_handle(exception); |
| 1154 i::Handle<i::String> message_string = | 1156 i::Handle<i::String> message_string = |
| 1155 i::Handle<i::String>::cast(i::GetProperty(exception_handle, "message")); | 1157 i::Handle<i::String>::cast(i::GetProperty(exception_handle, "message")); |
| 1156 | 1158 |
| 1159 if (assert_success) { | |
| 1160 i::OS::Print( | |
| 1161 "Parser failed on:\n" | |
| 1162 "\t%s\n" | |
| 1163 "with error:\n" | |
| 1164 "\t%s\n" | |
| 1165 "However, we expected no error.", | |
| 1166 source->ToCString().get(), message_string->ToCString().get()); | |
| 1167 CHECK(false); | |
| 1168 } | |
| 1169 | |
| 1157 if (!data.has_error()) { | 1170 if (!data.has_error()) { |
| 1158 i::OS::Print( | 1171 i::OS::Print( |
| 1159 "Parser failed on:\n" | 1172 "Parser failed on:\n" |
| 1160 "\t%s\n" | 1173 "\t%s\n" |
| 1161 "with error:\n" | 1174 "with error:\n" |
| 1162 "\t%s\n" | 1175 "\t%s\n" |
| 1163 "However, the preparser succeeded", | 1176 "However, the preparser succeeded", |
| 1164 source->ToCString().get(), message_string->ToCString().get()); | 1177 source->ToCString().get(), message_string->ToCString().get()); |
| 1165 CHECK(false); | 1178 CHECK(false); |
| 1166 } | 1179 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1180 } | 1193 } |
| 1181 } else if (data.has_error()) { | 1194 } else if (data.has_error()) { |
| 1182 i::OS::Print( | 1195 i::OS::Print( |
| 1183 "Preparser failed on:\n" | 1196 "Preparser failed on:\n" |
| 1184 "\t%s\n" | 1197 "\t%s\n" |
| 1185 "with error:\n" | 1198 "with error:\n" |
| 1186 "\t%s\n" | 1199 "\t%s\n" |
| 1187 "However, the parser succeeded", | 1200 "However, the parser succeeded", |
| 1188 source->ToCString().get(), FormatMessage(&data)->ToCString().get()); | 1201 source->ToCString().get(), FormatMessage(&data)->ToCString().get()); |
| 1189 CHECK(false); | 1202 CHECK(false); |
| 1203 } else if (assert_error) { | |
| 1204 i::OS::Print( | |
| 1205 "Expected error on:\n" | |
| 1206 "\t%s\n" | |
| 1207 "However, parser and preparser succeeded", | |
| 1208 source->ToCString().get()); | |
| 1209 CHECK(false); | |
| 1190 } | 1210 } |
| 1191 } | 1211 } |
| 1192 | 1212 |
| 1193 | 1213 |
| 1194 void TestParserSync(const char* source, | 1214 void TestParserSync(const char* source, |
| 1195 const ParserFlag* flag_list, | 1215 const ParserFlag* flag_list, |
| 1196 size_t flag_list_length) { | 1216 size_t flag_list_length, |
| 1217 bool assert_success = false, | |
| 1218 bool assert_error = false) { | |
| 1197 i::Handle<i::String> str = | 1219 i::Handle<i::String> str = |
| 1198 CcTest::i_isolate()->factory()->NewStringFromAscii(i::CStrVector(source)); | 1220 CcTest::i_isolate()->factory()->NewStringFromAscii(i::CStrVector(source)); |
| 1199 for (int bits = 0; bits < (1 << flag_list_length); bits++) { | 1221 for (int bits = 0; bits < (1 << flag_list_length); bits++) { |
| 1200 i::EnumSet<ParserFlag> flags; | 1222 i::EnumSet<ParserFlag> flags; |
| 1201 for (size_t flag_index = 0; flag_index < flag_list_length; flag_index++) { | 1223 for (size_t flag_index = 0; flag_index < flag_list_length; flag_index++) { |
| 1202 if ((bits & (1 << flag_index)) != 0) flags.Add(flag_list[flag_index]); | 1224 if ((bits & (1 << flag_index)) != 0) flags.Add(flag_list[flag_index]); |
| 1203 } | 1225 } |
| 1204 TestParserSyncWithFlags(str, flags); | 1226 TestParserSyncWithFlags(str, flags, assert_success, assert_error); |
| 1205 } | 1227 } |
| 1206 } | 1228 } |
| 1207 | 1229 |
| 1208 | 1230 |
| 1209 TEST(ParserSync) { | 1231 TEST(ParserSync) { |
| 1210 const char* context_data[][2] = { | 1232 const char* context_data[][2] = { |
| 1211 { "", "" }, | 1233 { "", "" }, |
| 1212 { "{", "}" }, | 1234 { "{", "}" }, |
| 1213 { "if (true) ", " else {}" }, | 1235 { "if (true) ", " else {}" }, |
| 1214 { "if (true) {} else ", "" }, | 1236 { "if (true) {} else ", "" }, |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1340 " }; \n" | 1362 " }; \n" |
| 1341 "}; \n"; | 1363 "}; \n"; |
| 1342 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), script)); | 1364 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), script)); |
| 1343 CHECK(try_catch.HasCaught()); | 1365 CHECK(try_catch.HasCaught()); |
| 1344 v8::String::Utf8Value exception(try_catch.Exception()); | 1366 v8::String::Utf8Value exception(try_catch.Exception()); |
| 1345 CHECK_EQ("SyntaxError: Octal literals are not allowed in strict mode.", | 1367 CHECK_EQ("SyntaxError: Octal literals are not allowed in strict mode.", |
| 1346 *exception); | 1368 *exception); |
| 1347 } | 1369 } |
| 1348 | 1370 |
| 1349 | 1371 |
| 1372 void RunParserSyncTest(const char* context_data[][2], | |
| 1373 const char* statement_data[], | |
| 1374 bool assert_success, | |
| 1375 bool assert_error) { | |
| 1376 v8::HandleScope handles(CcTest::isolate()); | |
| 1377 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | |
| 1378 v8::Context::Scope context_scope(context); | |
| 1379 | |
| 1380 int marker; | |
| 1381 CcTest::i_isolate()->stack_guard()->SetStackLimit( | |
| 1382 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | |
| 1383 | |
| 1384 static const ParserFlag flags[] = { | |
| 1385 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, | |
| 1386 kAllowForOf | |
| 1387 }; | |
| 1388 for (int i = 0; context_data[i][0] != NULL; ++i) { | |
| 1389 for (int j = 0; statement_data[j] != NULL; ++j) { | |
| 1390 int kPrefixLen = i::StrLength(context_data[i][0]); | |
| 1391 int kStatementLen = i::StrLength(statement_data[j]); | |
| 1392 int kSuffixLen = i::StrLength(context_data[i][1]); | |
| 1393 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | |
| 1394 | |
| 1395 // Plug the source code pieces together. | |
| 1396 i::ScopedVector<char> program(kProgramSize + 1); | |
| 1397 int length = i::OS::SNPrintF(program, | |
| 1398 "%s%s%s", | |
| 1399 context_data[i][0], | |
| 1400 statement_data[j], | |
| 1401 context_data[i][1]); | |
| 1402 CHECK(length == kProgramSize); | |
| 1403 TestParserSync(program.start(), | |
| 1404 flags, | |
| 1405 ARRAY_SIZE(flags), | |
| 1406 assert_success, | |
| 1407 assert_error); | |
| 1408 } | |
| 1409 } | |
| 1410 } | |
| 1411 | |
| 1412 | |
| 1350 TEST(ErrorsEvalAndArguments) { | 1413 TEST(ErrorsEvalAndArguments) { |
| 1351 // Tests that both preparsing and parsing produce the right kind of errors for | 1414 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1352 // using "eval" and "arguments" as identifiers. Without the strict mode, it's | 1415 // using "eval" and "arguments" as identifiers. Without the strict mode, it's |
| 1353 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it | 1416 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it |
| 1354 // isn't. | 1417 // isn't. |
| 1355 const char* context_data[][2] = { | 1418 const char* context_data[][2] = { |
| 1356 { "", "" }, | 1419 { "\"use strict\";", "" }, |
| 1357 { "\"use strict\";", "}" }, | |
| 1358 { "var eval; function test_func() {", "}"}, | |
| 1359 { "var eval; function test_func() {\"use strict\"; ", "}"}, | 1420 { "var eval; function test_func() {\"use strict\"; ", "}"}, |
| 1360 { NULL, NULL } | 1421 { NULL, NULL } |
| 1361 }; | 1422 }; |
| 1362 | 1423 |
| 1363 const char* statement_data[] = { | 1424 const char* statement_data[] = { |
| 1364 "var eval;", | 1425 "var eval;", |
| 1365 "var arguments", | 1426 "var arguments", |
| 1366 "var foo, eval;", | 1427 "var foo, eval;", |
| 1367 "var foo, arguments;", | 1428 "var foo, arguments;", |
| 1368 "try { } catch (eval) { }", | 1429 "try { } catch (eval) { }", |
| 1369 "try { } catch (arguments) { }", | 1430 "try { } catch (arguments) { }", |
| 1370 "function eval() { }", | 1431 "function eval() { }", |
| 1371 "function arguments() { }", | 1432 "function arguments() { }", |
| 1372 "function foo(eval) { }", | 1433 "function foo(eval) { }", |
| 1373 "function foo(arguments) { }", | 1434 "function foo(arguments) { }", |
| 1374 "function foo(bar, eval) { }", | 1435 "function foo(bar, eval) { }", |
| 1375 "function foo(bar, arguments) { }", | 1436 "function foo(bar, arguments) { }", |
| 1376 "eval = 1;", | 1437 "eval = 1;", |
| 1377 "arguments = 1;", | 1438 "arguments = 1;", |
| 1378 "var foo = eval = 1;", | 1439 "var foo = eval = 1;", |
| 1379 "var foo = arguments = 1;", | 1440 "var foo = arguments = 1;", |
| 1380 "++eval;", | 1441 "++eval;", |
| 1381 "++arguments;", | 1442 "++arguments;", |
| 1382 "eval++;", | 1443 "eval++;", |
| 1383 "arguments++;", | 1444 "arguments++;", |
| 1384 NULL | 1445 NULL |
| 1385 }; | 1446 }; |
| 1386 | 1447 |
| 1387 v8::HandleScope handles(CcTest::isolate()); | 1448 RunParserSyncTest(context_data, statement_data, false, true); |
| 1388 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | |
| 1389 v8::Context::Scope context_scope(context); | |
| 1390 | |
| 1391 int marker; | |
| 1392 CcTest::i_isolate()->stack_guard()->SetStackLimit( | |
| 1393 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | |
| 1394 | |
| 1395 static const ParserFlag flags[] = { | |
| 1396 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, | |
| 1397 kAllowForOf | |
| 1398 }; | |
| 1399 for (int i = 0; context_data[i][0] != NULL; ++i) { | |
| 1400 for (int j = 0; statement_data[j] != NULL; ++j) { | |
| 1401 int kPrefixLen = i::StrLength(context_data[i][0]); | |
| 1402 int kStatementLen = i::StrLength(statement_data[j]); | |
| 1403 int kSuffixLen = i::StrLength(context_data[i][1]); | |
| 1404 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | |
| 1405 | |
| 1406 // Plug the source code pieces together. | |
| 1407 i::ScopedVector<char> program(kProgramSize + 1); | |
| 1408 int length = i::OS::SNPrintF(program, | |
| 1409 "%s%s%s", | |
| 1410 context_data[i][0], | |
| 1411 statement_data[j], | |
| 1412 context_data[i][1]); | |
| 1413 CHECK(length == kProgramSize); | |
| 1414 TestParserSync(program.start(), flags, ARRAY_SIZE(flags)); | |
| 1415 } | |
| 1416 } | |
| 1417 } | 1449 } |
| 1418 | 1450 |
| 1419 | 1451 |
| 1452 TEST(NoErrorsEvalAndArgumentsClassic) { | |
| 1453 // Tests that both preparsing and parsing accept "eval" and "arguments" as | |
| 1454 // identifiers when needed. | |
| 1455 const char* context_data[][2] = { | |
| 1456 { "", "" }, | |
| 1457 { "function test_func() {", "}"}, | |
| 1458 { NULL, NULL } | |
| 1459 }; | |
| 1460 | |
| 1461 const char* statement_data[] = { | |
| 1462 "var eval;", | |
| 1463 "var arguments", | |
| 1464 "var foo, eval;", | |
| 1465 "var foo, arguments;", | |
| 1466 "try { } catch (eval) { }", | |
| 1467 "try { } catch (arguments) { }", | |
| 1468 "function eval() { }", | |
| 1469 "function arguments() { }", | |
| 1470 "function foo(eval) { }", | |
| 1471 "function foo(arguments) { }", | |
| 1472 "function foo(bar, eval) { }", | |
| 1473 "function foo(bar, arguments) { }", | |
| 1474 "eval = 1;", | |
| 1475 "arguments = 1;", | |
| 1476 "var foo = eval = 1;", | |
| 1477 "var foo = arguments = 1;", | |
| 1478 "++eval;", | |
| 1479 "++arguments;", | |
| 1480 "eval++;", | |
| 1481 "arguments++;", | |
| 1482 NULL | |
| 1483 }; | |
| 1484 | |
| 1485 RunParserSyncTest(context_data, statement_data, true, false); | |
| 1486 } | |
| 1487 | |
| 1488 | |
| 1489 TEST(NoErrorsEvalAndArgumentsStrict) { | |
| 1490 const char* context_data[][2] = { | |
| 1491 { "\"use strict\";", "" }, | |
| 1492 { "function test_func() { \"use strict\";", "}" }, | |
| 1493 { NULL, NULL } | |
| 1494 }; | |
| 1495 | |
| 1496 const char* statement_data[] = { | |
| 1497 "eval;", | |
| 1498 "arguments;", | |
| 1499 "var foo = eval;", | |
| 1500 "var foo = arguments;", | |
| 1501 "var foo = { eval: 1 };", | |
| 1502 "var foo = { arguments: 1 };", | |
| 1503 "var foo = { }; foo.eval = {};", | |
| 1504 "var foo = { }; foo.arguments = {};", | |
| 1505 NULL | |
| 1506 }; | |
| 1507 | |
| 1508 RunParserSyncTest(context_data, statement_data, true, false); | |
| 1509 } | |
| 1510 | |
| 1511 | |
| 1420 TEST(ErrorsFutureStrictReservedWords) { | 1512 TEST(ErrorsFutureStrictReservedWords) { |
| 1421 // Tests that both preparsing and parsing produce the right kind of errors for | 1513 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1422 // using future strict reserved words as identifiers. Without the strict mode, | 1514 // using future strict reserved words as identifiers. Without the strict mode, |
| 1423 // it's ok to use future strict reserved words as identifiers. With the strict | 1515 // it's ok to use future strict reserved words as identifiers. With the strict |
| 1424 // mode, it isn't. | 1516 // mode, it isn't. |
| 1425 const char* context_data[][2] = { | 1517 const char* context_data[][2] = { |
| 1426 { "", "" }, | 1518 { "\"use strict\";", "" }, |
| 1427 { "\"use strict\";", "}" }, | 1519 { "function test_func() {\"use strict\"; ", "}"}, |
| 1428 { "var eval; function test_func() {", "}"}, | |
| 1429 { "var eval; function test_func() {\"use strict\"; ", "}"}, | |
| 1430 { NULL, NULL } | 1520 { NULL, NULL } |
| 1431 }; | 1521 }; |
| 1432 | 1522 |
| 1433 const char* statement_data[] = { | 1523 const char* statement_data[] = { |
| 1434 "var interface;", | 1524 "var interface;", |
| 1435 "var foo, interface;", | 1525 "var foo, interface;", |
| 1436 "try { } catch (interface) { }", | 1526 "try { } catch (interface) { }", |
| 1437 "function interface() { }", | 1527 "function interface() { }", |
| 1438 "function foo(interface) { }", | 1528 "function foo(interface) { }", |
| 1439 "function foo(bar, interface) { }", | 1529 "function foo(bar, interface) { }", |
| 1440 "interface = 1;", | 1530 "interface = 1;", |
| 1441 "var foo = interface = 1;", | 1531 "var foo = interface = 1;", |
| 1442 "++interface;", | 1532 "++interface;", |
| 1443 "interface++;", | 1533 "interface++;", |
| 1444 NULL | 1534 NULL |
| 1445 }; | 1535 }; |
| 1446 | 1536 |
| 1447 v8::HandleScope handles(CcTest::isolate()); | 1537 RunParserSyncTest(context_data, statement_data, false, true); |
| 1448 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | |
| 1449 v8::Context::Scope context_scope(context); | |
| 1450 | |
| 1451 int marker; | |
| 1452 CcTest::i_isolate()->stack_guard()->SetStackLimit( | |
| 1453 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | |
| 1454 | |
| 1455 static const ParserFlag flags[] = { | |
| 1456 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, | |
| 1457 kAllowForOf | |
| 1458 }; | |
| 1459 for (int i = 0; context_data[i][0] != NULL; ++i) { | |
| 1460 for (int j = 0; statement_data[j] != NULL; ++j) { | |
| 1461 int kPrefixLen = i::StrLength(context_data[i][0]); | |
| 1462 int kStatementLen = i::StrLength(statement_data[j]); | |
| 1463 int kSuffixLen = i::StrLength(context_data[i][1]); | |
| 1464 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | |
| 1465 | |
| 1466 // Plug the source code pieces together. | |
| 1467 i::ScopedVector<char> program(kProgramSize + 1); | |
| 1468 int length = i::OS::SNPrintF(program, | |
| 1469 "%s%s%s", | |
| 1470 context_data[i][0], | |
| 1471 statement_data[j], | |
| 1472 context_data[i][1]); | |
| 1473 CHECK(length == kProgramSize); | |
| 1474 TestParserSync(program.start(), flags, ARRAY_SIZE(flags)); | |
| 1475 } | |
| 1476 } | |
| 1477 } | 1538 } |
| 1478 | 1539 |
| 1479 | 1540 |
| 1541 TEST(NoErrorsFutureStrictReservedWords) { | |
| 1542 const char* context_data[][2] = { | |
| 1543 { "", "" }, | |
| 1544 { "function test_func() {", "}"}, | |
| 1545 { NULL, NULL } | |
| 1546 }; | |
| 1547 | |
| 1548 const char* statement_data[] = { | |
| 1549 "var interface;", | |
| 1550 "var foo, interface;", | |
| 1551 "try { } catch (interface) { }", | |
| 1552 "function interface() { }", | |
| 1553 "function foo(interface) { }", | |
| 1554 "function foo(bar, interface) { }", | |
| 1555 "interface = 1;", | |
| 1556 "var foo = interface = 1;", | |
| 1557 "++interface;", | |
| 1558 "interface++;", | |
| 1559 NULL | |
| 1560 }; | |
| 1561 | |
| 1562 RunParserSyncTest(context_data, statement_data, true, false); | |
| 1563 } | |
| 1564 | |
| 1565 | |
| 1480 TEST(ErrorsReservedWords) { | 1566 TEST(ErrorsReservedWords) { |
| 1481 // Tests that both preparsing and parsing produce the right kind of errors for | 1567 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1482 // using future reserved words as identifiers. These tests don't depend on the | 1568 // using future reserved words as identifiers. These tests don't depend on the |
| 1483 // strict mode. | 1569 // strict mode. |
| 1484 const char* context_data[][2] = { | 1570 const char* context_data[][2] = { |
| 1485 { "", "" }, | 1571 { "", "" }, |
| 1486 { "\"use strict\";", "}" }, | 1572 { "\"use strict\";", "" }, |
| 1487 { "var eval; function test_func() {", "}"}, | 1573 { "var eval; function test_func() {", "}"}, |
| 1488 { "var eval; function test_func() {\"use strict\"; ", "}"}, | 1574 { "var eval; function test_func() {\"use strict\"; ", "}"}, |
| 1489 { NULL, NULL } | 1575 { NULL, NULL } |
| 1490 }; | 1576 }; |
| 1491 | 1577 |
| 1492 const char* statement_data[] = { | 1578 const char* statement_data[] = { |
| 1493 "var super;", | 1579 "var super;", |
| 1494 "var foo, super;", | 1580 "var foo, super;", |
| 1495 "try { } catch (super) { }", | 1581 "try { } catch (super) { }", |
| 1496 "function super() { }", | 1582 "function super() { }", |
| 1497 "function foo(super) { }", | 1583 "function foo(super) { }", |
| 1498 "function foo(bar, super) { }", | 1584 "function foo(bar, super) { }", |
| 1499 "super = 1;", | 1585 "super = 1;", |
| 1500 "var foo = super = 1;", | 1586 "var foo = super = 1;", |
| 1501 "++super;", | 1587 "++super;", |
| 1502 "super++;", | 1588 "super++;", |
| 1503 "function foo super", | 1589 "function foo super", |
| 1504 NULL | 1590 NULL |
| 1505 }; | 1591 }; |
| 1506 | 1592 |
| 1507 v8::HandleScope handles(CcTest::isolate()); | 1593 RunParserSyncTest(context_data, statement_data, false, true); |
| 1508 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | |
| 1509 v8::Context::Scope context_scope(context); | |
| 1510 | |
| 1511 int marker; | |
| 1512 CcTest::i_isolate()->stack_guard()->SetStackLimit( | |
| 1513 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | |
| 1514 | |
| 1515 static const ParserFlag flags[] = { | |
| 1516 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, | |
| 1517 kAllowForOf | |
| 1518 }; | |
| 1519 for (int i = 0; context_data[i][0] != NULL; ++i) { | |
| 1520 for (int j = 0; statement_data[j] != NULL; ++j) { | |
| 1521 int kPrefixLen = i::StrLength(context_data[i][0]); | |
| 1522 int kStatementLen = i::StrLength(statement_data[j]); | |
| 1523 int kSuffixLen = i::StrLength(context_data[i][1]); | |
| 1524 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | |
| 1525 | |
| 1526 // Plug the source code pieces together. | |
| 1527 i::ScopedVector<char> program(kProgramSize + 1); | |
| 1528 int length = i::OS::SNPrintF(program, | |
| 1529 "%s%s%s", | |
| 1530 context_data[i][0], | |
| 1531 statement_data[j], | |
| 1532 context_data[i][1]); | |
| 1533 CHECK(length == kProgramSize); | |
| 1534 TestParserSync(program.start(), flags, ARRAY_SIZE(flags)); | |
| 1535 } | |
| 1536 } | |
| 1537 } | 1594 } |
| 1538 | 1595 |
| 1539 | 1596 |
| 1540 TEST(ErrorsYield) { | 1597 TEST(NoErrorsYieldClassic) { |
| 1541 // Tests that both preparsing and parsing produce the right kind of errors for | 1598 // In classic mode, it's okay to use "yield" as identifier, *except* inside a |
| 1542 // using yield as identifier. In non-strict mode, it's okay to use "yield" as | 1599 // generator (see next test). |
| 1543 // an identifier, *except* inside a generator function. In strict mode, it's | |
| 1544 // never okay. | |
| 1545 const char* context_data[][2] = { | 1600 const char* context_data[][2] = { |
| 1546 { "", "" }, | 1601 { "", "" }, |
| 1547 { "\"use strict\";", "}" }, | |
| 1548 { "var eval; function test_func() {", "}"}, | |
| 1549 { "var eval; function test_func() {\"use strict\"; ", "}"}, | |
| 1550 { "function is_not_gen() {", "}" }, | 1602 { "function is_not_gen() {", "}" }, |
| 1551 { "function * is_gen() {", "}" }, | |
| 1552 { "\"use strict\"; function is_not_gen() {", "}" }, | |
| 1553 { "\"use strict\"; function * is_gen() {", "}" }, | |
| 1554 { NULL, NULL } | 1603 { NULL, NULL } |
| 1555 }; | 1604 }; |
| 1556 | 1605 |
| 1606 const char* statement_data[] = { | |
| 1607 "var yield;", | |
| 1608 "var foo, yield;", | |
| 1609 "try { } catch (yield) { }", | |
| 1610 "function yield() { }", | |
| 1611 "function foo(yield) { }", | |
| 1612 "function foo(bar, yield) { }", | |
| 1613 "yield = 1;", | |
| 1614 "var foo = yield = 1;", | |
| 1615 "++yield;", | |
| 1616 "yield++;", | |
| 1617 NULL | |
| 1618 }; | |
| 1619 | |
| 1620 RunParserSyncTest(context_data, statement_data, true, false); | |
| 1621 } | |
| 1622 | |
| 1623 | |
| 1624 TEST(ErrorsYieldClassicGenerator) { | |
| 1625 const char* context_data[][2] = { | |
| 1626 { "function * is_gen() {", "}" }, | |
| 1627 { NULL, NULL } | |
| 1628 }; | |
| 1629 | |
| 1630 const char* statement_data[] = { | |
| 1631 "var yield;", | |
| 1632 "var foo, yield;", | |
| 1633 "try { } catch (yield) { }", | |
| 1634 "function yield() { }", | |
| 1635 // BUG: These should not be allowed, but they are (if kAllowGenerators is | |
| 1636 // set) | |
| 1637 // "function foo(yield) { }", | |
| 1638 // "function foo(bar, yield) { }", | |
| 1639 "yield = 1;", | |
| 1640 "var foo = yield = 1;", | |
| 1641 "++yield;", | |
| 1642 "yield++;", | |
| 1643 NULL | |
| 1644 }; | |
| 1645 | |
| 1646 // If generators are not allowed, the error will be produced at the '*' token, | |
| 1647 // so this test works both with and without the kAllowGenerators flag. | |
| 1648 RunParserSyncTest(context_data, statement_data, false, true); | |
| 1649 } | |
| 1650 | |
| 1651 | |
| 1652 TEST(ErrorsYieldStrict) { | |
| 1653 const char* context_data[][2] = { | |
| 1654 { "\"use strict\";", "" }, | |
| 1655 { "\"use strict\"; function is_not_gen() {", "}" }, | |
| 1656 { "function test_func() {\"use strict\"; ", "}"}, | |
| 1657 { NULL, NULL } | |
| 1658 }; | |
| 1659 | |
| 1557 const char* statement_data[] = { | 1660 const char* statement_data[] = { |
| 1558 "var yield;", | 1661 "var yield;", |
| 1559 "var foo, yield;", | 1662 "var foo, yield;", |
| 1560 "try { } catch (yield) { }", | 1663 "try { } catch (yield) { }", |
| 1561 "function yield() { }", | 1664 "function yield() { }", |
| 1562 "function foo(yield) { }", | 1665 "function foo(yield) { }", |
| 1563 "function foo(bar, yield) { }", | 1666 "function foo(bar, yield) { }", |
| 1564 "yield = 1;", | 1667 "yield = 1;", |
| 1565 "var foo = yield = 1;", | 1668 "var foo = yield = 1;", |
| 1566 "++yield;", | 1669 "++yield;", |
| 1567 "yield++;", | 1670 "yield++;", |
| 1671 NULL | |
| 1672 }; | |
| 1673 | |
| 1674 RunParserSyncTest(context_data, statement_data, false, true); | |
| 1675 } | |
| 1676 | |
| 1677 | |
| 1678 TEST(ErrorsYield) { | |
| 1679 const char* context_data[][2] = { | |
| 1680 { "function * is_gen() {", "}" }, | |
| 1681 { NULL, NULL } | |
| 1682 }; | |
| 1683 | |
| 1684 const char* statement_data[] = { | |
| 1568 "yield 2;", // this is legal inside generator | 1685 "yield 2;", // this is legal inside generator |
| 1569 "yield * 2;", // this is legal inside generator | 1686 "yield * 2;", // this is legal inside generator |
| 1570 NULL | 1687 NULL |
| 1571 }; | 1688 }; |
| 1572 | 1689 |
| 1573 v8::HandleScope handles(CcTest::isolate()); | 1690 // Here we cannot assert that there is no error, since there will be without |
| 1574 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 1691 // the kAllowGenerators flag. However, we test that Parser and PreParser err |
| 1575 v8::Context::Scope context_scope(context); | 1692 // the same way. |
| 1576 | 1693 RunParserSyncTest(context_data, statement_data, false, false); |
| 1577 int marker; | |
| 1578 CcTest::i_isolate()->stack_guard()->SetStackLimit( | |
| 1579 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | |
| 1580 | |
| 1581 static const ParserFlag flags[] = { | |
| 1582 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, | |
| 1583 kAllowForOf | |
| 1584 }; | |
| 1585 for (int i = 0; context_data[i][0] != NULL; ++i) { | |
| 1586 for (int j = 0; statement_data[j] != NULL; ++j) { | |
| 1587 int kPrefixLen = i::StrLength(context_data[i][0]); | |
| 1588 int kStatementLen = i::StrLength(statement_data[j]); | |
| 1589 int kSuffixLen = i::StrLength(context_data[i][1]); | |
| 1590 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | |
| 1591 | |
| 1592 // Plug the source code pieces together. | |
| 1593 i::ScopedVector<char> program(kProgramSize + 1); | |
| 1594 int length = i::OS::SNPrintF(program, | |
| 1595 "%s%s%s", | |
| 1596 context_data[i][0], | |
| 1597 statement_data[j], | |
| 1598 context_data[i][1]); | |
| 1599 CHECK(length == kProgramSize); | |
| 1600 TestParserSync(program.start(), flags, ARRAY_SIZE(flags)); | |
| 1601 } | |
| 1602 } | |
| 1603 } | 1694 } |
| 1604 | 1695 |
| 1605 | 1696 |
| 1606 TEST(ErrorsNameOfStrictFunction) { | 1697 TEST(ErrorsNameOfStrictFunction) { |
| 1607 // Tests that illegal tokens as names of a strict function produce the correct | 1698 // Tests that illegal tokens as names of a strict function produce the correct |
| 1608 // errors. | 1699 // errors. |
| 1700 const char* context_data[][2] = { | |
| 1701 { "", ""}, | |
| 1702 { "\"use strict\";", ""}, | |
| 1703 { NULL, NULL } | |
| 1704 }; | |
| 1705 | |
| 1609 const char* statement_data[] = { | 1706 const char* statement_data[] = { |
| 1610 "function eval() { }", // legal | 1707 "function eval() {\"use strict\";}", |
| 1611 "function eval() {\"use strict\";}", // illegal | 1708 "function arguments() {\"use strict\";}", |
| 1612 "function arguments() { }", // legal | 1709 "function interface() {\"use strict\";}", |
| 1613 "function arguments() {\"use strict\";}", // illegal | 1710 "function yield() {\"use strict\";}", |
| 1614 // Future reserved words are always illegal | 1711 // Future reserved words are always illegal |
| 1615 "function super() { }", // illegal | 1712 "function super() { }", |
| 1616 "function super() {\"use strict\";}", // illegal | 1713 "function super() {\"use strict\";}", |
| 1617 "function interface() { }", // legal | |
| 1618 "function interface() {\"use strict\";}", // illegal | |
| 1619 "function yield() { }", // legal | |
| 1620 "function yield() {\"use strict\";}", // illegal | |
| 1621 NULL | 1714 NULL |
| 1622 }; | 1715 }; |
| 1623 | 1716 |
| 1624 v8::HandleScope handles(CcTest::isolate()); | 1717 RunParserSyncTest(context_data, statement_data, false, true); |
| 1625 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | |
| 1626 v8::Context::Scope context_scope(context); | |
| 1627 | |
| 1628 int marker; | |
| 1629 CcTest::i_isolate()->stack_guard()->SetStackLimit( | |
| 1630 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | |
| 1631 | |
| 1632 static const ParserFlag flags[] = { | |
| 1633 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, | |
| 1634 kAllowForOf | |
| 1635 }; | |
| 1636 for (int j = 0; statement_data[j] != NULL; ++j) { | |
| 1637 TestParserSync(statement_data[j], flags, ARRAY_SIZE(flags)); | |
| 1638 } | |
| 1639 } | 1718 } |
| 1640 | 1719 |
| 1641 | 1720 |
| 1642 TEST(ErrorsIllegalWordsAsLabels) { | 1721 TEST(NoErrorsNameOfStrictFunction) { |
| 1722 const char* context_data[][2] = { | |
| 1723 { "", ""}, | |
| 1724 { NULL, NULL } | |
| 1725 }; | |
| 1726 | |
| 1727 const char* statement_data[] = { | |
| 1728 "function eval() { }", | |
| 1729 "function arguments() { }", | |
| 1730 "function interface() { }", | |
| 1731 "function yield() { }", | |
| 1732 NULL | |
| 1733 }; | |
| 1734 | |
| 1735 RunParserSyncTest(context_data, statement_data, true, false); | |
| 1736 } | |
| 1737 | |
| 1738 | |
| 1739 | |
| 1740 TEST(ErrorsIllegalWordsAsLabelsClassic) { | |
| 1643 // Tests that illegal tokens as labels produce the correct errors. | 1741 // Tests that illegal tokens as labels produce the correct errors. |
| 1644 const char* context_data[][2] = { | 1742 const char* context_data[][2] = { |
| 1645 { "", "" }, | 1743 { "", ""}, |
| 1646 { "\"use strict\";", "}" }, | 1744 { "function test_func() {", "}" }, |
| 1745 { NULL, NULL } | |
| 1746 }; | |
| 1747 | |
| 1748 const char* statement_data[] = { | |
| 1749 "super: while(true) { break super; }", | |
| 1750 NULL | |
| 1751 }; | |
| 1752 | |
| 1753 RunParserSyncTest(context_data, statement_data, false, true); | |
| 1754 } | |
| 1755 | |
| 1756 | |
| 1757 TEST(ErrorsIllegalWordsAsLabelsStrict) { | |
| 1758 // Tests that illegal tokens as labels produce the correct errors. | |
| 1759 const char* context_data[][2] = { | |
| 1760 { "\"use strict\";", "" }, | |
| 1761 { "function test_func() {\"use strict\"; ", "}"}, | |
| 1762 { NULL, NULL } | |
| 1763 }; | |
| 1764 | |
| 1765 const char* statement_data[] = { | |
| 1766 "super: while(true) { break super; }", | |
| 1767 "interface: while(true) { break interface; }", | |
| 1768 "yield: while(true) { break yield; }", | |
| 1769 NULL | |
| 1770 }; | |
| 1771 | |
| 1772 RunParserSyncTest(context_data, statement_data, false, true); | |
| 1773 } | |
| 1774 | |
| 1775 | |
| 1776 TEST(NoErrorsIllegalWordsAsLabels) { | |
| 1777 // Using eval and arguments as labels is legal even in strict mode. | |
| 1778 const char* context_data[][2] = { | |
| 1779 { "", ""}, | |
| 1780 { "function test_func() {", "}" }, | |
| 1781 { "\"use strict\";", "" }, | |
| 1782 { "\"use strict\"; function test_func() {", "}" }, | |
| 1647 { NULL, NULL } | 1783 { NULL, NULL } |
| 1648 }; | 1784 }; |
| 1649 | 1785 |
| 1650 const char* statement_data[] = { | 1786 const char* statement_data[] = { |
| 1651 "mylabel: while(true) { break mylabel; }", | 1787 "mylabel: while(true) { break mylabel; }", |
| 1652 "eval: while(true) { break eval; }", | 1788 "eval: while(true) { break eval; }", |
| 1653 "arguments: while(true) { break arguments; }", | 1789 "arguments: while(true) { break arguments; }", |
| 1654 "super: while(true) { break super; }", // always illegal | |
| 1655 "interface: while(true) { break interface; }", | |
| 1656 "yield: while(true) { break yield; }", | |
| 1657 NULL | 1790 NULL |
| 1658 }; | 1791 }; |
| 1659 | 1792 |
| 1660 v8::HandleScope handles(CcTest::isolate()); | 1793 RunParserSyncTest(context_data, statement_data, true, false); |
| 1661 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | |
| 1662 v8::Context::Scope context_scope(context); | |
| 1663 | |
| 1664 int marker; | |
| 1665 CcTest::i_isolate()->stack_guard()->SetStackLimit( | |
| 1666 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | |
| 1667 | |
| 1668 static const ParserFlag flags[] = { | |
| 1669 kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators, | |
| 1670 kAllowForOf | |
| 1671 }; | |
| 1672 for (int i = 0; context_data[i][0] != NULL; ++i) { | |
| 1673 for (int j = 0; statement_data[j] != NULL; ++j) { | |
| 1674 int kPrefixLen = i::StrLength(context_data[i][0]); | |
| 1675 int kStatementLen = i::StrLength(statement_data[j]); | |
| 1676 int kSuffixLen = i::StrLength(context_data[i][1]); | |
| 1677 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | |
| 1678 | |
| 1679 // Plug the source code pieces together. | |
| 1680 i::ScopedVector<char> program(kProgramSize + 1); | |
| 1681 int length = i::OS::SNPrintF(program, | |
| 1682 "%s%s%s", | |
| 1683 context_data[i][0], | |
| 1684 statement_data[j], | |
| 1685 context_data[i][1]); | |
| 1686 CHECK(length == kProgramSize); | |
| 1687 TestParserSync(program.start(), flags, ARRAY_SIZE(flags)); | |
| 1688 } | |
| 1689 } | |
| 1690 } | 1794 } |
| OLD | NEW |