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 "src/api.h" | 7 #include "src/api.h" |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/ast-expression-rewriter.h" | 9 #include "src/ast/ast-expression-rewriter.h" |
10 #include "src/ast/ast-expression-visitor.h" | 10 #include "src/ast/ast-expression-visitor.h" |
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
762 FunctionLiteral* ParserTraits::ParseFunctionLiteral( | 762 FunctionLiteral* ParserTraits::ParseFunctionLiteral( |
763 const AstRawString* name, Scanner::Location function_name_location, | 763 const AstRawString* name, Scanner::Location function_name_location, |
764 FunctionNameValidity function_name_validity, FunctionKind kind, | 764 FunctionNameValidity function_name_validity, FunctionKind kind, |
765 int function_token_position, FunctionLiteral::FunctionType type, | 765 int function_token_position, FunctionLiteral::FunctionType type, |
766 LanguageMode language_mode, bool* ok) { | 766 LanguageMode language_mode, bool* ok) { |
767 return parser_->ParseFunctionLiteral( | 767 return parser_->ParseFunctionLiteral( |
768 name, function_name_location, function_name_validity, kind, | 768 name, function_name_location, function_name_validity, kind, |
769 function_token_position, type, language_mode, ok); | 769 function_token_position, type, language_mode, ok); |
770 } | 770 } |
771 | 771 |
772 ClassLiteral* ParserTraits::ParseClassLiteral( | 772 Expression* ParserTraits::ParseClassLiteral( |
773 Type::ExpressionClassifier* classifier, const AstRawString* name, | 773 Type::ExpressionClassifier* classifier, const AstRawString* name, |
774 Scanner::Location class_name_location, bool name_is_strict_reserved, | 774 Scanner::Location class_name_location, bool name_is_strict_reserved, |
775 int pos, bool* ok) { | 775 int pos, bool* ok) { |
776 return parser_->ParseClassLiteral(classifier, name, class_name_location, | 776 return parser_->ParseClassLiteral(classifier, name, class_name_location, |
777 name_is_strict_reserved, pos, ok); | 777 name_is_strict_reserved, pos, ok); |
778 } | 778 } |
779 | 779 |
780 void ParserTraits::MarkTailPosition(Expression* expression) { | 780 void ParserTraits::MarkTailPosition(Expression* expression) { |
781 expression->MarkTail(); | 781 expression->MarkTail(); |
782 } | 782 } |
(...skipping 1446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2229 const AstRawString* variable_name; | 2229 const AstRawString* variable_name; |
2230 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) { | 2230 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) { |
2231 name = ast_value_factory()->default_string(); | 2231 name = ast_value_factory()->default_string(); |
2232 is_strict_reserved = false; | 2232 is_strict_reserved = false; |
2233 variable_name = ast_value_factory()->star_default_star_string(); | 2233 variable_name = ast_value_factory()->star_default_star_string(); |
2234 } else { | 2234 } else { |
2235 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 2235 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
2236 variable_name = name; | 2236 variable_name = name; |
2237 } | 2237 } |
2238 | 2238 |
2239 ClassLiteral* value = ParseClassLiteral(nullptr, name, scanner()->location(), | 2239 Expression* value = ParseClassLiteral(nullptr, name, scanner()->location(), |
2240 is_strict_reserved, pos, CHECK_OK); | 2240 is_strict_reserved, pos, CHECK_OK); |
2241 | 2241 |
2242 VariableProxy* proxy = NewUnresolved(variable_name, LET); | 2242 VariableProxy* proxy = NewUnresolved(variable_name, LET); |
2243 Declaration* declaration = | 2243 Declaration* declaration = |
2244 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); | 2244 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); |
2245 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); | 2245 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
2246 proxy->var()->set_initializer_position(position()); | 2246 proxy->var()->set_initializer_position(position()); |
2247 Assignment* assignment = | 2247 Assignment* assignment = |
2248 factory()->NewAssignment(Token::INIT, proxy, value, pos); | 2248 factory()->NewAssignment(Token::INIT, proxy, value, pos); |
2249 Statement* assignment_statement = | 2249 Statement* assignment_statement = |
2250 factory()->NewExpressionStatement(assignment, kNoSourcePosition); | 2250 factory()->NewExpressionStatement(assignment, kNoSourcePosition); |
(...skipping 2716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4967 } | 4967 } |
4968 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( | 4968 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
4969 language_mode(), function_state_->kind(), scope_->has_simple_parameters(), | 4969 language_mode(), function_state_->kind(), scope_->has_simple_parameters(), |
4970 parsing_module_, logger, bookmark, use_counts_); | 4970 parsing_module_, logger, bookmark, use_counts_); |
4971 if (pre_parse_timer_ != NULL) { | 4971 if (pre_parse_timer_ != NULL) { |
4972 pre_parse_timer_->Stop(); | 4972 pre_parse_timer_->Stop(); |
4973 } | 4973 } |
4974 return result; | 4974 return result; |
4975 } | 4975 } |
4976 | 4976 |
4977 ClassLiteral* Parser::ParseClassLiteral(ExpressionClassifier* classifier, | 4977 Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier, |
4978 const AstRawString* name, | 4978 const AstRawString* name, |
4979 Scanner::Location class_name_location, | 4979 Scanner::Location class_name_location, |
4980 bool name_is_strict_reserved, int pos, | 4980 bool name_is_strict_reserved, int pos, |
4981 bool* ok) { | 4981 bool* ok) { |
4982 // All parts of a ClassDeclaration and ClassExpression are strict code. | 4982 // All parts of a ClassDeclaration and ClassExpression are strict code. |
4983 if (name_is_strict_reserved) { | 4983 if (name_is_strict_reserved) { |
4984 ReportMessageAt(class_name_location, | 4984 ReportMessageAt(class_name_location, |
4985 MessageTemplate::kUnexpectedStrictReserved); | 4985 MessageTemplate::kUnexpectedStrictReserved); |
4986 *ok = false; | 4986 *ok = false; |
4987 return NULL; | 4987 return NULL; |
4988 } | 4988 } |
4989 if (IsEvalOrArguments(name)) { | 4989 if (IsEvalOrArguments(name)) { |
4990 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); | 4990 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); |
4991 *ok = false; | 4991 *ok = false; |
(...skipping 23 matching lines...) Expand all Loading... | |
5015 if (classifier != nullptr) { | 5015 if (classifier != nullptr) { |
5016 classifier->Accumulate(&extends_classifier, | 5016 classifier->Accumulate(&extends_classifier, |
5017 ExpressionClassifier::ExpressionProductions); | 5017 ExpressionClassifier::ExpressionProductions); |
5018 } | 5018 } |
5019 } else { | 5019 } else { |
5020 block_scope->set_start_position(scanner()->location().end_pos); | 5020 block_scope->set_start_position(scanner()->location().end_pos); |
5021 } | 5021 } |
5022 | 5022 |
5023 | 5023 |
5024 ClassLiteralChecker checker(this); | 5024 ClassLiteralChecker checker(this); |
5025 ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4, zone()); | |
5026 FunctionLiteral* constructor = NULL; | 5025 FunctionLiteral* constructor = NULL; |
5026 | |
5027 ZoneList<Expression*>* property_names = | |
5028 new (zone()) ZoneList<Expression*>(4, zone()); | |
5029 ZoneList<Expression*>* property_funcs = | |
5030 new (zone()) ZoneList<Expression*>(4, zone()); | |
5031 ZoneList<Expression*>* property_infos = | |
5032 new (zone()) ZoneList<Expression*>(4, zone()); | |
5033 | |
5027 bool has_seen_constructor = false; | 5034 bool has_seen_constructor = false; |
5028 | 5035 |
5029 Expect(Token::LBRACE, CHECK_OK); | 5036 Expect(Token::LBRACE, CHECK_OK); |
5030 | 5037 |
5031 const bool has_extends = extends != nullptr; | 5038 const bool has_extends = extends != nullptr; |
5032 while (peek() != Token::RBRACE) { | 5039 while (peek() != Token::RBRACE) { |
5033 if (Check(Token::SEMICOLON)) continue; | 5040 if (Check(Token::SEMICOLON)) continue; |
5034 FuncNameInferrer::State fni_state(fni_); | 5041 FuncNameInferrer::State fni_state(fni_); |
5035 const bool in_class = true; | 5042 const bool in_class = true; |
5036 bool is_computed_name = false; // Classes do not care about computed | 5043 bool is_computed_name = false; // Classes do not care about computed |
5037 // property names here. | 5044 // property names here. |
5038 ExpressionClassifier property_classifier(this); | 5045 ExpressionClassifier property_classifier(this); |
5039 const AstRawString* property_name = nullptr; | 5046 const AstRawString* property_name = nullptr; |
5040 ObjectLiteral::Property* property = ParsePropertyDefinition( | 5047 ObjectLiteral::Property* property = ParsePropertyDefinition( |
5041 &checker, in_class, has_extends, MethodKind::Normal, &is_computed_name, | 5048 &checker, in_class, has_extends, MethodKind::Normal, &is_computed_name, |
5042 &has_seen_constructor, &property_classifier, &property_name, CHECK_OK); | 5049 &has_seen_constructor, &property_classifier, &property_name, CHECK_OK); |
5043 RewriteNonPattern(&property_classifier, CHECK_OK); | 5050 RewriteNonPattern(&property_classifier, CHECK_OK); |
5044 if (classifier != nullptr) { | 5051 if (classifier != nullptr) { |
5045 classifier->Accumulate(&property_classifier, | 5052 classifier->Accumulate(&property_classifier, |
5046 ExpressionClassifier::ExpressionProductions); | 5053 ExpressionClassifier::ExpressionProductions); |
5047 } | 5054 } |
5048 | 5055 |
5049 if (has_seen_constructor && constructor == NULL) { | 5056 if (has_seen_constructor && constructor == NULL) { |
5050 constructor = GetPropertyValue(property)->AsFunctionLiteral(); | 5057 constructor = GetPropertyValue(property)->AsFunctionLiteral(); |
5051 DCHECK_NOT_NULL(constructor); | 5058 DCHECK_NOT_NULL(constructor); |
5052 constructor->set_raw_name( | 5059 constructor->set_raw_name( |
5053 name != nullptr ? name : ast_value_factory()->empty_string()); | 5060 name != nullptr ? name : ast_value_factory()->empty_string()); |
5054 } else { | 5061 } else { |
5055 properties->Add(property, zone()); | 5062 Expression* value = property->value(); |
5063 int property_position = value->position(); | |
5064 | |
5065 Expression* property_key; | |
5066 | |
5067 if (property_name != nullptr) { | |
5068 // For static keys, no ToName call is necessary. | |
5069 if (property->key()->IsPropertyName()) { | |
5070 property_key = property->key(); | |
5071 } else { | |
5072 property_key = | |
5073 factory()->NewStringLiteral(property_name, property_position); | |
5074 } | |
5075 } else { | |
5076 ZoneList<Expression*>* to_name_args = | |
5077 new (zone()) ZoneList<Expression*>(1, zone()); | |
5078 to_name_args->Add(property->key(), zone()); | |
5079 | |
5080 property_key = factory()->NewCallRuntime(Runtime::kToName, to_name_args, | |
Benedikt Meurer
2016/07/19 04:04:27
Nit: Please add a TODO here, that we look into thi
| |
5081 property_position); | |
5082 } | |
5083 | |
5084 int info = property->is_static() ? kIsStaticMask : 0; | |
5085 switch (property->kind()) { | |
5086 case ObjectLiteral::Property::CONSTANT: | |
5087 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | |
5088 case ObjectLiteral::Property::PROTOTYPE: | |
5089 UNREACHABLE(); | |
5090 case ObjectLiteral::Property::COMPUTED: | |
5091 break; | |
5092 | |
5093 case ObjectLiteral::Property::GETTER: | |
5094 info |= kIsAccessorMask; | |
5095 break; | |
5096 | |
5097 case ObjectLiteral::Property::SETTER: | |
5098 info |= kIsAccessorMask | kIsSetterMask; | |
5099 break; | |
5100 } | |
5101 | |
5102 property_names->Add(property_key, zone()); | |
5103 property_funcs->Add(value, zone()); | |
5104 property_infos->Add(factory()->NewNumberLiteral(info, kNoSourcePosition), | |
5105 zone()); | |
5056 } | 5106 } |
5057 | 5107 |
5058 if (fni_ != NULL) fni_->Infer(); | 5108 if (fni_ != NULL) fni_->Infer(); |
5059 | 5109 |
5060 if (property_name != ast_value_factory()->constructor_string()) { | 5110 if (property_name != ast_value_factory()->constructor_string()) { |
5061 SetFunctionNameFromPropertyName(property, property_name); | 5111 SetFunctionNameFromPropertyName(property, property_name); |
5062 } | 5112 } |
5063 } | 5113 } |
5064 | 5114 |
5065 Expect(Token::RBRACE, CHECK_OK); | 5115 Expect(Token::RBRACE, CHECK_OK); |
5066 int end_pos = scanner()->location().end_pos; | 5116 int end_pos = scanner()->location().end_pos; |
5067 | 5117 |
5068 if (constructor == NULL) { | 5118 if (constructor == NULL) { |
5069 constructor = DefaultConstructor(name, has_extends, block_scope, pos, | 5119 constructor = DefaultConstructor(name, has_extends, block_scope, pos, |
5070 end_pos, block_scope->language_mode()); | 5120 end_pos, block_scope->language_mode()); |
5071 } | 5121 } |
5072 | 5122 |
5073 // Note that we do not finalize this block scope because it is | 5123 // Note that we do not finalize this block scope because it is |
5074 // used as a sentinel value indicating an anonymous class. | 5124 // used as a sentinel value indicating an anonymous class. |
5075 block_scope->set_end_position(end_pos); | 5125 block_scope->set_end_position(end_pos); |
5076 | 5126 |
5077 if (name != NULL) { | 5127 if (name != NULL) { |
5078 DCHECK_NOT_NULL(proxy); | 5128 DCHECK_NOT_NULL(proxy); |
5079 proxy->var()->set_initializer_position(end_pos); | 5129 proxy->var()->set_initializer_position(end_pos); |
5080 } | 5130 } |
5081 | 5131 |
5082 return factory()->NewClassLiteral(block_scope, proxy, extends, constructor, | 5132 // Construct a DoExpression representing the class literal. |
5083 properties, pos, end_pos); | 5133 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos); |
5134 do_block->set_scope(scope_); | |
5135 | |
5136 // Call DefineClass. It takes seven arguments: | |
Benedikt Meurer
2016/07/19 04:04:27
I remember when we discussed this, we wanted to ac
Dan Ehrenberg
2016/07/19 04:52:33
The issue here is that the properties that are cre
| |
5137 // 1. The superclass constructor, or the Hole if not present. | |
5138 // 2. The constructor function. | |
5139 // 3. An array of method names. | |
5140 // 4. An array of said method's corresponding functions. | |
5141 // 5. An array of flags signalling if they are accessors and/or static. | |
5142 // 6. The location where the class's source starts. | |
5143 // 7. The location where the class's source ends. | |
5144 ZoneList<Expression*>* define_class_args = | |
5145 new (zone()) ZoneList<Expression*>(7, zone()); | |
5146 define_class_args->Add(extends != nullptr | |
5147 ? extends | |
5148 : factory()->NewTheHoleLiteral(kNoSourcePosition), | |
5149 zone()); | |
5150 define_class_args->Add(constructor, zone()); | |
5151 | |
5152 int names_idx = function_state_->NextMaterializedLiteralIndex(); | |
5153 int funcs_idx = function_state_->NextMaterializedLiteralIndex(); | |
5154 int infos_idx = function_state_->NextMaterializedLiteralIndex(); | |
5155 | |
5156 define_class_args->Add( | |
Benedikt Meurer
2016/07/19 04:04:27
Why do we wrap these into JSArrays? That seems rat
Dan Ehrenberg
2016/07/19 04:52:33
Is there a way to create FixedArrays from the pars
marja
2016/07/19 09:54:34
FixedArray is a heap object, so no. This will be c
| |
5157 factory()->NewArrayLiteral(property_names, names_idx, kNoSourcePosition), | |
5158 zone()); | |
5159 define_class_args->Add( | |
5160 factory()->NewArrayLiteral(property_funcs, funcs_idx, kNoSourcePosition), | |
5161 zone()); | |
5162 define_class_args->Add( | |
5163 factory()->NewArrayLiteral(property_infos, infos_idx, kNoSourcePosition), | |
5164 zone()); | |
5165 | |
5166 define_class_args->Add(factory()->NewNumberLiteral(pos, kNoSourcePosition), | |
5167 zone()); | |
5168 define_class_args->Add( | |
5169 factory()->NewNumberLiteral(end_pos, kNoSourcePosition), zone()); | |
5170 | |
5171 Expression* define_class_call = factory()->NewCallRuntime( | |
5172 Runtime::kDefineClass, define_class_args, kNoSourcePosition); | |
5173 | |
5174 // Set the constructor to have fast properties. | |
5175 ZoneList<Expression*>* fast_properties_args = | |
5176 new (zone()) ZoneList<Expression*>(1, zone()); | |
5177 fast_properties_args->Add(define_class_call, zone()); | |
5178 | |
5179 // This call returns its argument, so we can chain it. | |
5180 Expression* fast_properties_call = factory()->NewCallRuntime( | |
5181 Runtime::kToFastProperties, fast_properties_args, kNoSourcePosition); | |
5182 | |
5183 if (name != nullptr) { | |
5184 DCHECK_NOT_NULL(proxy); | |
5185 // Init the variable representing the class name only after evaluating all | |
5186 // property names. | |
5187 Expression* name_assignment = factory()->NewAssignment( | |
5188 Token::INIT, proxy, fast_properties_call, end_pos); | |
5189 | |
5190 do_block->statements()->Add( | |
5191 factory()->NewExpressionStatement(name_assignment, end_pos), zone()); | |
5192 } else { | |
5193 do_block->statements()->Add(factory()->NewExpressionStatement( | |
5194 fast_properties_call, kNoSourcePosition), | |
5195 zone()); | |
5196 } | |
5197 | |
5198 Variable* result = scope_->NewTemporary(ast_value_factory()->empty_string()); | |
5199 DoExpression* expr = factory()->NewDoExpression(do_block, result, pos); | |
5200 | |
5201 Rewriter::Rewrite(this, expr, | |
5202 ast_value_factory()); // TODO(bakkot) This is just going to | |
5203 // turn the final ExpressionStatement | |
5204 // into an assignment to result; we | |
5205 // could do that ourselves slightly | |
5206 // cheaper. | |
5207 | |
5208 // This enables function name inference. | |
5209 expr->set_represented_function(constructor); | |
5210 | |
5211 return expr; | |
5084 } | 5212 } |
5085 | 5213 |
5086 | 5214 |
5087 Expression* Parser::ParseV8Intrinsic(bool* ok) { | 5215 Expression* Parser::ParseV8Intrinsic(bool* ok) { |
5088 // CallRuntime :: | 5216 // CallRuntime :: |
5089 // '%' Identifier Arguments | 5217 // '%' Identifier Arguments |
5090 | 5218 |
5091 int pos = peek_position(); | 5219 int pos = peek_position(); |
5092 Expect(Token::MOD, CHECK_OK); | 5220 Expect(Token::MOD, CHECK_OK); |
5093 // Allow "eval" or "arguments" for backward compatibility. | 5221 // Allow "eval" or "arguments" for backward compatibility. |
(...skipping 955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6049 DCHECK_NOT_NULL(name); | 6177 DCHECK_NOT_NULL(name); |
6050 | 6178 |
6051 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] | 6179 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] |
6052 // of an object literal. | 6180 // of an object literal. |
6053 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; | 6181 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; |
6054 | 6182 |
6055 if (function != nullptr) { | 6183 if (function != nullptr) { |
6056 function->set_raw_name(name); | 6184 function->set_raw_name(name); |
6057 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); | 6185 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); |
6058 } else { | 6186 } else { |
6059 DCHECK(value->IsClassLiteral()); | 6187 DCHECK(value->IsDoExpression()); |
6060 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); | 6188 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); |
6061 value->AsClassLiteral()->constructor()->set_raw_name(name); | 6189 DCHECK_NOT_NULL(value->AsDoExpression()->represented_function()); |
6190 value->AsDoExpression()->represented_function()->set_raw_name(name); | |
6062 } | 6191 } |
6063 } | 6192 } |
6064 | 6193 |
6065 | 6194 |
6066 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, | 6195 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, |
6067 Expression* identifier) { | 6196 Expression* identifier) { |
6068 if (!value->IsAnonymousFunctionDefinition()) return; | 6197 if (!value->IsAnonymousFunctionDefinition()) return; |
6069 if (!identifier->IsVariableProxy()) return; | 6198 if (!identifier->IsVariableProxy()) return; |
6070 | 6199 |
6071 auto name = identifier->AsVariableProxy()->raw_name(); | 6200 auto name = identifier->AsVariableProxy()->raw_name(); |
6072 DCHECK_NOT_NULL(name); | 6201 DCHECK_NOT_NULL(name); |
6073 | 6202 |
6074 auto function = value->AsFunctionLiteral(); | 6203 auto function = value->AsFunctionLiteral(); |
6075 if (function != nullptr) { | 6204 if (function != nullptr) { |
6076 function->set_raw_name(name); | 6205 function->set_raw_name(name); |
6077 } else { | 6206 } else { |
6078 DCHECK(value->IsClassLiteral()); | 6207 DCHECK(value->IsDoExpression()); |
6079 value->AsClassLiteral()->constructor()->set_raw_name(name); | 6208 DCHECK_NOT_NULL(value->AsDoExpression()->represented_function()); |
6209 value->AsDoExpression()->represented_function()->set_raw_name(name); | |
6080 } | 6210 } |
6081 } | 6211 } |
6082 | 6212 |
6083 | 6213 |
6084 // Desugaring of yield* | 6214 // Desugaring of yield* |
6085 // ==================== | 6215 // ==================== |
6086 // | 6216 // |
6087 // With the help of do-expressions and function.sent, we desugar yield* into a | 6217 // With the help of do-expressions and function.sent, we desugar yield* into a |
6088 // loop containing a "raw" yield (a yield that doesn't wrap an iterator result | 6218 // loop containing a "raw" yield (a yield that doesn't wrap an iterator result |
6089 // object around its argument). Concretely, "yield* iterable" turns into | 6219 // object around its argument). Concretely, "yield* iterable" turns into |
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7046 | 7176 |
7047 #ifdef DEBUG | 7177 #ifdef DEBUG |
7048 void Parser::Print(AstNode* node) { | 7178 void Parser::Print(AstNode* node) { |
7049 ast_value_factory()->Internalize(Isolate::Current()); | 7179 ast_value_factory()->Internalize(Isolate::Current()); |
7050 node->Print(Isolate::Current()); | 7180 node->Print(Isolate::Current()); |
7051 } | 7181 } |
7052 #endif // DEBUG | 7182 #endif // DEBUG |
7053 | 7183 |
7054 } // namespace internal | 7184 } // namespace internal |
7055 } // namespace v8 | 7185 } // namespace v8 |
OLD | NEW |