| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|