| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/ast/ast.h" | 10 #include "src/ast/ast.h" |
| (...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 789 FunctionLiteral* ParserTraits::ParseFunctionLiteral( | 789 FunctionLiteral* ParserTraits::ParseFunctionLiteral( |
| 790 const AstRawString* name, Scanner::Location function_name_location, | 790 const AstRawString* name, Scanner::Location function_name_location, |
| 791 FunctionNameValidity function_name_validity, FunctionKind kind, | 791 FunctionNameValidity function_name_validity, FunctionKind kind, |
| 792 int function_token_position, FunctionLiteral::FunctionType type, | 792 int function_token_position, FunctionLiteral::FunctionType type, |
| 793 LanguageMode language_mode, bool* ok) { | 793 LanguageMode language_mode, bool* ok) { |
| 794 return parser_->ParseFunctionLiteral( | 794 return parser_->ParseFunctionLiteral( |
| 795 name, function_name_location, function_name_validity, kind, | 795 name, function_name_location, function_name_validity, kind, |
| 796 function_token_position, type, language_mode, ok); | 796 function_token_position, type, language_mode, ok); |
| 797 } | 797 } |
| 798 | 798 |
| 799 ClassLiteral* ParserTraits::ParseClassLiteral( | 799 Expression* ParserTraits::ParseClassLiteral( |
| 800 Type::ExpressionClassifier* classifier, const AstRawString* name, | 800 Type::ExpressionClassifier* classifier, const AstRawString* name, |
| 801 Scanner::Location class_name_location, bool name_is_strict_reserved, | 801 Scanner::Location class_name_location, bool name_is_strict_reserved, |
| 802 int pos, bool* ok) { | 802 int pos, bool* ok) { |
| 803 return parser_->ParseClassLiteral(classifier, name, class_name_location, | 803 return parser_->ParseClassLiteral(classifier, name, class_name_location, |
| 804 name_is_strict_reserved, pos, ok); | 804 name_is_strict_reserved, pos, ok); |
| 805 } | 805 } |
| 806 | 806 |
| 807 void ParserTraits::MarkTailPosition(Expression* expression) { | 807 void ParserTraits::MarkTailPosition(Expression* expression) { |
| 808 expression->MarkTail(); | 808 expression->MarkTail(); |
| 809 } | 809 } |
| (...skipping 1450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2260 const AstRawString* variable_name; | 2260 const AstRawString* variable_name; |
| 2261 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) { | 2261 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) { |
| 2262 name = ast_value_factory()->default_string(); | 2262 name = ast_value_factory()->default_string(); |
| 2263 is_strict_reserved = false; | 2263 is_strict_reserved = false; |
| 2264 variable_name = ast_value_factory()->star_default_star_string(); | 2264 variable_name = ast_value_factory()->star_default_star_string(); |
| 2265 } else { | 2265 } else { |
| 2266 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 2266 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 2267 variable_name = name; | 2267 variable_name = name; |
| 2268 } | 2268 } |
| 2269 | 2269 |
| 2270 ClassLiteral* value = ParseClassLiteral(nullptr, name, scanner()->location(), | 2270 Expression* value = ParseClassLiteral(nullptr, name, scanner()->location(), |
| 2271 is_strict_reserved, pos, CHECK_OK); | 2271 is_strict_reserved, pos, CHECK_OK); |
| 2272 | 2272 |
| 2273 VariableProxy* proxy = NewUnresolved(variable_name, LET); | 2273 VariableProxy* proxy = NewUnresolved(variable_name, LET); |
| 2274 Declaration* declaration = | 2274 Declaration* declaration = |
| 2275 factory()->NewVariableDeclaration(proxy, LET, scope(), pos); | 2275 factory()->NewVariableDeclaration(proxy, LET, scope(), pos); |
| 2276 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); | 2276 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 2277 proxy->var()->set_initializer_position(position()); | 2277 proxy->var()->set_initializer_position(position()); |
| 2278 Assignment* assignment = | 2278 Assignment* assignment = |
| 2279 factory()->NewAssignment(Token::INIT, proxy, value, pos); | 2279 factory()->NewAssignment(Token::INIT, proxy, value, pos); |
| 2280 Statement* assignment_statement = | 2280 Statement* assignment_statement = |
| 2281 factory()->NewExpressionStatement(assignment, kNoSourcePosition); | 2281 factory()->NewExpressionStatement(assignment, kNoSourcePosition); |
| (...skipping 2716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4998 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( | 4998 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
| 4999 language_mode(), function_state_->kind(), | 4999 language_mode(), function_state_->kind(), |
| 5000 scope()->has_simple_parameters(), parsing_module_, logger, bookmark, | 5000 scope()->has_simple_parameters(), parsing_module_, logger, bookmark, |
| 5001 use_counts_); | 5001 use_counts_); |
| 5002 if (pre_parse_timer_ != NULL) { | 5002 if (pre_parse_timer_ != NULL) { |
| 5003 pre_parse_timer_->Stop(); | 5003 pre_parse_timer_->Stop(); |
| 5004 } | 5004 } |
| 5005 return result; | 5005 return result; |
| 5006 } | 5006 } |
| 5007 | 5007 |
| 5008 ClassLiteral* Parser::ParseClassLiteral(ExpressionClassifier* classifier, | 5008 Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier, |
| 5009 const AstRawString* name, | 5009 const AstRawString* name, |
| 5010 Scanner::Location class_name_location, | 5010 Scanner::Location class_name_location, |
| 5011 bool name_is_strict_reserved, int pos, | 5011 bool name_is_strict_reserved, int pos, |
| 5012 bool* ok) { | 5012 bool* ok) { |
| 5013 // All parts of a ClassDeclaration and ClassExpression are strict code. | 5013 // All parts of a ClassDeclaration and ClassExpression are strict code. |
| 5014 if (name_is_strict_reserved) { | 5014 if (name_is_strict_reserved) { |
| 5015 ReportMessageAt(class_name_location, | 5015 ReportMessageAt(class_name_location, |
| 5016 MessageTemplate::kUnexpectedStrictReserved); | 5016 MessageTemplate::kUnexpectedStrictReserved); |
| 5017 *ok = false; | 5017 *ok = false; |
| 5018 return NULL; | 5018 return NULL; |
| 5019 } | 5019 } |
| 5020 if (IsEvalOrArguments(name)) { | 5020 if (IsEvalOrArguments(name)) { |
| 5021 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); | 5021 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); |
| 5022 *ok = false; | 5022 *ok = false; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5104 | 5104 |
| 5105 // Note that we do not finalize this block scope because it is | 5105 // Note that we do not finalize this block scope because it is |
| 5106 // used as a sentinel value indicating an anonymous class. | 5106 // used as a sentinel value indicating an anonymous class. |
| 5107 block_scope->set_end_position(end_pos); | 5107 block_scope->set_end_position(end_pos); |
| 5108 | 5108 |
| 5109 if (name != NULL) { | 5109 if (name != NULL) { |
| 5110 DCHECK_NOT_NULL(proxy); | 5110 DCHECK_NOT_NULL(proxy); |
| 5111 proxy->var()->set_initializer_position(end_pos); | 5111 proxy->var()->set_initializer_position(end_pos); |
| 5112 } | 5112 } |
| 5113 | 5113 |
| 5114 return factory()->NewClassLiteral(block_scope, proxy, extends, constructor, | 5114 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos); |
| 5115 properties, pos, end_pos); | 5115 do_block->set_scope(block_scope); |
| 5116 Variable* result_var = |
| 5117 block_scope->NewTemporary(ast_value_factory()->empty_string()); |
| 5118 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos); |
| 5119 |
| 5120 ClassLiteral* class_literal = factory()->NewClassLiteral( |
| 5121 proxy, extends, constructor, properties, pos, end_pos); |
| 5122 |
| 5123 do_block->statements()->Add( |
| 5124 factory()->NewExpressionStatement(class_literal, pos), zone()); |
| 5125 do_expr->set_represented_function(constructor); |
| 5126 Rewriter::Rewrite(this, do_expr, ast_value_factory()); |
| 5127 |
| 5128 return do_expr; |
| 5116 } | 5129 } |
| 5117 | 5130 |
| 5118 | 5131 |
| 5119 Expression* Parser::ParseV8Intrinsic(bool* ok) { | 5132 Expression* Parser::ParseV8Intrinsic(bool* ok) { |
| 5120 // CallRuntime :: | 5133 // CallRuntime :: |
| 5121 // '%' Identifier Arguments | 5134 // '%' Identifier Arguments |
| 5122 | 5135 |
| 5123 int pos = peek_position(); | 5136 int pos = peek_position(); |
| 5124 Expect(Token::MOD, CHECK_OK); | 5137 Expect(Token::MOD, CHECK_OK); |
| 5125 // Allow "eval" or "arguments" for backward compatibility. | 5138 // Allow "eval" or "arguments" for backward compatibility. |
| (...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6099 | 6112 |
| 6100 | 6113 |
| 6101 void ParserTraits::SetFunctionName(Expression* value, | 6114 void ParserTraits::SetFunctionName(Expression* value, |
| 6102 const AstRawString* name) { | 6115 const AstRawString* name) { |
| 6103 DCHECK_NOT_NULL(name); | 6116 DCHECK_NOT_NULL(name); |
| 6104 if (!value->IsAnonymousFunctionDefinition()) return; | 6117 if (!value->IsAnonymousFunctionDefinition()) return; |
| 6105 auto function = value->AsFunctionLiteral(); | 6118 auto function = value->AsFunctionLiteral(); |
| 6106 if (function != nullptr) { | 6119 if (function != nullptr) { |
| 6107 function->set_raw_name(name); | 6120 function->set_raw_name(name); |
| 6108 } else { | 6121 } else { |
| 6109 DCHECK(value->IsClassLiteral()); | 6122 DCHECK(value->IsDoExpression()); |
| 6110 value->AsClassLiteral()->constructor()->set_raw_name(name); | 6123 value->AsDoExpression()->represented_function()->set_raw_name(name); |
| 6111 } | 6124 } |
| 6112 } | 6125 } |
| 6113 | 6126 |
| 6114 | 6127 |
| 6115 // Desugaring of yield* | 6128 // Desugaring of yield* |
| 6116 // ==================== | 6129 // ==================== |
| 6117 // | 6130 // |
| 6118 // With the help of do-expressions and function.sent, we desugar yield* into a | 6131 // With the help of do-expressions and function.sent, we desugar yield* into a |
| 6119 // loop containing a "raw" yield (a yield that doesn't wrap an iterator result | 6132 // loop containing a "raw" yield (a yield that doesn't wrap an iterator result |
| 6120 // object around its argument). Concretely, "yield* iterable" turns into | 6133 // object around its argument). Concretely, "yield* iterable" turns into |
| (...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7081 node->Print(Isolate::Current()); | 7094 node->Print(Isolate::Current()); |
| 7082 } | 7095 } |
| 7083 #endif // DEBUG | 7096 #endif // DEBUG |
| 7084 | 7097 |
| 7085 #undef CHECK_OK | 7098 #undef CHECK_OK |
| 7086 #undef CHECK_OK_VOID | 7099 #undef CHECK_OK_VOID |
| 7087 #undef CHECK_FAILED | 7100 #undef CHECK_FAILED |
| 7088 | 7101 |
| 7089 } // namespace internal | 7102 } // namespace internal |
| 7090 } // namespace v8 | 7103 } // namespace v8 |
| OLD | NEW |