| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 6be2964839aad129127ee23b6d3775ce9b9a0974..5f80f874a0a10330d7dc3f248064c2bb8b0a9104 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -537,36 +537,32 @@ Parser::FunctionState::~FunctionState() {
|
| // ----------------------------------------------------------------------------
|
| // Implementation of Parser
|
|
|
| -Parser::Parser(CompilationInfo* info,
|
| - int parser_flags,
|
| - v8::Extension* extension,
|
| - ScriptDataImpl* pre_data)
|
| +Parser::Parser(CompilationInfo* info)
|
| : isolate_(info->isolate()),
|
| - symbol_cache_(pre_data ? pre_data->symbol_count() : 0, info->zone()),
|
| + symbol_cache_(0, info->zone()),
|
| script_(info->script()),
|
| scanner_(isolate_->unicode_cache()),
|
| reusable_preparser_(NULL),
|
| top_scope_(NULL),
|
| current_function_state_(NULL),
|
| target_stack_(NULL),
|
| - extension_(extension),
|
| - pre_data_(pre_data),
|
| + extension_(info->extension()),
|
| + pre_parse_data_(NULL),
|
| fni_(NULL),
|
| - allow_natives_syntax_((parser_flags & kAllowNativesSyntax) != 0),
|
| - allow_lazy_((parser_flags & kAllowLazy) != 0),
|
| - allow_modules_((parser_flags & kAllowModules) != 0),
|
| + allow_natives_syntax_(false),
|
| + allow_lazy_(false),
|
| + allow_generators_(false),
|
| stack_overflow_(false),
|
| parenthesized_function_(false),
|
| zone_(info->zone()),
|
| info_(info) {
|
| ASSERT(!script_.is_null());
|
| isolate_->set_ast_node_id(0);
|
| - if ((parser_flags & kLanguageModeMask) == EXTENDED_MODE) {
|
| - scanner().SetHarmonyScoping(true);
|
| - }
|
| - if ((parser_flags & kAllowModules) != 0) {
|
| - scanner().SetHarmonyModules(true);
|
| - }
|
| + set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
|
| + set_allow_modules(!info->is_native() && FLAG_harmony_modules);
|
| + set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native());
|
| + set_allow_lazy(false); // Must be explicitly enabled.
|
| + set_allow_generators(FLAG_harmony_generators);
|
| }
|
|
|
|
|
| @@ -617,7 +613,7 @@ FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info,
|
| ZoneScope* zone_scope) {
|
| ASSERT(top_scope_ == NULL);
|
| ASSERT(target_stack_ == NULL);
|
| - if (pre_data_ != NULL) pre_data_->Initialize();
|
| + if (pre_parse_data_ != NULL) pre_parse_data_->Initialize();
|
|
|
| Handle<String> no_name = isolate()->factory()->empty_string();
|
|
|
| @@ -638,8 +634,10 @@ FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info,
|
| scope->set_end_position(source->length());
|
|
|
| // Compute the parsing mode.
|
| - Mode mode = (FLAG_lazy && allow_lazy_) ? PARSE_LAZILY : PARSE_EAGERLY;
|
| - if (allow_natives_syntax_ || extension_ != NULL || scope->is_eval_scope()) {
|
| + Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY;
|
| + if (allow_natives_syntax() ||
|
| + extension_ != NULL ||
|
| + scope->is_eval_scope()) {
|
| mode = PARSE_EAGERLY;
|
| }
|
| ParsingModeScope parsing_mode(this, mode);
|
| @@ -801,8 +799,8 @@ FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source,
|
|
|
| Handle<String> Parser::GetSymbol(bool* ok) {
|
| int symbol_id = -1;
|
| - if (pre_data() != NULL) {
|
| - symbol_id = pre_data()->GetSymbolIdentifier();
|
| + if (pre_parse_data() != NULL) {
|
| + symbol_id = pre_parse_data()->GetSymbolIdentifier();
|
| }
|
| return LookupSymbol(symbol_id);
|
| }
|
| @@ -1092,7 +1090,7 @@ void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
|
| mode_ = PARSE_EAGERLY;
|
| }
|
| // TODO(ES6): Fix entering extended mode, once it is specified.
|
| - top_scope_->SetLanguageMode(FLAG_harmony_scoping
|
| + top_scope_->SetLanguageMode(allow_harmony_scoping()
|
| ? EXTENDED_MODE : STRICT_MODE);
|
| // "use strict" is the only directive for now.
|
| directive_prologue = false;
|
| @@ -1910,7 +1908,7 @@ Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) {
|
| // '{' FunctionBody '}'
|
| Expect(Token::FUNCTION, CHECK_OK);
|
| int function_token_position = scanner().location().beg_pos;
|
| - bool is_generator = FLAG_harmony_generators && Check(Token::MUL);
|
| + bool is_generator = allow_generators() && Check(Token::MUL);
|
| bool is_strict_reserved = false;
|
| Handle<String> name = ParseIdentifierOrStrictReservedWord(
|
| &is_strict_reserved, CHECK_OK);
|
| @@ -3486,7 +3484,7 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack,
|
| if (peek() == Token::FUNCTION) {
|
| Expect(Token::FUNCTION, CHECK_OK);
|
| int function_token_position = scanner().location().beg_pos;
|
| - bool is_generator = FLAG_harmony_generators && Check(Token::MUL);
|
| + bool is_generator = allow_generators() && Check(Token::MUL);
|
| Handle<String> name;
|
| bool is_strict_reserved_name = false;
|
| if (peek_any_identifier()) {
|
| @@ -3702,7 +3700,7 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) {
|
| break;
|
|
|
| case Token::MOD:
|
| - if (allow_natives_syntax_ || extension_ != NULL) {
|
| + if (allow_natives_syntax() || extension_ != NULL) {
|
| result = ParseV8Intrinsic(CHECK_OK);
|
| break;
|
| }
|
| @@ -4475,11 +4473,11 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| if (is_lazily_compiled) {
|
| int function_block_pos = scanner().location().beg_pos;
|
| FunctionEntry entry;
|
| - if (pre_data_ != NULL) {
|
| - // If we have pre_data_, we use it to skip parsing the function body.
|
| - // the preparser data contains the information we need to construct the
|
| - // lazy function.
|
| - entry = pre_data()->GetFunctionEntry(function_block_pos);
|
| + if (pre_parse_data_ != NULL) {
|
| + // If we have pre_parse_data_, we use it to skip parsing the function
|
| + // body. The preparser data contains the information we need to
|
| + // construct the lazy function.
|
| + entry = pre_parse_data()->GetFunctionEntry(function_block_pos);
|
| if (entry.is_valid()) {
|
| if (entry.end_pos() <= function_block_pos) {
|
| // End position greater than end of stream is safe, and hard
|
| @@ -4646,14 +4644,14 @@ preparser::PreParser::PreParseResult Parser::LazyParseFunctionLiteral(
|
|
|
| if (reusable_preparser_ == NULL) {
|
| intptr_t stack_limit = isolate()->stack_guard()->real_climit();
|
| - bool do_allow_lazy = true;
|
| reusable_preparser_ = new preparser::PreParser(&scanner_,
|
| NULL,
|
| - stack_limit,
|
| - do_allow_lazy,
|
| - allow_natives_syntax_,
|
| - allow_modules_,
|
| - FLAG_harmony_generators);
|
| + stack_limit);
|
| + reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping());
|
| + reusable_preparser_->set_allow_modules(allow_modules());
|
| + reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax());
|
| + reusable_preparser_->set_allow_lazy(true);
|
| + reusable_preparser_->set_allow_generators(allow_generators());
|
| }
|
| preparser::PreParser::PreParseResult result =
|
| reusable_preparser_->PreParseLazyFunction(top_scope_->language_mode(),
|
| @@ -5900,20 +5898,18 @@ int ScriptDataImpl::ReadNumber(byte** source) {
|
|
|
|
|
| // Create a Scanner for the preparser to use as input, and preparse the source.
|
| -static ScriptDataImpl* DoPreParse(Utf16CharacterStream* source,
|
| - int flags,
|
| - ParserRecorder* recorder) {
|
| +ScriptDataImpl* PreParserApi::PreParse(Utf16CharacterStream* source) {
|
| + CompleteParserRecorder recorder;
|
| Isolate* isolate = Isolate::Current();
|
| HistogramTimerScope timer(isolate->counters()->pre_parse());
|
| Scanner scanner(isolate->unicode_cache());
|
| - scanner.SetHarmonyScoping(FLAG_harmony_scoping);
|
| - scanner.Initialize(source);
|
| intptr_t stack_limit = isolate->stack_guard()->real_climit();
|
| - preparser::PreParser::PreParseResult result =
|
| - preparser::PreParser::PreParseProgram(&scanner,
|
| - recorder,
|
| - flags,
|
| - stack_limit);
|
| + preparser::PreParser preparser(&scanner, &recorder, stack_limit);
|
| + preparser.set_allow_lazy(true);
|
| + preparser.set_allow_generators(FLAG_harmony_generators);
|
| + preparser.set_allow_harmony_scoping(FLAG_harmony_scoping);
|
| + scanner.Initialize(source);
|
| + preparser::PreParser::PreParseResult result = preparser.PreParseProgram();
|
| if (result == preparser::PreParser::kPreParseStackOverflow) {
|
| isolate->StackOverflow();
|
| return NULL;
|
| @@ -5921,24 +5917,11 @@ static ScriptDataImpl* DoPreParse(Utf16CharacterStream* source,
|
|
|
| // Extract the accumulated data from the recorder as a single
|
| // contiguous vector that we are responsible for disposing.
|
| - Vector<unsigned> store = recorder->ExtractData();
|
| + Vector<unsigned> store = recorder.ExtractData();
|
| return new ScriptDataImpl(store);
|
| }
|
|
|
|
|
| -ScriptDataImpl* ParserApi::PreParse(Utf16CharacterStream* source) {
|
| - int flags = kNoParsingFlags;
|
| - if (FLAG_lazy) {
|
| - flags |= kAllowLazy;
|
| - }
|
| - if (FLAG_harmony_generators) {
|
| - flags |= kAllowGenerators;
|
| - }
|
| - CompleteParserRecorder recorder;
|
| - return DoPreParse(source, flags, &recorder);
|
| -}
|
| -
|
| -
|
| bool RegExpParser::ParseRegExp(FlatStringReader* input,
|
| bool multiline,
|
| RegExpCompileData* result,
|
| @@ -5962,48 +5945,35 @@ bool RegExpParser::ParseRegExp(FlatStringReader* input,
|
| }
|
|
|
|
|
| -bool ParserApi::Parse(CompilationInfo* info, int parsing_flags) {
|
| - ASSERT(info->function() == NULL);
|
| +bool Parser::Parse() {
|
| + ASSERT(info()->function() == NULL);
|
| FunctionLiteral* result = NULL;
|
| - ASSERT((parsing_flags & kLanguageModeMask) == CLASSIC_MODE);
|
| - if (!info->is_native() && FLAG_harmony_scoping) {
|
| - // Harmony scoping is requested.
|
| - parsing_flags |= EXTENDED_MODE;
|
| - }
|
| - if (!info->is_native() && FLAG_harmony_modules) {
|
| - parsing_flags |= kAllowModules;
|
| - }
|
| - if (FLAG_allow_natives_syntax || info->is_native()) {
|
| - // We require %identifier(..) syntax.
|
| - parsing_flags |= kAllowNativesSyntax;
|
| - }
|
| - if (info->is_lazy()) {
|
| - ASSERT(!info->is_eval());
|
| - Parser parser(info, parsing_flags, NULL, NULL);
|
| - if (info->shared_info()->is_function()) {
|
| - result = parser.ParseLazy();
|
| + if (info()->is_lazy()) {
|
| + ASSERT(!info()->is_eval());
|
| + if (info()->shared_info()->is_function()) {
|
| + result = ParseLazy();
|
| } else {
|
| - result = parser.ParseProgram();
|
| + result = ParseProgram();
|
| }
|
| } else {
|
| - ScriptDataImpl* pre_data = info->pre_parse_data();
|
| - Parser parser(info, parsing_flags, info->extension(), pre_data);
|
| - if (pre_data != NULL && pre_data->has_error()) {
|
| - Scanner::Location loc = pre_data->MessageLocation();
|
| - const char* message = pre_data->BuildMessage();
|
| - Vector<const char*> args = pre_data->BuildArgs();
|
| - parser.ReportMessageAt(loc, message, args);
|
| + ScriptDataImpl* pre_parse_data = info()->pre_parse_data();
|
| + set_pre_parse_data(pre_parse_data);
|
| + if (pre_parse_data != NULL && pre_parse_data->has_error()) {
|
| + Scanner::Location loc = pre_parse_data->MessageLocation();
|
| + const char* message = pre_parse_data->BuildMessage();
|
| + Vector<const char*> args = pre_parse_data->BuildArgs();
|
| + ReportMessageAt(loc, message, args);
|
| DeleteArray(message);
|
| for (int i = 0; i < args.length(); i++) {
|
| DeleteArray(args[i]);
|
| }
|
| DeleteArray(args.start());
|
| - ASSERT(info->isolate()->has_pending_exception());
|
| + ASSERT(info()->isolate()->has_pending_exception());
|
| } else {
|
| - result = parser.ParseProgram();
|
| + result = ParseProgram();
|
| }
|
| }
|
| - info->SetFunction(result);
|
| + info()->SetFunction(result);
|
| return (result != NULL);
|
| }
|
|
|
|
|