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

Side by Side Diff: src/parser.cc

Issue 27182002: Introduce ParserBase for common code between parser and pre-parser. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « src/parser.h ('k') | src/preparser.h » ('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 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 #define CHECK_FAILED /**/); \ 529 #define CHECK_FAILED /**/); \
530 if (failed_) return NULL; \ 530 if (failed_) return NULL; \
531 ((void)0 531 ((void)0
532 #define DUMMY ) // to make indentation work 532 #define DUMMY ) // to make indentation work
533 #undef DUMMY 533 #undef DUMMY
534 534
535 // ---------------------------------------------------------------------------- 535 // ----------------------------------------------------------------------------
536 // Implementation of Parser 536 // Implementation of Parser
537 537
538 Parser::Parser(CompilationInfo* info) 538 Parser::Parser(CompilationInfo* info)
539 : isolate_(info->isolate()), 539 : ParserBase(&scanner_, info->isolate()->stack_guard()->real_climit()),
540 isolate_(info->isolate()),
540 symbol_cache_(0, info->zone()), 541 symbol_cache_(0, info->zone()),
541 script_(info->script()), 542 script_(info->script()),
542 scanner_(isolate_->unicode_cache()), 543 scanner_(isolate_->unicode_cache()),
543 reusable_preparser_(NULL), 544 reusable_preparser_(NULL),
544 top_scope_(NULL), 545 top_scope_(NULL),
545 original_scope_(NULL), 546 original_scope_(NULL),
546 current_function_state_(NULL), 547 current_function_state_(NULL),
547 target_stack_(NULL), 548 target_stack_(NULL),
548 extension_(info->extension()), 549 extension_(info->extension()),
549 pre_parse_data_(NULL), 550 pre_parse_data_(NULL),
550 fni_(NULL), 551 fni_(NULL),
551 allow_natives_syntax_(false),
552 allow_lazy_(false),
553 allow_generators_(false),
554 allow_for_of_(false),
555 stack_overflow_(false),
556 parenthesized_function_(false), 552 parenthesized_function_(false),
557 zone_(info->zone()), 553 zone_(info->zone()),
558 info_(info) { 554 info_(info) {
559 ASSERT(!script_.is_null()); 555 ASSERT(!script_.is_null());
560 isolate_->set_ast_node_id(0); 556 isolate_->set_ast_node_id(0);
561 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); 557 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
562 set_allow_modules(!info->is_native() && FLAG_harmony_modules); 558 set_allow_modules(!info->is_native() && FLAG_harmony_modules);
563 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); 559 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native());
564 set_allow_lazy(false); // Must be explicitly enabled. 560 set_allow_lazy(false); // Must be explicitly enabled.
565 set_allow_generators(FLAG_harmony_generators); 561 set_allow_generators(FLAG_harmony_generators);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 0, 679 0,
684 FunctionLiteral::kNoDuplicateParameters, 680 FunctionLiteral::kNoDuplicateParameters,
685 FunctionLiteral::ANONYMOUS_EXPRESSION, 681 FunctionLiteral::ANONYMOUS_EXPRESSION,
686 FunctionLiteral::kGlobalOrEval, 682 FunctionLiteral::kGlobalOrEval,
687 FunctionLiteral::kNotParenthesized, 683 FunctionLiteral::kNotParenthesized,
688 FunctionLiteral::kNotGenerator, 684 FunctionLiteral::kNotGenerator,
689 0); 685 0);
690 result->set_ast_properties(factory()->visitor()->ast_properties()); 686 result->set_ast_properties(factory()->visitor()->ast_properties());
691 result->set_dont_optimize_reason( 687 result->set_dont_optimize_reason(
692 factory()->visitor()->dont_optimize_reason()); 688 factory()->visitor()->dont_optimize_reason());
693 } else if (stack_overflow_) { 689 } else if (stack_overflow()) {
694 isolate()->StackOverflow(); 690 isolate()->StackOverflow();
695 } 691 }
696 } 692 }
697 693
698 // Make sure the target stack is empty. 694 // Make sure the target stack is empty.
699 ASSERT(target_stack_ == NULL); 695 ASSERT(target_stack_ == NULL);
700 696
701 return result; 697 return result;
702 } 698 }
703 699
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 function_type, 776 function_type,
781 &ok); 777 &ok);
782 // Make sure the results agree. 778 // Make sure the results agree.
783 ASSERT(ok == (result != NULL)); 779 ASSERT(ok == (result != NULL));
784 } 780 }
785 781
786 // Make sure the target stack is empty. 782 // Make sure the target stack is empty.
787 ASSERT(target_stack_ == NULL); 783 ASSERT(target_stack_ == NULL);
788 784
789 if (result == NULL) { 785 if (result == NULL) {
790 if (stack_overflow_) isolate()->StackOverflow(); 786 if (stack_overflow()) isolate()->StackOverflow();
791 } else { 787 } else {
792 Handle<String> inferred_name(shared_info->inferred_name()); 788 Handle<String> inferred_name(shared_info->inferred_name());
793 result->set_inferred_name(inferred_name); 789 result->set_inferred_name(inferred_name);
794 } 790 }
795 return result; 791 return result;
796 } 792 }
797 793
798 794
799 Handle<String> Parser::GetSymbol() { 795 Handle<String> Parser::GetSymbol() {
800 int symbol_id = -1; 796 int symbol_id = -1;
(...skipping 2676 matching lines...) Expand 10 before | Expand all | Expand 10 after
3477 Expect(Token::DEBUGGER, CHECK_OK); 3473 Expect(Token::DEBUGGER, CHECK_OK);
3478 ExpectSemicolon(CHECK_OK); 3474 ExpectSemicolon(CHECK_OK);
3479 return factory()->NewDebuggerStatement(pos); 3475 return factory()->NewDebuggerStatement(pos);
3480 } 3476 }
3481 3477
3482 3478
3483 void Parser::ReportUnexpectedToken(Token::Value token) { 3479 void Parser::ReportUnexpectedToken(Token::Value token) {
3484 // We don't report stack overflows here, to avoid increasing the 3480 // We don't report stack overflows here, to avoid increasing the
3485 // stack depth even further. Instead we report it after parsing is 3481 // stack depth even further. Instead we report it after parsing is
3486 // over, in ParseProgram/ParseJson. 3482 // over, in ParseProgram/ParseJson.
3487 if (token == Token::ILLEGAL && stack_overflow_) return; 3483 if (token == Token::ILLEGAL && stack_overflow()) return;
3488 // Four of the tokens are treated specially 3484 // Four of the tokens are treated specially
3489 switch (token) { 3485 switch (token) {
3490 case Token::EOS: 3486 case Token::EOS:
3491 return ReportMessage("unexpected_eos", Vector<const char*>::empty()); 3487 return ReportMessage("unexpected_eos", Vector<const char*>::empty());
3492 case Token::NUMBER: 3488 case Token::NUMBER:
3493 return ReportMessage("unexpected_token_number", 3489 return ReportMessage("unexpected_token_number",
3494 Vector<const char*>::empty()); 3490 Vector<const char*>::empty());
3495 case Token::STRING: 3491 case Token::STRING:
3496 return ReportMessage("unexpected_token_string", 3492 return ReportMessage("unexpected_token_string",
3497 Vector<const char*>::empty()); 3493 Vector<const char*>::empty());
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after
4371 is_lazily_compiled = false; 4367 is_lazily_compiled = false;
4372 } 4368 }
4373 } else { 4369 } else {
4374 // With no preparser data, we partially parse the function, without 4370 // With no preparser data, we partially parse the function, without
4375 // building an AST. This gathers the data needed to build a lazy 4371 // building an AST. This gathers the data needed to build a lazy
4376 // function. 4372 // function.
4377 SingletonLogger logger; 4373 SingletonLogger logger;
4378 PreParser::PreParseResult result = LazyParseFunctionLiteral(&logger); 4374 PreParser::PreParseResult result = LazyParseFunctionLiteral(&logger);
4379 if (result == PreParser::kPreParseStackOverflow) { 4375 if (result == PreParser::kPreParseStackOverflow) {
4380 // Propagate stack overflow. 4376 // Propagate stack overflow.
4381 stack_overflow_ = true; 4377 set_stack_overflow();
4382 *ok = false; 4378 *ok = false;
4383 return NULL; 4379 return NULL;
4384 } 4380 }
4385 if (logger.has_error()) { 4381 if (logger.has_error()) {
4386 const char* arg = logger.argument_opt(); 4382 const char* arg = logger.argument_opt();
4387 Vector<const char*> args; 4383 Vector<const char*> args;
4388 if (arg != NULL) { 4384 if (arg != NULL) {
4389 args = Vector<const char*>(&arg, 1); 4385 args = Vector<const char*>(&arg, 1);
4390 } 4386 }
4391 ReportMessageAt(Scanner::Location(logger.start(), logger.end()), 4387 ReportMessageAt(Scanner::Location(logger.start(), logger.end()),
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
4606 ReportMessage("not_defined", Vector<Handle<String> >(&name, 1)); 4602 ReportMessage("not_defined", Vector<Handle<String> >(&name, 1));
4607 *ok = false; 4603 *ok = false;
4608 return NULL; 4604 return NULL;
4609 } 4605 }
4610 4606
4611 // We have a valid intrinsics call or a call to a builtin. 4607 // We have a valid intrinsics call or a call to a builtin.
4612 return factory()->NewCallRuntime(name, function, args, pos); 4608 return factory()->NewCallRuntime(name, function, args, pos);
4613 } 4609 }
4614 4610
4615 4611
4616 bool Parser::peek_any_identifier() { 4612 bool ParserBase::peek_any_identifier() {
4617 Token::Value next = peek(); 4613 Token::Value next = peek();
4618 return next == Token::IDENTIFIER || 4614 return next == Token::IDENTIFIER ||
4619 next == Token::FUTURE_RESERVED_WORD || 4615 next == Token::FUTURE_RESERVED_WORD ||
4620 next == Token::FUTURE_STRICT_RESERVED_WORD || 4616 next == Token::FUTURE_STRICT_RESERVED_WORD ||
4621 next == Token::YIELD; 4617 next == Token::YIELD;
4622 } 4618 }
4623 4619
4624 4620
4625 void Parser::Consume(Token::Value token) {
4626 Token::Value next = Next();
4627 USE(next);
4628 USE(token);
4629 ASSERT(next == token);
4630 }
4631
4632
4633 void Parser::Expect(Token::Value token, bool* ok) {
4634 Token::Value next = Next();
4635 if (next == token) return;
4636 ReportUnexpectedToken(next);
4637 *ok = false;
4638 }
4639
4640
4641 bool Parser::Check(Token::Value token) {
4642 Token::Value next = peek();
4643 if (next == token) {
4644 Consume(next);
4645 return true;
4646 }
4647 return false;
4648 }
4649
4650
4651 bool Parser::CheckContextualKeyword(Vector<const char> keyword) { 4621 bool Parser::CheckContextualKeyword(Vector<const char> keyword) {
4652 if (peek() == Token::IDENTIFIER && 4622 if (peek() == Token::IDENTIFIER &&
4653 scanner().is_next_contextual_keyword(keyword)) { 4623 scanner().is_next_contextual_keyword(keyword)) {
4654 Consume(Token::IDENTIFIER); 4624 Consume(Token::IDENTIFIER);
4655 return true; 4625 return true;
4656 } 4626 }
4657 return false; 4627 return false;
4658 } 4628 }
4659 4629
4660 4630
4661 void Parser::ExpectSemicolon(bool* ok) { 4631 void ParserBase::ExpectSemicolon(bool* ok) {
4662 // Check for automatic semicolon insertion according to 4632 // Check for automatic semicolon insertion according to
4663 // the rules given in ECMA-262, section 7.9, page 21. 4633 // the rules given in ECMA-262, section 7.9, page 21.
4664 Token::Value tok = peek(); 4634 Token::Value tok = peek();
4665 if (tok == Token::SEMICOLON) { 4635 if (tok == Token::SEMICOLON) {
4666 Next(); 4636 Next();
4667 return; 4637 return;
4668 } 4638 }
4669 if (scanner().HasAnyLineTerminatorBeforeNext() || 4639 if (scanner()->HasAnyLineTerminatorBeforeNext() ||
4670 tok == Token::RBRACE || 4640 tok == Token::RBRACE ||
4671 tok == Token::EOS) { 4641 tok == Token::EOS) {
4672 return; 4642 return;
4673 } 4643 }
4674 Expect(Token::SEMICOLON, ok); 4644 Expect(Token::SEMICOLON, ok);
4675 } 4645 }
4676 4646
4677 4647
4678 void Parser::ExpectContextualKeyword(Vector<const char> keyword, bool* ok) { 4648 void Parser::ExpectContextualKeyword(Vector<const char> keyword, bool* ok) {
4679 Expect(Token::IDENTIFIER, ok); 4649 Expect(Token::IDENTIFIER, ok);
(...skipping 1207 matching lines...) Expand 10 before | Expand all | Expand 10 after
5887 ASSERT(info()->isolate()->has_pending_exception()); 5857 ASSERT(info()->isolate()->has_pending_exception());
5888 } else { 5858 } else {
5889 result = ParseProgram(); 5859 result = ParseProgram();
5890 } 5860 }
5891 } 5861 }
5892 info()->SetFunction(result); 5862 info()->SetFunction(result);
5893 return (result != NULL); 5863 return (result != NULL);
5894 } 5864 }
5895 5865
5896 } } // namespace v8::internal 5866 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698