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

Side by Side Diff: src/parser.cc

Issue 27206002: Unify several checking methods 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 3007 matching lines...) Expand 10 before | Expand all | Expand 10 after
3018 // In parsing the first assignment expression in conditional 3018 // In parsing the first assignment expression in conditional
3019 // expressions we always accept the 'in' keyword; see ECMA-262, 3019 // expressions we always accept the 'in' keyword; see ECMA-262,
3020 // section 11.12, page 58. 3020 // section 11.12, page 58.
3021 Expression* left = ParseAssignmentExpression(true, CHECK_OK); 3021 Expression* left = ParseAssignmentExpression(true, CHECK_OK);
3022 Expect(Token::COLON, CHECK_OK); 3022 Expect(Token::COLON, CHECK_OK);
3023 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); 3023 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
3024 return factory()->NewConditional(expression, left, right, pos); 3024 return factory()->NewConditional(expression, left, right, pos);
3025 } 3025 }
3026 3026
3027 3027
3028 static int Precedence(Token::Value tok, bool accept_IN) { 3028 int ParserBase::Precedence(Token::Value tok, bool accept_IN) {
3029 if (tok == Token::IN && !accept_IN) 3029 if (tok == Token::IN && !accept_IN)
3030 return 0; // 0 precedence will terminate binary expression parsing 3030 return 0; // 0 precedence will terminate binary expression parsing
3031 3031
3032 return Token::Precedence(tok); 3032 return Token::Precedence(tok);
3033 } 3033 }
3034 3034
3035 3035
3036 // Precedence >= 4 3036 // Precedence >= 4
3037 Expression* Parser::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) { 3037 Expression* Parser::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) {
3038 ASSERT(prec >= 4); 3038 ASSERT(prec >= 4);
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
3838 constant_properties->set(position++, *key); 3838 constant_properties->set(position++, *key);
3839 constant_properties->set(position++, *value); 3839 constant_properties->set(position++, *value);
3840 } 3840 }
3841 *fast_elements = 3841 *fast_elements =
3842 (max_element_index <= 32) || ((2 * elements) >= max_element_index); 3842 (max_element_index <= 32) || ((2 * elements) >= max_element_index);
3843 *is_simple = is_simple_acc; 3843 *is_simple = is_simple_acc;
3844 *depth = depth_acc; 3844 *depth = depth_acc;
3845 } 3845 }
3846 3846
3847 3847
3848 // Force instantiation of template instances class.
3849 template void ObjectLiteralChecker<Parser>::CheckProperty(
3850 Token::Value property, PropertyKind type, bool* ok);
3851
3852
3853 Expression* Parser::ParseObjectLiteral(bool* ok) { 3848 Expression* Parser::ParseObjectLiteral(bool* ok) {
3854 // ObjectLiteral :: 3849 // ObjectLiteral ::
3855 // '{' ( 3850 // '{' (
3856 // ((IdentifierName | String | Number) ':' AssignmentExpression) 3851 // ((IdentifierName | String | Number) ':' AssignmentExpression)
3857 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) 3852 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
3858 // )*[','] '}' 3853 // )*[','] '}'
3859 3854
3860 int pos = peek_position(); 3855 int pos = peek_position();
3861 ZoneList<ObjectLiteral::Property*>* properties = 3856 ZoneList<ObjectLiteral::Property*>* properties =
3862 new(zone()) ZoneList<ObjectLiteral::Property*>(4, zone()); 3857 new(zone()) ZoneList<ObjectLiteral::Property*>(4, zone());
3863 int number_of_boilerplate_properties = 0; 3858 int number_of_boilerplate_properties = 0;
3864 bool has_function = false; 3859 bool has_function = false;
3865 3860
3866 ObjectLiteralChecker<Parser> checker(this, &scanner_, 3861 ObjectLiteralChecker checker(this, top_scope_->language_mode());
3867 top_scope_->language_mode());
3868 3862
3869 Expect(Token::LBRACE, CHECK_OK); 3863 Expect(Token::LBRACE, CHECK_OK);
3870 3864
3871 while (peek() != Token::RBRACE) { 3865 while (peek() != Token::RBRACE) {
3872 if (fni_ != NULL) fni_->Enter(); 3866 if (fni_ != NULL) fni_->Enter();
3873 3867
3874 Literal* key = NULL; 3868 Literal* key = NULL;
3875 Token::Value next = peek(); 3869 Token::Value next = peek();
3876 int next_pos = peek_position(); 3870 int next_pos = peek_position();
3877 3871
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after
4611 4605
4612 bool ParserBase::peek_any_identifier() { 4606 bool ParserBase::peek_any_identifier() {
4613 Token::Value next = peek(); 4607 Token::Value next = peek();
4614 return next == Token::IDENTIFIER || 4608 return next == Token::IDENTIFIER ||
4615 next == Token::FUTURE_RESERVED_WORD || 4609 next == Token::FUTURE_RESERVED_WORD ||
4616 next == Token::FUTURE_STRICT_RESERVED_WORD || 4610 next == Token::FUTURE_STRICT_RESERVED_WORD ||
4617 next == Token::YIELD; 4611 next == Token::YIELD;
4618 } 4612 }
4619 4613
4620 4614
4621 bool Parser::CheckContextualKeyword(Vector<const char> keyword) { 4615 bool ParserBase::CheckContextualKeyword(Vector<const char> keyword) {
4622 if (peek() == Token::IDENTIFIER && 4616 if (peek() == Token::IDENTIFIER &&
4623 scanner().is_next_contextual_keyword(keyword)) { 4617 scanner()->is_next_contextual_keyword(keyword)) {
4624 Consume(Token::IDENTIFIER); 4618 Consume(Token::IDENTIFIER);
4625 return true; 4619 return true;
4626 } 4620 }
4627 return false; 4621 return false;
4628 } 4622 }
4629 4623
4630 4624
4631 void ParserBase::ExpectSemicolon(bool* ok) { 4625 void ParserBase::ExpectSemicolon(bool* ok) {
4632 // Check for automatic semicolon insertion according to 4626 // Check for automatic semicolon insertion according to
4633 // the rules given in ECMA-262, section 7.9, page 21. 4627 // the rules given in ECMA-262, section 7.9, page 21.
4634 Token::Value tok = peek(); 4628 Token::Value tok = peek();
4635 if (tok == Token::SEMICOLON) { 4629 if (tok == Token::SEMICOLON) {
4636 Next(); 4630 Next();
4637 return; 4631 return;
4638 } 4632 }
4639 if (scanner()->HasAnyLineTerminatorBeforeNext() || 4633 if (scanner()->HasAnyLineTerminatorBeforeNext() ||
4640 tok == Token::RBRACE || 4634 tok == Token::RBRACE ||
4641 tok == Token::EOS) { 4635 tok == Token::EOS) {
4642 return; 4636 return;
4643 } 4637 }
4644 Expect(Token::SEMICOLON, ok); 4638 Expect(Token::SEMICOLON, ok);
4645 } 4639 }
4646 4640
4647 4641
4648 void Parser::ExpectContextualKeyword(Vector<const char> keyword, bool* ok) { 4642 void ParserBase::ExpectContextualKeyword(Vector<const char> keyword, bool* ok) {
4649 Expect(Token::IDENTIFIER, ok); 4643 Expect(Token::IDENTIFIER, ok);
4650 if (!*ok) return; 4644 if (!*ok) return;
4651 if (!scanner().is_literal_contextual_keyword(keyword)) { 4645 if (!scanner()->is_literal_contextual_keyword(keyword)) {
4646 ReportUnexpectedToken(scanner()->current_token());
4652 *ok = false; 4647 *ok = false;
4653 ReportUnexpectedToken(scanner().current_token());
4654 } 4648 }
4655 } 4649 }
4656 4650
4657 4651
4658 Literal* Parser::GetLiteralUndefined(int position) { 4652 Literal* Parser::GetLiteralUndefined(int position) {
4659 return factory()->NewLiteral( 4653 return factory()->NewLiteral(
4660 isolate()->factory()->undefined_value(), position); 4654 isolate()->factory()->undefined_value(), position);
4661 } 4655 }
4662 4656
4663 4657
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
4738 4732
4739 if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) { 4733 if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) {
4740 ReportMessage(error, Vector<const char*>::empty()); 4734 ReportMessage(error, Vector<const char*>::empty());
4741 *ok = false; 4735 *ok = false;
4742 } 4736 }
4743 } 4737 }
4744 4738
4745 4739
4746 // Checks whether an octal literal was last seen between beg_pos and end_pos. 4740 // Checks whether an octal literal was last seen between beg_pos and end_pos.
4747 // If so, reports an error. Only called for strict mode. 4741 // If so, reports an error. Only called for strict mode.
4748 void Parser::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) { 4742 void ParserBase::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) {
4749 Scanner::Location octal = scanner().octal_position(); 4743 Scanner::Location octal = scanner()->octal_position();
4750 if (octal.IsValid() && 4744 if (octal.IsValid() && beg_pos <= octal.beg_pos && octal.end_pos <= end_pos) {
4751 beg_pos <= octal.beg_pos && 4745 ReportMessageAt(octal, "strict_octal_literal");
4752 octal.end_pos <= end_pos) { 4746 scanner()->clear_octal_position();
4753 ReportMessageAt(octal, "strict_octal_literal",
4754 Vector<const char*>::empty());
4755 scanner().clear_octal_position();
4756 *ok = false; 4747 *ok = false;
4757 } 4748 }
4758 } 4749 }
4759 4750
4760 4751
4761 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { 4752 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) {
4762 Declaration* decl = scope->CheckConflictingVarDeclarations(); 4753 Declaration* decl = scope->CheckConflictingVarDeclarations();
4763 if (decl != NULL) { 4754 if (decl != NULL) {
4764 // In harmony mode we treat conflicting variable bindinds as early 4755 // In harmony mode we treat conflicting variable bindinds as early
4765 // errors. See ES5 16 for a definition of early errors. 4756 // errors. See ES5 16 for a definition of early errors.
(...skipping 1091 matching lines...) Expand 10 before | Expand all | Expand 10 after
5857 ASSERT(info()->isolate()->has_pending_exception()); 5848 ASSERT(info()->isolate()->has_pending_exception());
5858 } else { 5849 } else {
5859 result = ParseProgram(); 5850 result = ParseProgram();
5860 } 5851 }
5861 } 5852 }
5862 info()->SetFunction(result); 5853 info()->SetFunction(result);
5863 return (result != NULL); 5854 return (result != NULL);
5864 } 5855 }
5865 5856
5866 } } // namespace v8::internal 5857 } } // 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