| Index: test/cctest/test-parsing.cc
|
| diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
|
| index 04e64cf55c1e5be50eb981184ab9940ca169f3e4..952cb68cec4886d5cbdea672d69622a594d78356 100644
|
| --- a/test/cctest/test-parsing.cc
|
| +++ b/test/cctest/test-parsing.cc
|
| @@ -1085,29 +1085,24 @@ enum ParserFlag {
|
| kAllowModules,
|
| kAllowGenerators,
|
| kAllowForOf,
|
| - kAllowHarmonyNumericLiterals,
|
| - kParserFlagCount
|
| + kAllowHarmonyNumericLiterals
|
| };
|
|
|
|
|
| -static bool checkParserFlag(unsigned flags, ParserFlag flag) {
|
| - return flags & (1 << flag);
|
| +void SetParserFlags(i::ParserBase* parser, i::EnumSet<ParserFlag> flags) {
|
| + parser->set_allow_lazy(flags.Contains(kAllowLazy));
|
| + parser->set_allow_natives_syntax(flags.Contains(kAllowNativesSyntax));
|
| + parser->set_allow_harmony_scoping(flags.Contains(kAllowHarmonyScoping));
|
| + parser->set_allow_modules(flags.Contains(kAllowModules));
|
| + parser->set_allow_generators(flags.Contains(kAllowGenerators));
|
| + parser->set_allow_for_of(flags.Contains(kAllowForOf));
|
| + parser->set_allow_harmony_numeric_literals(
|
| + flags.Contains(kAllowHarmonyNumericLiterals));
|
| }
|
|
|
|
|
| -#define SET_PARSER_FLAGS(parser, flags) \
|
| - parser.set_allow_lazy(checkParserFlag(flags, kAllowLazy)); \
|
| - parser.set_allow_natives_syntax(checkParserFlag(flags, \
|
| - kAllowNativesSyntax)); \
|
| - parser.set_allow_harmony_scoping(checkParserFlag(flags, \
|
| - kAllowHarmonyScoping)); \
|
| - parser.set_allow_modules(checkParserFlag(flags, kAllowModules)); \
|
| - parser.set_allow_generators(checkParserFlag(flags, kAllowGenerators)); \
|
| - parser.set_allow_for_of(checkParserFlag(flags, kAllowForOf)); \
|
| - parser.set_allow_harmony_numeric_literals( \
|
| - checkParserFlag(flags, kAllowHarmonyNumericLiterals));
|
| -
|
| -void TestParserSyncWithFlags(i::Handle<i::String> source, unsigned flags) {
|
| +void TestParserSyncWithFlags(i::Handle<i::String> source,
|
| + i::EnumSet<ParserFlag> flags) {
|
| i::Isolate* isolate = CcTest::i_isolate();
|
| i::Factory* factory = isolate->factory();
|
|
|
| @@ -1119,7 +1114,7 @@ void TestParserSyncWithFlags(i::Handle<i::String> source, unsigned flags) {
|
| i::Scanner scanner(isolate->unicode_cache());
|
| i::GenericStringUtf16CharacterStream stream(source, 0, source->length());
|
| i::PreParser preparser(&scanner, &log, stack_limit);
|
| - SET_PARSER_FLAGS(preparser, flags);
|
| + SetParserFlags(&preparser, flags);
|
| scanner.Initialize(&stream);
|
| i::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| CHECK_EQ(i::PreParser::kPreParseSuccess, result);
|
| @@ -1132,7 +1127,7 @@ void TestParserSyncWithFlags(i::Handle<i::String> source, unsigned flags) {
|
| i::Handle<i::Script> script = factory->NewScript(source);
|
| i::CompilationInfoWithZone info(script);
|
| i::Parser parser(&info);
|
| - SET_PARSER_FLAGS(parser, flags);
|
| + SetParserFlags(&parser, flags);
|
| info.MarkAsGlobal();
|
| parser.Parse();
|
| function = info.function();
|
| @@ -1186,9 +1181,17 @@ void TestParserSyncWithFlags(i::Handle<i::String> source, unsigned flags) {
|
| }
|
|
|
|
|
| -void TestParserSync(i::Handle<i::String> source) {
|
| - for (unsigned flags = 0; flags < (1 << kParserFlagCount); ++flags) {
|
| - TestParserSyncWithFlags(source, flags);
|
| +void TestParserSync(const char* source,
|
| + const ParserFlag* flag_list,
|
| + size_t flag_list_length) {
|
| + i::Handle<i::String> str =
|
| + CcTest::i_isolate()->factory()->NewStringFromAscii(i::CStrVector(source));
|
| + for (int bits = 0; bits < (1 << flag_list_length); bits++) {
|
| + i::EnumSet<ParserFlag> flags;
|
| + for (size_t flag_index = 0; flag_index < flag_list_length; flag_index++) {
|
| + if ((bits & (1 << flag_index)) != 0) flags.Add(flag_list[flag_index]);
|
| + }
|
| + TestParserSyncWithFlags(str, flags);
|
| }
|
| }
|
|
|
| @@ -1262,17 +1265,18 @@ TEST(ParserSync) {
|
| NULL
|
| };
|
|
|
| - i::Isolate* isolate = CcTest::i_isolate();
|
| - i::Factory* factory = isolate->factory();
|
| -
|
| v8::HandleScope handles(CcTest::isolate());
|
| v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate());
|
| v8::Context::Scope context_scope(context);
|
|
|
| int marker;
|
| - isolate->stack_guard()->SetStackLimit(
|
| + CcTest::i_isolate()->stack_guard()->SetStackLimit(
|
| reinterpret_cast<uintptr_t>(&marker) - 128 * 1024);
|
|
|
| + static const ParserFlag flags1[] = {
|
| + kAllowLazy, kAllowHarmonyScoping, kAllowModules, kAllowGenerators,
|
| + kAllowForOf
|
| + };
|
| for (int i = 0; context_data[i][0] != NULL; ++i) {
|
| for (int j = 0; statement_data[j] != NULL; ++j) {
|
| for (int k = 0; termination_data[k] != NULL; ++k) {
|
| @@ -1292,12 +1296,20 @@ TEST(ParserSync) {
|
| termination_data[k],
|
| context_data[i][1]);
|
| CHECK(length == kProgramSize);
|
| - i::Handle<i::String> source =
|
| - factory->NewStringFromAscii(i::CStrVector(program.start()));
|
| - TestParserSync(source);
|
| + TestParserSync(program.start(), flags1, ARRAY_SIZE(flags1));
|
| }
|
| }
|
| }
|
| +
|
| + // Neither Harmony numeric literals nor our natives syntax have any
|
| + // interaction with the flags above, so test these separately to reduce
|
| + // the combinatorial explosion.
|
| + static const ParserFlag flags2[] = { kAllowHarmonyNumericLiterals };
|
| + TestParserSync("0o1234", flags2, ARRAY_SIZE(flags2));
|
| + TestParserSync("0b1011", flags2, ARRAY_SIZE(flags2));
|
| +
|
| + static const ParserFlag flags3[] = { kAllowNativesSyntax };
|
| + TestParserSync("%DebugPrint(123)", flags3, ARRAY_SIZE(flags3));
|
| }
|
|
|
|
|
|
|