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

Side by Side Diff: test/cctest/test-parsing.cc

Issue 1007783002: Remove --harmony-scoping flag. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: CR feedback Created 5 years, 9 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
« no previous file with comments | « test/cctest/test-decls.cc ('k') | test/cctest/test-serialize.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 i::byte buffer[32]; 65 i::byte buffer[32];
66 for (int i = 0; (key_token = keywords[i]).keyword != NULL; i++) { 66 for (int i = 0; (key_token = keywords[i]).keyword != NULL; i++) {
67 const i::byte* keyword = 67 const i::byte* keyword =
68 reinterpret_cast<const i::byte*>(key_token.keyword); 68 reinterpret_cast<const i::byte*>(key_token.keyword);
69 int length = i::StrLength(key_token.keyword); 69 int length = i::StrLength(key_token.keyword);
70 CHECK(static_cast<int>(sizeof(buffer)) >= length); 70 CHECK(static_cast<int>(sizeof(buffer)) >= length);
71 { 71 {
72 i::Utf8ToUtf16CharacterStream stream(keyword, length); 72 i::Utf8ToUtf16CharacterStream stream(keyword, length);
73 i::Scanner scanner(&unicode_cache); 73 i::Scanner scanner(&unicode_cache);
74 // The scanner should parse Harmony keywords for this test. 74 // The scanner should parse Harmony keywords for this test.
75 scanner.SetHarmonyScoping(true);
76 scanner.SetHarmonyModules(true); 75 scanner.SetHarmonyModules(true);
77 scanner.SetHarmonyClasses(true); 76 scanner.SetHarmonyClasses(true);
78 scanner.Initialize(&stream); 77 scanner.Initialize(&stream);
79 CHECK_EQ(key_token.token, scanner.Next()); 78 CHECK_EQ(key_token.token, scanner.Next());
80 CHECK_EQ(i::Token::EOS, scanner.Next()); 79 CHECK_EQ(i::Token::EOS, scanner.Next());
81 } 80 }
82 // Removing characters will make keyword matching fail. 81 // Removing characters will make keyword matching fail.
83 { 82 {
84 i::Utf8ToUtf16CharacterStream stream(keyword, length - 1); 83 i::Utf8ToUtf16CharacterStream stream(keyword, length - 1);
85 i::Scanner scanner(&unicode_cache); 84 i::Scanner scanner(&unicode_cache);
(...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 i::Handle<i::String> source = 1043 i::Handle<i::String> source =
1045 factory->NewStringFromUtf8(i::CStrVector(program.start())) 1044 factory->NewStringFromUtf8(i::CStrVector(program.start()))
1046 .ToHandleChecked(); 1045 .ToHandleChecked();
1047 i::Handle<i::Script> script = factory->NewScript(source); 1046 i::Handle<i::Script> script = factory->NewScript(source);
1048 i::Zone zone; 1047 i::Zone zone;
1049 i::ParseInfo info(&zone, script); 1048 i::ParseInfo info(&zone, script);
1050 i::Parser parser(&info); 1049 i::Parser parser(&info);
1051 parser.set_allow_harmony_arrow_functions(true); 1050 parser.set_allow_harmony_arrow_functions(true);
1052 parser.set_allow_harmony_classes(true); 1051 parser.set_allow_harmony_classes(true);
1053 parser.set_allow_harmony_object_literals(true); 1052 parser.set_allow_harmony_object_literals(true);
1054 parser.set_allow_harmony_scoping(true);
1055 parser.set_allow_harmony_sloppy(true); 1053 parser.set_allow_harmony_sloppy(true);
1056 info.set_global(); 1054 info.set_global();
1057 CHECK(parser.Parse(&info)); 1055 CHECK(parser.Parse(&info));
1058 CHECK(i::Rewriter::Rewrite(&info)); 1056 CHECK(i::Rewriter::Rewrite(&info));
1059 CHECK(i::Scope::Analyze(&info)); 1057 CHECK(i::Scope::Analyze(&info));
1060 CHECK(info.function() != NULL); 1058 CHECK(info.function() != NULL);
1061 1059
1062 i::Scope* script_scope = info.function()->scope(); 1060 i::Scope* script_scope = info.function()->scope();
1063 CHECK(script_scope->is_script_scope()); 1061 CHECK(script_scope->is_script_scope());
1064 CHECK_EQ(1, script_scope->inner_scopes()->length()); 1062 CHECK_EQ(1, script_scope->inner_scopes()->length());
(...skipping 14 matching lines...) Expand all
1079 CHECK_EQ((source_data[i].expected & INNER_SUPER_PROPERTY) != 0, 1077 CHECK_EQ((source_data[i].expected & INNER_SUPER_PROPERTY) != 0,
1080 scope->inner_uses_super_property()); 1078 scope->inner_uses_super_property());
1081 CHECK_EQ((source_data[i].expected & INNER_THIS) != 0, 1079 CHECK_EQ((source_data[i].expected & INNER_THIS) != 0,
1082 scope->inner_uses_this()); 1080 scope->inner_uses_this());
1083 } 1081 }
1084 } 1082 }
1085 } 1083 }
1086 1084
1087 1085
1088 TEST(ScopePositions) { 1086 TEST(ScopePositions) {
1089 v8::internal::FLAG_harmony_scoping = true;
1090
1091 // Test the parser for correctly setting the start and end positions 1087 // Test the parser for correctly setting the start and end positions
1092 // of a scope. We check the scope positions of exactly one scope 1088 // of a scope. We check the scope positions of exactly one scope
1093 // nested in the global scope of a program. 'inner source' is the 1089 // nested in the global scope of a program. 'inner source' is the
1094 // source code that determines the part of the source belonging 1090 // source code that determines the part of the source belonging
1095 // to the nested scope. 'outer_prefix' and 'outer_suffix' are 1091 // to the nested scope. 'outer_prefix' and 'outer_suffix' are
1096 // parts of the source that belong to the global scope. 1092 // parts of the source that belong to the global scope.
1097 struct SourceData { 1093 struct SourceData {
1098 const char* outer_prefix; 1094 const char* outer_prefix;
1099 const char* inner_source; 1095 const char* inner_source;
1100 const char* outer_suffix; 1096 const char* outer_suffix;
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1294 1290
1295 // Parse program source. 1291 // Parse program source.
1296 i::Handle<i::String> source = factory->NewStringFromUtf8( 1292 i::Handle<i::String> source = factory->NewStringFromUtf8(
1297 i::CStrVector(program.start())).ToHandleChecked(); 1293 i::CStrVector(program.start())).ToHandleChecked();
1298 CHECK_EQ(source->length(), kProgramSize); 1294 CHECK_EQ(source->length(), kProgramSize);
1299 i::Handle<i::Script> script = factory->NewScript(source); 1295 i::Handle<i::Script> script = factory->NewScript(source);
1300 i::Zone zone; 1296 i::Zone zone;
1301 i::ParseInfo info(&zone, script); 1297 i::ParseInfo info(&zone, script);
1302 i::Parser parser(&info); 1298 i::Parser parser(&info);
1303 parser.set_allow_lazy(true); 1299 parser.set_allow_lazy(true);
1304 parser.set_allow_harmony_scoping(true);
1305 parser.set_allow_harmony_arrow_functions(true); 1300 parser.set_allow_harmony_arrow_functions(true);
1306 info.set_global(); 1301 info.set_global();
1307 info.set_language_mode(source_data[i].language_mode); 1302 info.set_language_mode(source_data[i].language_mode);
1308 parser.Parse(&info); 1303 parser.Parse(&info);
1309 CHECK(info.function() != NULL); 1304 CHECK(info.function() != NULL);
1310 1305
1311 // Check scope types and positions. 1306 // Check scope types and positions.
1312 i::Scope* scope = info.function()->scope(); 1307 i::Scope* scope = info.function()->scope();
1313 CHECK(scope->is_script_scope()); 1308 CHECK(scope->is_script_scope());
1314 CHECK_EQ(scope->start_position(), 0); 1309 CHECK_EQ(scope->start_position(), 0);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1370 i::DeleteArray(message); 1365 i::DeleteArray(message);
1371 i::DeleteArray(arg); 1366 i::DeleteArray(arg);
1372 data.Dispose(); 1367 data.Dispose();
1373 return i::Handle<i::String>::cast(result); 1368 return i::Handle<i::String>::cast(result);
1374 } 1369 }
1375 1370
1376 1371
1377 enum ParserFlag { 1372 enum ParserFlag {
1378 kAllowLazy, 1373 kAllowLazy,
1379 kAllowNatives, 1374 kAllowNatives,
1380 kAllowHarmonyScoping,
1381 kAllowHarmonyModules, 1375 kAllowHarmonyModules,
1382 kAllowHarmonyNumericLiterals, 1376 kAllowHarmonyNumericLiterals,
1383 kAllowHarmonyArrowFunctions, 1377 kAllowHarmonyArrowFunctions,
1384 kAllowHarmonyClasses, 1378 kAllowHarmonyClasses,
1385 kAllowHarmonyObjectLiterals, 1379 kAllowHarmonyObjectLiterals,
1386 kAllowHarmonyRestParameters, 1380 kAllowHarmonyRestParameters,
1387 kAllowHarmonyTemplates, 1381 kAllowHarmonyTemplates,
1388 kAllowHarmonySloppy, 1382 kAllowHarmonySloppy,
1389 kAllowHarmonyUnicode, 1383 kAllowHarmonyUnicode,
1390 kAllowHarmonyComputedPropertyNames, 1384 kAllowHarmonyComputedPropertyNames,
1391 kAllowStrongMode 1385 kAllowStrongMode
1392 }; 1386 };
1393 1387
1394 1388
1395 enum ParserSyncTestResult { 1389 enum ParserSyncTestResult {
1396 kSuccessOrError, 1390 kSuccessOrError,
1397 kSuccess, 1391 kSuccess,
1398 kError 1392 kError
1399 }; 1393 };
1400 1394
1401 template <typename Traits> 1395 template <typename Traits>
1402 void SetParserFlags(i::ParserBase<Traits>* parser, 1396 void SetParserFlags(i::ParserBase<Traits>* parser,
1403 i::EnumSet<ParserFlag> flags) { 1397 i::EnumSet<ParserFlag> flags) {
1404 parser->set_allow_lazy(flags.Contains(kAllowLazy)); 1398 parser->set_allow_lazy(flags.Contains(kAllowLazy));
1405 parser->set_allow_natives(flags.Contains(kAllowNatives)); 1399 parser->set_allow_natives(flags.Contains(kAllowNatives));
1406 parser->set_allow_harmony_scoping(flags.Contains(kAllowHarmonyScoping));
1407 parser->set_allow_harmony_modules(flags.Contains(kAllowHarmonyModules)); 1400 parser->set_allow_harmony_modules(flags.Contains(kAllowHarmonyModules));
1408 parser->set_allow_harmony_numeric_literals( 1401 parser->set_allow_harmony_numeric_literals(
1409 flags.Contains(kAllowHarmonyNumericLiterals)); 1402 flags.Contains(kAllowHarmonyNumericLiterals));
1410 parser->set_allow_harmony_object_literals( 1403 parser->set_allow_harmony_object_literals(
1411 flags.Contains(kAllowHarmonyObjectLiterals)); 1404 flags.Contains(kAllowHarmonyObjectLiterals));
1412 parser->set_allow_harmony_arrow_functions( 1405 parser->set_allow_harmony_arrow_functions(
1413 flags.Contains(kAllowHarmonyArrowFunctions)); 1406 flags.Contains(kAllowHarmonyArrowFunctions));
1414 parser->set_allow_harmony_classes(flags.Contains(kAllowHarmonyClasses)); 1407 parser->set_allow_harmony_classes(flags.Contains(kAllowHarmonyClasses));
1415 parser->set_allow_harmony_templates(flags.Contains(kAllowHarmonyTemplates)); 1408 parser->set_allow_harmony_templates(flags.Contains(kAllowHarmonyTemplates));
1416 parser->set_allow_harmony_rest_params( 1409 parser->set_allow_harmony_rest_params(
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
1966 1959
1967 const char* statement_data[] = { 1960 const char* statement_data[] = {
1968 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) 1961 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS)
1969 NULL 1962 NULL
1970 }; 1963 };
1971 1964
1972 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; 1965 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions};
1973 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, 1966 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
1974 always_flags, arraysize(always_flags)); 1967 always_flags, arraysize(always_flags));
1975 1968
1976 static const ParserFlag classes_flags[] = { 1969 static const ParserFlag classes_flags[] = {kAllowHarmonyArrowFunctions,
1977 kAllowHarmonyArrowFunctions, kAllowHarmonyClasses, kAllowHarmonyScoping}; 1970 kAllowHarmonyClasses};
1978 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, 1971 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
1979 classes_flags, arraysize(classes_flags)); 1972 classes_flags, arraysize(classes_flags));
1980 } 1973 }
1981 1974
1982 1975
1983 TEST(ErrorsReservedWords) { 1976 TEST(ErrorsReservedWords) {
1984 // Tests that both preparsing and parsing produce the right kind of errors for 1977 // Tests that both preparsing and parsing produce the right kind of errors for
1985 // using future reserved words as identifiers. These tests don't depend on the 1978 // using future reserved words as identifiers. These tests don't depend on the
1986 // strict mode. 1979 // strict mode.
1987 const char* context_data[][2] = { 1980 const char* context_data[][2] = {
(...skipping 1378 matching lines...) Expand 10 before | Expand all | Expand 10 after
3366 midfix, inner_comment, inner, suffix); 3359 midfix, inner_comment, inner, suffix);
3367 i::Handle<i::String> source = 3360 i::Handle<i::String> source =
3368 factory->InternalizeUtf8String(program.start()); 3361 factory->InternalizeUtf8String(program.start());
3369 source->PrintOn(stdout); 3362 source->PrintOn(stdout);
3370 printf("\n"); 3363 printf("\n");
3371 3364
3372 i::Handle<i::Script> script = factory->NewScript(source); 3365 i::Handle<i::Script> script = factory->NewScript(source);
3373 i::Zone zone; 3366 i::Zone zone;
3374 i::ParseInfo info(&zone, script); 3367 i::ParseInfo info(&zone, script);
3375 i::Parser parser(&info); 3368 i::Parser parser(&info);
3376 parser.set_allow_harmony_scoping(true);
3377 CHECK(parser.Parse(&info)); 3369 CHECK(parser.Parse(&info));
3378 CHECK(i::Compiler::Analyze(&info)); 3370 CHECK(i::Compiler::Analyze(&info));
3379 CHECK(info.function() != NULL); 3371 CHECK(info.function() != NULL);
3380 3372
3381 i::Scope* scope = info.function()->scope(); 3373 i::Scope* scope = info.function()->scope();
3382 CHECK_EQ(scope->inner_scopes()->length(), 1); 3374 CHECK_EQ(scope->inner_scopes()->length(), 1);
3383 i::Scope* inner_scope = scope->inner_scopes()->at(0); 3375 i::Scope* inner_scope = scope->inner_scopes()->at(0);
3384 const i::AstRawString* var_name = 3376 const i::AstRawString* var_name =
3385 info.ast_value_factory()->GetOneByteString("x"); 3377 info.ast_value_factory()->GetOneByteString("x");
3386 i::Variable* var = inner_scope->Lookup(var_name); 3378 i::Variable* var = inner_scope->Lookup(var_name);
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
3514 "(a = b) => {}", 3506 "(a = b) => {}",
3515 "(a = b, c) => {}", 3507 "(a = b, c) => {}",
3516 "(a, b = c) => {}", 3508 "(a, b = c) => {}",
3517 "(foo ? bar : baz) => {}", 3509 "(foo ? bar : baz) => {}",
3518 "(a, foo ? bar : baz) => {}", 3510 "(a, foo ? bar : baz) => {}",
3519 "(foo ? bar : baz, a) => {}", 3511 "(foo ? bar : baz, a) => {}",
3520 NULL 3512 NULL
3521 }; 3513 };
3522 3514
3523 // The test is quite slow, so run it with a reduced set of flags. 3515 // The test is quite slow, so run it with a reduced set of flags.
3524 static const ParserFlag flags[] = {kAllowLazy, kAllowHarmonyScoping}; 3516 static const ParserFlag flags[] = {kAllowLazy};
3525 static const ParserFlag always_flags[] = { kAllowHarmonyArrowFunctions }; 3517 static const ParserFlag always_flags[] = { kAllowHarmonyArrowFunctions };
3526 RunParserSyncTest(context_data, statement_data, kError, flags, 3518 RunParserSyncTest(context_data, statement_data, kError, flags,
3527 arraysize(flags), always_flags, arraysize(always_flags)); 3519 arraysize(flags), always_flags, arraysize(always_flags));
3528 } 3520 }
3529 3521
3530 3522
3531 TEST(NoErrorsArrowFunctions) { 3523 TEST(NoErrorsArrowFunctions) {
3532 // Tests that parser and preparser accept valid arrow functions syntax. 3524 // Tests that parser and preparser accept valid arrow functions syntax.
3533 const char* context_data[][2] = { 3525 const char* context_data[][2] = {
3534 {"", ";"}, 3526 {"", ";"},
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
4042 {"'use strict'; if (true) {", "}"}, 4034 {"'use strict'; if (true) {", "}"},
4043 {NULL, NULL}}; 4035 {NULL, NULL}};
4044 const char* statement_data[] = { 4036 const char* statement_data[] = {
4045 "class name {}", 4037 "class name {}",
4046 "class name extends F {}", 4038 "class name extends F {}",
4047 "class name extends (F, G) {}", 4039 "class name extends (F, G) {}",
4048 "class name extends class {} {}", 4040 "class name extends class {} {}",
4049 "class name extends class base {} {}", 4041 "class name extends class base {} {}",
4050 NULL}; 4042 NULL};
4051 4043
4052 static const ParserFlag always_flags[] = { 4044 static const ParserFlag always_flags[] = {kAllowHarmonyClasses};
4053 kAllowHarmonyClasses, kAllowHarmonyScoping};
4054 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, 4045 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
4055 always_flags, arraysize(always_flags)); 4046 always_flags, arraysize(always_flags));
4056 } 4047 }
4057 4048
4058 4049
4059 TEST(ClassBodyNoErrors) { 4050 TEST(ClassBodyNoErrors) {
4060 // Tests that parser and preparser accept valid class syntax. 4051 // Tests that parser and preparser accept valid class syntax.
4061 const char* context_data[][2] = {{"(class {", "});"}, 4052 const char* context_data[][2] = {{"(class {", "});"},
4062 {"(class extends Base {", "});"}, 4053 {"(class extends Base {", "});"},
4063 {"class C {", "}"}, 4054 {"class C {", "}"},
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
4562 const char* context_data[][2] = {{"'use strict';", ""}, 4553 const char* context_data[][2] = {{"'use strict';", ""},
4563 {"function foo(){ 'use strict';", "}"}, 4554 {"function foo(){ 'use strict';", "}"},
4564 {NULL, NULL}}; 4555 {NULL, NULL}};
4565 4556
4566 const char* data[] = { 4557 const char* data[] = {
4567 "for(const x = 1; ; ) {}", 4558 "for(const x = 1; ; ) {}",
4568 "for(const x = 1, y = 2;;){}", 4559 "for(const x = 1, y = 2;;){}",
4569 "for(const x in [1,2,3]) {}", 4560 "for(const x in [1,2,3]) {}",
4570 "for(const x of [1,2,3]) {}", 4561 "for(const x of [1,2,3]) {}",
4571 NULL}; 4562 NULL};
4572 static const ParserFlag always_flags[] = {kAllowHarmonyScoping}; 4563 RunParserSyncTest(context_data, data, kSuccess, nullptr, 0, nullptr, 0);
4573 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
4574 arraysize(always_flags));
4575 } 4564 }
4576 4565
4577 4566
4578 TEST(ConstParsingInForInError) { 4567 TEST(ConstParsingInForInError) {
4579 const char* context_data[][2] = {{"'use strict';", ""}, 4568 const char* context_data[][2] = {{"'use strict';", ""},
4580 {"function foo(){ 'use strict';", "}"}, 4569 {"function foo(){ 'use strict';", "}"},
4581 {NULL, NULL}}; 4570 {NULL, NULL}};
4582 4571
4583 const char* data[] = { 4572 const char* data[] = {
4584 "for(const x,y = 1; ; ) {}", 4573 "for(const x,y = 1; ; ) {}",
4585 "for(const x = 4 in [1,2,3]) {}", 4574 "for(const x = 4 in [1,2,3]) {}",
4586 "for(const x = 4, y in [1,2,3]) {}", 4575 "for(const x = 4, y in [1,2,3]) {}",
4587 "for(const x = 4 of [1,2,3]) {}", 4576 "for(const x = 4 of [1,2,3]) {}",
4588 "for(const x = 4, y of [1,2,3]) {}", 4577 "for(const x = 4, y of [1,2,3]) {}",
4589 "for(const x = 1, y = 2 in []) {}", 4578 "for(const x = 1, y = 2 in []) {}",
4590 "for(const x,y in []) {}", 4579 "for(const x,y in []) {}",
4591 "for(const x = 1, y = 2 of []) {}", 4580 "for(const x = 1, y = 2 of []) {}",
4592 "for(const x,y of []) {}", 4581 "for(const x,y of []) {}",
4593 NULL}; 4582 NULL};
4594 static const ParserFlag always_flags[] = {kAllowHarmonyScoping}; 4583 RunParserSyncTest(context_data, data, kError, nullptr, 0, nullptr, 0);
4595 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
4596 arraysize(always_flags));
4597 } 4584 }
4598 4585
4599 4586
4600 TEST(InvalidUnicodeEscapes) { 4587 TEST(InvalidUnicodeEscapes) {
4601 const char* context_data[][2] = {{"", ""}, 4588 const char* context_data[][2] = {{"", ""},
4602 {"'use strict';", ""}, 4589 {"'use strict';", ""},
4603 {NULL, NULL}}; 4590 {NULL, NULL}};
4604 const char* data[] = { 4591 const char* data[] = {
4605 "var foob\\u123r = 0;", 4592 "var foob\\u123r = 0;",
4606 "var \\u123roo = 0;", 4593 "var \\u123roo = 0;",
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
4941 "for(let x = 1;;){}", 4928 "for(let x = 1;;){}",
4942 "for(let x of []){}", 4929 "for(let x of []){}",
4943 "for(let x in []){}", 4930 "for(let x in []){}",
4944 "class C {}", 4931 "class C {}",
4945 "class C extends D {}", 4932 "class C extends D {}",
4946 "(class {})", 4933 "(class {})",
4947 "(class extends D {})", 4934 "(class extends D {})",
4948 "(class C {})", 4935 "(class C {})",
4949 "(class C extends D {})", 4936 "(class C extends D {})",
4950 NULL}; 4937 NULL};
4951 static const ParserFlag always_true_flags[] = { 4938 static const ParserFlag always_true_flags[] = {kAllowHarmonyClasses};
4952 kAllowHarmonyScoping, kAllowHarmonyClasses};
4953 static const ParserFlag always_false_flags[] = {kAllowHarmonySloppy}; 4939 static const ParserFlag always_false_flags[] = {kAllowHarmonySloppy};
4954 RunParserSyncTest(context_data, bad_data, kError, NULL, 0, 4940 RunParserSyncTest(context_data, bad_data, kError, NULL, 0,
4955 always_true_flags, arraysize(always_true_flags), 4941 always_true_flags, arraysize(always_true_flags),
4956 always_false_flags, arraysize(always_false_flags)); 4942 always_false_flags, arraysize(always_false_flags));
4957 4943
4958 const char* good_data[] = { 4944 const char* good_data[] = {
4959 "let = 1;", 4945 "let = 1;",
4960 "for(let = 1;;){}", 4946 "for(let = 1;;){}",
4961 NULL}; 4947 NULL};
4962 RunParserSyncTest(context_data, good_data, kSuccess, NULL, 0, 4948 RunParserSyncTest(context_data, good_data, kSuccess, NULL, 0,
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
5078 factory->NewStringFromAsciiChecked(kSources[i]); 5064 factory->NewStringFromAsciiChecked(kSources[i]);
5079 5065
5080 // Show that parsing as a module works 5066 // Show that parsing as a module works
5081 { 5067 {
5082 i::Handle<i::Script> script = factory->NewScript(source); 5068 i::Handle<i::Script> script = factory->NewScript(source);
5083 i::Zone zone; 5069 i::Zone zone;
5084 i::ParseInfo info(&zone, script); 5070 i::ParseInfo info(&zone, script);
5085 i::Parser parser(&info); 5071 i::Parser parser(&info);
5086 parser.set_allow_harmony_classes(true); 5072 parser.set_allow_harmony_classes(true);
5087 parser.set_allow_harmony_modules(true); 5073 parser.set_allow_harmony_modules(true);
5088 parser.set_allow_harmony_scoping(true);
5089 info.set_module(); 5074 info.set_module();
5090 if (!parser.Parse(&info)) { 5075 if (!parser.Parse(&info)) {
5091 i::Handle<i::JSObject> exception_handle( 5076 i::Handle<i::JSObject> exception_handle(
5092 i::JSObject::cast(isolate->pending_exception())); 5077 i::JSObject::cast(isolate->pending_exception()));
5093 i::Handle<i::String> message_string = 5078 i::Handle<i::String> message_string =
5094 i::Handle<i::String>::cast(i::Object::GetProperty( 5079 i::Handle<i::String>::cast(i::Object::GetProperty(
5095 isolate, exception_handle, "message").ToHandleChecked()); 5080 isolate, exception_handle, "message").ToHandleChecked());
5096 5081
5097 v8::base::OS::Print( 5082 v8::base::OS::Print(
5098 "Parser failed on:\n" 5083 "Parser failed on:\n"
5099 "\t%s\n" 5084 "\t%s\n"
5100 "with error:\n" 5085 "with error:\n"
5101 "\t%s\n" 5086 "\t%s\n"
5102 "However, we expected no error.", 5087 "However, we expected no error.",
5103 source->ToCString().get(), message_string->ToCString().get()); 5088 source->ToCString().get(), message_string->ToCString().get());
5104 CHECK(false); 5089 CHECK(false);
5105 } 5090 }
5106 } 5091 }
5107 5092
5108 // And that parsing a script does not. 5093 // And that parsing a script does not.
5109 { 5094 {
5110 i::Handle<i::Script> script = factory->NewScript(source); 5095 i::Handle<i::Script> script = factory->NewScript(source);
5111 i::Zone zone; 5096 i::Zone zone;
5112 i::ParseInfo info(&zone, script); 5097 i::ParseInfo info(&zone, script);
5113 i::Parser parser(&info); 5098 i::Parser parser(&info);
5114 parser.set_allow_harmony_classes(true); 5099 parser.set_allow_harmony_classes(true);
5115 parser.set_allow_harmony_modules(true); 5100 parser.set_allow_harmony_modules(true);
5116 parser.set_allow_harmony_scoping(true);
5117 info.set_global(); 5101 info.set_global();
5118 CHECK(!parser.Parse(&info)); 5102 CHECK(!parser.Parse(&info));
5119 } 5103 }
5120 } 5104 }
5121 } 5105 }
5122 5106
5123 5107
5124 TEST(ImportExportParsingErrors) { 5108 TEST(ImportExportParsingErrors) {
5125 const char* kErrorSources[] = { 5109 const char* kErrorSources[] = {
5126 "export {", 5110 "export {",
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
5197 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { 5181 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) {
5198 i::Handle<i::String> source = 5182 i::Handle<i::String> source =
5199 factory->NewStringFromAsciiChecked(kErrorSources[i]); 5183 factory->NewStringFromAsciiChecked(kErrorSources[i]);
5200 5184
5201 i::Handle<i::Script> script = factory->NewScript(source); 5185 i::Handle<i::Script> script = factory->NewScript(source);
5202 i::Zone zone; 5186 i::Zone zone;
5203 i::ParseInfo info(&zone, script); 5187 i::ParseInfo info(&zone, script);
5204 i::Parser parser(&info); 5188 i::Parser parser(&info);
5205 parser.set_allow_harmony_classes(true); 5189 parser.set_allow_harmony_classes(true);
5206 parser.set_allow_harmony_modules(true); 5190 parser.set_allow_harmony_modules(true);
5207 parser.set_allow_harmony_scoping(true);
5208 info.set_module(); 5191 info.set_module();
5209 CHECK(!parser.Parse(&info)); 5192 CHECK(!parser.Parse(&info));
5210 } 5193 }
5211 } 5194 }
5212 5195
5213 5196
5214 TEST(ModuleParsingInternals) { 5197 TEST(ModuleParsingInternals) {
5215 i::FLAG_harmony_modules = true; 5198 i::FLAG_harmony_modules = true;
5216 5199
5217 i::Isolate* isolate = CcTest::i_isolate(); 5200 i::Isolate* isolate = CcTest::i_isolate();
5218 i::Factory* factory = isolate->factory(); 5201 i::Factory* factory = isolate->factory();
5219 v8::HandleScope handles(CcTest::isolate()); 5202 v8::HandleScope handles(CcTest::isolate());
5220 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 5203 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate());
5221 v8::Context::Scope context_scope(context); 5204 v8::Context::Scope context_scope(context);
5222 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 5205 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
5223 128 * 1024); 5206 128 * 1024);
5224 5207
5225 static const char kSource[] = 5208 static const char kSource[] =
5226 "let x = 5;" 5209 "let x = 5;"
5227 "export { x as y };" 5210 "export { x as y };"
5228 "import { q as z } from 'm.js';" 5211 "import { q as z } from 'm.js';"
5229 "import n from 'n.js'"; 5212 "import n from 'n.js'";
5230 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource); 5213 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource);
5231 i::Handle<i::Script> script = factory->NewScript(source); 5214 i::Handle<i::Script> script = factory->NewScript(source);
5232 i::Zone zone; 5215 i::Zone zone;
5233 i::ParseInfo info(&zone, script); 5216 i::ParseInfo info(&zone, script);
5234 i::AstValueFactory avf(&zone, isolate->heap()->HashSeed()); 5217 i::AstValueFactory avf(&zone, isolate->heap()->HashSeed());
5235 i::Parser parser(&info); 5218 i::Parser parser(&info);
5236 parser.set_allow_harmony_modules(true); 5219 parser.set_allow_harmony_modules(true);
5237 parser.set_allow_harmony_scoping(true);
5238 info.set_module(); 5220 info.set_module();
5239 CHECK(parser.Parse(&info)); 5221 CHECK(parser.Parse(&info));
5240 CHECK(i::Compiler::Analyze(&info)); 5222 CHECK(i::Compiler::Analyze(&info));
5241 5223
5242 i::FunctionLiteral* func = info.function(); 5224 i::FunctionLiteral* func = info.function();
5243 i::Scope* module_scope = func->scope(); 5225 i::Scope* module_scope = func->scope();
5244 i::Scope* outer_scope = module_scope->outer_scope(); 5226 i::Scope* outer_scope = module_scope->outer_scope();
5245 CHECK(outer_scope->is_script_scope()); 5227 CHECK(outer_scope->is_script_scope());
5246 CHECK_NULL(outer_scope->outer_scope()); 5228 CHECK_NULL(outer_scope->outer_scope());
5247 CHECK_EQ(1, outer_scope->num_modules()); 5229 CHECK_EQ(1, outer_scope->num_modules());
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
5328 {"'use strong'; for (x in y)", ""}, 5310 {"'use strong'; for (x in y)", ""},
5329 {"'use strong'; do ", " while (false)"}, 5311 {"'use strong'; do ", " while (false)"},
5330 {NULL, NULL}}; 5312 {NULL, NULL}};
5331 5313
5332 const char* statement_data[] = { 5314 const char* statement_data[] = {
5333 "let x = 1;", 5315 "let x = 1;",
5334 "const x = 1;", 5316 "const x = 1;",
5335 "class C {}", 5317 "class C {}",
5336 NULL}; 5318 NULL};
5337 5319
5338 static const ParserFlag always_flags[] = { 5320 static const ParserFlag always_flags[] = {kAllowHarmonyClasses,
5339 kAllowHarmonyClasses, kAllowHarmonyScoping, kAllowStrongMode}; 5321 kAllowStrongMode};
5340 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, 5322 RunParserSyncTest(context_data, statement_data, kError, NULL, 0,
5341 always_flags, arraysize(always_flags)); 5323 always_flags, arraysize(always_flags));
5342 } 5324 }
5343 5325
5344 5326
5345 void TestLanguageMode(const char* source, 5327 void TestLanguageMode(const char* source,
5346 i::LanguageMode expected_language_mode) { 5328 i::LanguageMode expected_language_mode) {
5347 i::Isolate* isolate = CcTest::i_isolate(); 5329 i::Isolate* isolate = CcTest::i_isolate();
5348 i::Factory* factory = isolate->factory(); 5330 i::Factory* factory = isolate->factory();
5349 v8::HandleScope handles(CcTest::isolate()); 5331 v8::HandleScope handles(CcTest::isolate());
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
5414 "class C {static *eval() {}}", 5396 "class C {static *eval() {}}",
5415 "class C {static *arguments() {}}", 5397 "class C {static *arguments() {}}",
5416 "class C {static get eval() {}}", 5398 "class C {static get eval() {}}",
5417 "class C {static get arguments() {}}", 5399 "class C {static get arguments() {}}",
5418 "class C {static set eval(_) {}}", 5400 "class C {static set eval(_) {}}",
5419 "class C {static set arguments(_) {}}", 5401 "class C {static set arguments(_) {}}",
5420 5402
5421 NULL}; 5403 NULL};
5422 5404
5423 static const ParserFlag always_flags[] = { 5405 static const ParserFlag always_flags[] = {
5424 kAllowHarmonyClasses, kAllowHarmonyObjectLiterals, kAllowHarmonyScoping, 5406 kAllowHarmonyClasses, kAllowHarmonyObjectLiterals, kAllowStrongMode};
5425 kAllowStrongMode};
5426 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, 5407 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0,
5427 always_flags, arraysize(always_flags)); 5408 always_flags, arraysize(always_flags));
5428 } 5409 }
5429 5410
5430 5411
5431 TEST(FunctionLiteralDuplicateParameters) { 5412 TEST(FunctionLiteralDuplicateParameters) {
5432 const char* strict_context_data[][2] = 5413 const char* strict_context_data[][2] =
5433 {{"'use strict';(function(", "){})();"}, 5414 {{"'use strict';(function(", "){})();"},
5434 {"(function(", ") { 'use strict'; })();"}, 5415 {"(function(", ") { 'use strict'; })();"},
5435 {"'use strict'; function fn(", ") {}; fn();"}, 5416 {"'use strict'; function fn(", ") {}; fn();"},
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
5487 5468
5488 const char* let_declarations[] = { 5469 const char* let_declarations[] = {
5489 "let x = 0;", 5470 "let x = 0;",
5490 "for (let i = 0; i < 10; i++) { }", 5471 "for (let i = 0; i < 10; i++) { }",
5491 NULL}; 5472 NULL};
5492 5473
5493 const char* const_declarations[] = { 5474 const char* const_declarations[] = {
5494 "const x = 0;", 5475 "const x = 0;",
5495 NULL}; 5476 NULL};
5496 5477
5497 static const ParserFlag always_flags[] = {kAllowStrongMode, 5478 static const ParserFlag always_flags[] = {kAllowStrongMode};
5498 kAllowHarmonyScoping};
5499 RunParserSyncTest(strong_context_data, var_declarations, kError, NULL, 0, 5479 RunParserSyncTest(strong_context_data, var_declarations, kError, NULL, 0,
5500 always_flags, arraysize(always_flags)); 5480 always_flags, arraysize(always_flags));
5501 RunParserSyncTest(strong_context_data, let_declarations, kSuccess, NULL, 0, 5481 RunParserSyncTest(strong_context_data, let_declarations, kSuccess, NULL, 0,
5502 always_flags, arraysize(always_flags)); 5482 always_flags, arraysize(always_flags));
5503 RunParserSyncTest(strong_context_data, const_declarations, kSuccess, NULL, 0, 5483 RunParserSyncTest(strong_context_data, const_declarations, kSuccess, NULL, 0,
5504 always_flags, arraysize(always_flags)); 5484 always_flags, arraysize(always_flags));
5505 5485
5506 RunParserSyncTest(strict_context_data, var_declarations, kSuccess, NULL, 0, 5486 RunParserSyncTest(strict_context_data, var_declarations, kSuccess, NULL, 0,
5507 always_flags, arraysize(always_flags)); 5487 always_flags, arraysize(always_flags));
5508 RunParserSyncTest(strict_context_data, let_declarations, kSuccess, NULL, 0, 5488 RunParserSyncTest(strict_context_data, let_declarations, kSuccess, NULL, 0,
(...skipping 19 matching lines...) Expand all
5528 "do; while (1);", 5508 "do; while (1);",
5529 "for (;;);", 5509 "for (;;);",
5530 "for (x in []);", 5510 "for (x in []);",
5531 "for (x of []);", 5511 "for (x of []);",
5532 "for (const x = 0;;);", 5512 "for (const x = 0;;);",
5533 "for (const x in []);", 5513 "for (const x in []);",
5534 "for (const x of []);", 5514 "for (const x of []);",
5535 NULL}; 5515 NULL};
5536 5516
5537 static const ParserFlag always_flags[] = { 5517 static const ParserFlag always_flags[] = {
5538 kAllowStrongMode, kAllowHarmonyScoping 5518 kAllowStrongMode,
5539 }; 5519 };
5540 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags, 5520 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags,
5541 arraysize(always_flags)); 5521 arraysize(always_flags));
5542 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, 5522 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags,
5543 arraysize(always_flags)); 5523 arraysize(always_flags));
5544 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, 5524 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags,
5545 arraysize(always_flags)); 5525 arraysize(always_flags));
5546 } 5526 }
5547 5527
5548 5528
5549 TEST(StrongForIn) { 5529 TEST(StrongForIn) {
5550 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; 5530 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}};
5551 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; 5531 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}};
5552 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; 5532 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}};
5553 5533
5554 const char* data[] = { 5534 const char* data[] = {
5555 "for (x in []) {}", 5535 "for (x in []) {}",
5556 "for (const x in []) {}", 5536 "for (const x in []) {}",
5557 NULL}; 5537 NULL};
5558 5538
5559 static const ParserFlag always_flags[] = { 5539 static const ParserFlag always_flags[] = {
5560 kAllowStrongMode, kAllowHarmonyScoping 5540 kAllowStrongMode,
5561 }; 5541 };
5562 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags, 5542 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags,
5563 arraysize(always_flags)); 5543 arraysize(always_flags));
5564 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, 5544 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags,
5565 arraysize(always_flags)); 5545 arraysize(always_flags));
5566 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, 5546 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags,
5567 arraysize(always_flags)); 5547 arraysize(always_flags));
5568 } 5548 }
5569 5549
5570 5550
5571 TEST(ArrowFunctionASIErrors) { 5551 TEST(ArrowFunctionASIErrors) {
5572 const char* context_data[][2] = {{"'use strict';", ""}, {"", ""}, 5552 const char* context_data[][2] = {{"'use strict';", ""}, {"", ""},
5573 {NULL, NULL}}; 5553 {NULL, NULL}};
5574 5554
5575 const char* data[] = { 5555 const char* data[] = {
5576 "(a\n=> a)(1)", 5556 "(a\n=> a)(1)",
5577 "(a/*\n*/=> a)(1)", 5557 "(a/*\n*/=> a)(1)",
5578 "((a)\n=> a)(1)", 5558 "((a)\n=> a)(1)",
5579 "((a)/*\n*/=> a)(1)", 5559 "((a)/*\n*/=> a)(1)",
5580 "((a, b)\n=> a + b)(1, 2)", 5560 "((a, b)\n=> a + b)(1, 2)",
5581 "((a, b)/*\n*/=> a + b)(1, 2)", 5561 "((a, b)/*\n*/=> a + b)(1, 2)",
5582 NULL}; 5562 NULL};
5583 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; 5563 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions};
5584 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, 5564 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags,
5585 arraysize(always_flags)); 5565 arraysize(always_flags));
5586 } 5566 }
OLDNEW
« no previous file with comments | « test/cctest/test-decls.cc ('k') | test/cctest/test-serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698