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 1447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2230 const AstRawString* variable_name; | 2230 const AstRawString* variable_name; |
2231 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) { | 2231 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) { |
2232 name = ast_value_factory()->default_string(); | 2232 name = ast_value_factory()->default_string(); |
2233 is_strict_reserved = false; | 2233 is_strict_reserved = false; |
2234 variable_name = ast_value_factory()->star_default_star_string(); | 2234 variable_name = ast_value_factory()->star_default_star_string(); |
2235 } else { | 2235 } else { |
2236 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 2236 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
2237 variable_name = name; | 2237 variable_name = name; |
2238 } | 2238 } |
2239 | 2239 |
2240 ClassLiteral* value = ParseClassLiteral(nullptr, name, scanner()->location(), | 2240 Expression* value = ParseClassLiteral(nullptr, name, scanner()->location(), |
2241 is_strict_reserved, pos, CHECK_OK); | 2241 is_strict_reserved, pos, CHECK_OK); |
2242 | 2242 |
2243 VariableProxy* proxy = NewUnresolved(variable_name, LET); | 2243 VariableProxy* proxy = NewUnresolved(variable_name, LET); |
2244 Declaration* declaration = | 2244 Declaration* declaration = |
2245 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); | 2245 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); |
2246 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); | 2246 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
2247 proxy->var()->set_initializer_position(position()); | 2247 proxy->var()->set_initializer_position(position()); |
2248 Assignment* assignment = | 2248 Assignment* assignment = |
2249 factory()->NewAssignment(Token::INIT, proxy, value, pos); | 2249 factory()->NewAssignment(Token::INIT, proxy, value, pos); |
2250 Statement* assignment_statement = | 2250 Statement* assignment_statement = |
2251 factory()->NewExpressionStatement(assignment, kNoSourcePosition); | 2251 factory()->NewExpressionStatement(assignment, kNoSourcePosition); |
(...skipping 2670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4922 } | 4922 } |
4923 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( | 4923 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
4924 language_mode(), function_state_->kind(), scope_->has_simple_parameters(), | 4924 language_mode(), function_state_->kind(), scope_->has_simple_parameters(), |
4925 parsing_module_, logger, bookmark, use_counts_); | 4925 parsing_module_, logger, bookmark, use_counts_); |
4926 if (pre_parse_timer_ != NULL) { | 4926 if (pre_parse_timer_ != NULL) { |
4927 pre_parse_timer_->Stop(); | 4927 pre_parse_timer_->Stop(); |
4928 } | 4928 } |
4929 return result; | 4929 return result; |
4930 } | 4930 } |
4931 | 4931 |
4932 ClassLiteral* Parser::ParseClassLiteral(ExpressionClassifier* classifier, | 4932 Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier, |
4933 const AstRawString* name, | 4933 const AstRawString* name, |
4934 Scanner::Location class_name_location, | 4934 Scanner::Location class_name_location, |
4935 bool name_is_strict_reserved, int pos, | 4935 bool name_is_strict_reserved, int pos, |
4936 bool* ok) { | 4936 bool* ok) { |
4937 // All parts of a ClassDeclaration and ClassExpression are strict code. | 4937 // All parts of a ClassDeclaration and ClassExpression are strict code. |
4938 if (name_is_strict_reserved) { | 4938 if (name_is_strict_reserved) { |
4939 ReportMessageAt(class_name_location, | 4939 ReportMessageAt(class_name_location, |
4940 MessageTemplate::kUnexpectedStrictReserved); | 4940 MessageTemplate::kUnexpectedStrictReserved); |
4941 *ok = false; | 4941 *ok = false; |
4942 return NULL; | 4942 return NULL; |
4943 } | 4943 } |
4944 if (IsEvalOrArguments(name)) { | 4944 if (IsEvalOrArguments(name)) { |
4945 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); | 4945 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); |
4946 *ok = false; | 4946 *ok = false; |
(...skipping 23 matching lines...) Expand all Loading... | |
4970 if (classifier != nullptr) { | 4970 if (classifier != nullptr) { |
4971 classifier->Accumulate(&extends_classifier, | 4971 classifier->Accumulate(&extends_classifier, |
4972 ExpressionClassifier::ExpressionProductions); | 4972 ExpressionClassifier::ExpressionProductions); |
4973 } | 4973 } |
4974 } else { | 4974 } else { |
4975 block_scope->set_start_position(scanner()->location().end_pos); | 4975 block_scope->set_start_position(scanner()->location().end_pos); |
4976 } | 4976 } |
4977 | 4977 |
4978 | 4978 |
4979 ClassLiteralChecker checker(this); | 4979 ClassLiteralChecker checker(this); |
4980 ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4, zone()); | |
4981 FunctionLiteral* constructor = NULL; | 4980 FunctionLiteral* constructor = NULL; |
4981 | |
4982 ZoneList<Expression*>* property_names = | |
4983 new (zone()) ZoneList<Expression*>(4, zone()); | |
4984 ZoneList<Expression*>* property_funcs = | |
4985 new (zone()) ZoneList<Expression*>(4, zone()); | |
4986 ZoneList<Expression*>* property_infos = | |
4987 new (zone()) ZoneList<Expression*>(4, zone()); | |
4988 | |
4982 bool has_seen_constructor = false; | 4989 bool has_seen_constructor = false; |
4983 | 4990 |
4984 Expect(Token::LBRACE, CHECK_OK); | 4991 Expect(Token::LBRACE, CHECK_OK); |
4985 | 4992 |
4986 const bool has_extends = extends != nullptr; | 4993 const bool has_extends = extends != nullptr; |
4987 while (peek() != Token::RBRACE) { | 4994 while (peek() != Token::RBRACE) { |
4988 if (Check(Token::SEMICOLON)) continue; | 4995 if (Check(Token::SEMICOLON)) continue; |
4989 FuncNameInferrer::State fni_state(fni_); | 4996 FuncNameInferrer::State fni_state(fni_); |
4990 const bool in_class = true; | 4997 const bool in_class = true; |
4991 bool is_computed_name = false; // Classes do not care about computed | 4998 bool is_computed_name = false; // Classes do not care about computed |
4992 // property names here. | 4999 // property names here. |
4993 ExpressionClassifier property_classifier(this); | 5000 ExpressionClassifier property_classifier(this); |
4994 const AstRawString* property_name = nullptr; | 5001 const AstRawString* property_name = nullptr; |
4995 ObjectLiteral::Property* property = ParsePropertyDefinition( | 5002 ObjectLiteral::Property* property = ParsePropertyDefinition( |
4996 &checker, in_class, has_extends, MethodKind::Normal, &is_computed_name, | 5003 &checker, in_class, has_extends, MethodKind::Normal, &is_computed_name, |
4997 &has_seen_constructor, &property_classifier, &property_name, CHECK_OK); | 5004 &has_seen_constructor, &property_classifier, &property_name, CHECK_OK); |
4998 RewriteNonPattern(&property_classifier, CHECK_OK); | 5005 RewriteNonPattern(&property_classifier, CHECK_OK); |
4999 if (classifier != nullptr) { | 5006 if (classifier != nullptr) { |
5000 classifier->Accumulate(&property_classifier, | 5007 classifier->Accumulate(&property_classifier, |
5001 ExpressionClassifier::ExpressionProductions); | 5008 ExpressionClassifier::ExpressionProductions); |
5002 } | 5009 } |
5003 | 5010 |
5004 if (has_seen_constructor && constructor == NULL) { | 5011 if (has_seen_constructor && constructor == NULL) { |
5005 constructor = GetPropertyValue(property)->AsFunctionLiteral(); | 5012 constructor = GetPropertyValue(property)->AsFunctionLiteral(); |
5006 DCHECK_NOT_NULL(constructor); | 5013 DCHECK_NOT_NULL(constructor); |
5007 constructor->set_raw_name( | 5014 constructor->set_raw_name( |
5008 name != nullptr ? name : ast_value_factory()->empty_string()); | 5015 name != nullptr ? name : ast_value_factory()->empty_string()); |
5009 } else { | 5016 } else { |
5010 properties->Add(property, zone()); | 5017 auto prop_pos = |
adamk
2016/07/13 20:57:32
The general practice in v8 has been to use "auto"
| |
5018 GetPropertyValue(property)->AsFunctionLiteral()->position(); | |
adamk
2016/07/13 20:57:32
GetPropertyValue() isn't needed here, you already
| |
5019 Expression* value = property->value(); | |
5020 | |
5021 Expression* property_key; | |
5022 | |
5023 if (property_name != nullptr) { | |
adamk
2016/07/13 20:57:32
For the common case of non-numeric properties, you
| |
5024 // For static keys, no ToName call is necessary. | |
5025 property_key = factory()->NewStringLiteral(property_name, prop_pos); | |
5026 } else { | |
5027 ZoneList<Expression*>* toName_args = | |
adamk
2016/07/13 20:57:32
Style nit: to_name_args
| |
5028 new (zone()) ZoneList<Expression*>(1, zone()); | |
5029 toName_args->Add(property->key(), zone()); | |
5030 | |
5031 property_key = | |
5032 factory()->NewCallRuntime(Runtime::kToName, toName_args, prop_pos); | |
adamk
2016/07/13 20:57:32
You can use kInlineToName, which in TurboFan will
| |
5033 } | |
5034 | |
5035 int info = property->is_static() ? kIsStaticMask : 0; | |
5036 switch (property->kind()) { | |
5037 case ObjectLiteral::Property::CONSTANT: | |
5038 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | |
5039 case ObjectLiteral::Property::PROTOTYPE: | |
5040 UNREACHABLE(); | |
5041 case ObjectLiteral::Property::COMPUTED: | |
5042 break; | |
5043 | |
5044 case ObjectLiteral::Property::GETTER: | |
5045 info |= kIsAccessorMask; | |
5046 break; | |
5047 | |
5048 case ObjectLiteral::Property::SETTER: | |
5049 info |= kIsAccessorMask | kIsSetterMask; | |
5050 break; | |
5051 } | |
5052 | |
5053 property_names->Add(property_key, zone()); | |
5054 property_funcs->Add(value, zone()); | |
5055 property_infos->Add(factory()->NewNumberLiteral(info, kNoSourcePosition), | |
5056 zone()); | |
5011 } | 5057 } |
5012 | 5058 |
5013 if (fni_ != NULL) fni_->Infer(); | 5059 if (fni_ != NULL) fni_->Infer(); |
5014 | 5060 |
5015 if (property_name != ast_value_factory()->constructor_string()) { | 5061 if (property_name != ast_value_factory()->constructor_string()) { |
5016 SetFunctionNameFromPropertyName(property, property_name); | 5062 SetFunctionNameFromPropertyName(property, property_name); |
5017 } | 5063 } |
5018 } | 5064 } |
5019 | 5065 |
5020 Expect(Token::RBRACE, CHECK_OK); | 5066 Expect(Token::RBRACE, CHECK_OK); |
5021 int end_pos = scanner()->location().end_pos; | 5067 int end_pos = scanner()->location().end_pos; |
5022 | 5068 |
5023 if (constructor == NULL) { | 5069 if (constructor == NULL) { |
5024 constructor = DefaultConstructor(name, has_extends, block_scope, pos, | 5070 constructor = DefaultConstructor(name, has_extends, block_scope, pos, |
5025 end_pos, block_scope->language_mode()); | 5071 end_pos, block_scope->language_mode()); |
5026 } | 5072 } |
5027 | 5073 |
5028 // Note that we do not finalize this block scope because it is | 5074 // Note that we do not finalize this block scope because it is |
5029 // used as a sentinel value indicating an anonymous class. | 5075 // used as a sentinel value indicating an anonymous class. |
5030 block_scope->set_end_position(end_pos); | 5076 block_scope->set_end_position(end_pos); |
5031 | 5077 |
5032 if (name != NULL) { | 5078 if (name != NULL) { |
5033 DCHECK_NOT_NULL(proxy); | 5079 DCHECK_NOT_NULL(proxy); |
5034 proxy->var()->set_initializer_position(end_pos); | 5080 proxy->var()->set_initializer_position(end_pos); |
5035 } | 5081 } |
5036 | 5082 |
5037 return factory()->NewClassLiteral(block_scope, proxy, extends, constructor, | 5083 // Construct a DoExpression representing the class literal. |
5038 properties, pos, end_pos); | 5084 Block* do_block = factory()->NewBlock(nullptr, 16, false, pos); |
5085 do_block->set_scope(scope_); | |
5086 | |
5087 // Call DefineClass. It takes seven arguments: | |
5088 // 1. The superclass constructor, or the Hole if not present. | |
5089 // 2. The constructor function. | |
5090 // 3. An array of method names. | |
5091 // 4. An array of said method's corresponding functions. | |
5092 // 5. An array of flags signalling if they are accessors and/or static. | |
5093 // 6. The location where the class's source starts. | |
5094 // 7. The location where the class's source ends. | |
5095 ZoneList<Expression*>* define_class_args = | |
5096 new (zone()) ZoneList<Expression*>(7, zone()); | |
5097 define_class_args->Add(extends != nullptr | |
5098 ? extends | |
5099 : factory()->NewTheHoleLiteral(kNoSourcePosition), | |
5100 zone()); | |
5101 define_class_args->Add(constructor, zone()); | |
5102 | |
5103 int names_idx = function_state_->NextMaterializedLiteralIndex(); | |
5104 int funcs_idx = function_state_->NextMaterializedLiteralIndex(); | |
5105 int infos_idx = function_state_->NextMaterializedLiteralIndex(); | |
5106 | |
5107 define_class_args->Add( | |
5108 factory()->NewArrayLiteral(property_names, names_idx, kNoSourcePosition), | |
5109 zone()); | |
5110 define_class_args->Add( | |
5111 factory()->NewArrayLiteral(property_funcs, funcs_idx, kNoSourcePosition), | |
5112 zone()); | |
5113 define_class_args->Add( | |
5114 factory()->NewArrayLiteral(property_infos, infos_idx, kNoSourcePosition), | |
5115 zone()); | |
5116 | |
5117 define_class_args->Add(factory()->NewNumberLiteral(pos, kNoSourcePosition), | |
5118 zone()); | |
5119 define_class_args->Add( | |
5120 factory()->NewNumberLiteral(end_pos, kNoSourcePosition), zone()); | |
5121 | |
5122 Expression* define_class_call = factory()->NewCallRuntime( | |
5123 Runtime::kDefineClass, define_class_args, kNoSourcePosition); | |
5124 | |
5125 // Set the constructor to have fast properties. | |
5126 ZoneList<Expression*>* fast_properties_args = | |
5127 new (zone()) ZoneList<Expression*>(1, zone()); | |
5128 fast_properties_args->Add(define_class_call, zone()); | |
5129 | |
5130 Expression* fast_properties_call = factory()->NewCallRuntime( | |
5131 Runtime::kToFastProperties, fast_properties_args, kNoSourcePosition); | |
5132 | |
5133 if (name != nullptr) { | |
5134 DCHECK_NOT_NULL(proxy); | |
5135 // Init the variable representing the class name only after evaluating all | |
5136 // property names. | |
5137 Expression* name_assignment = factory()->NewAssignment( | |
5138 Token::INIT, proxy, fast_properties_call, end_pos); | |
5139 | |
5140 do_block->statements()->Add( | |
5141 factory()->NewExpressionStatement(name_assignment, end_pos), zone()); | |
5142 } else { | |
5143 do_block->statements()->Add(factory()->NewExpressionStatement( | |
5144 fast_properties_call, kNoSourcePosition), | |
5145 zone()); | |
5146 } | |
5147 | |
5148 Variable* result = scope_->NewTemporary(ast_value_factory()->empty_string()); | |
5149 DoExpression* expr = factory()->NewDoExpression(do_block, result, pos); | |
5150 | |
5151 Rewriter::Rewrite(this, expr, | |
5152 ast_value_factory()); // TODO(bakkot) This is just going to | |
5153 // turn the final ExpressionStatement | |
5154 // into an assignment to result; we | |
5155 // could do that ourselves slightly | |
5156 // cheaper. | |
5157 | |
5158 // This enables function name inference. | |
5159 expr->set_represented_function(constructor); | |
5160 | |
5161 return expr; | |
5039 } | 5162 } |
5040 | 5163 |
5041 | 5164 |
5042 Expression* Parser::ParseV8Intrinsic(bool* ok) { | 5165 Expression* Parser::ParseV8Intrinsic(bool* ok) { |
5043 // CallRuntime :: | 5166 // CallRuntime :: |
5044 // '%' Identifier Arguments | 5167 // '%' Identifier Arguments |
5045 | 5168 |
5046 int pos = peek_position(); | 5169 int pos = peek_position(); |
5047 Expect(Token::MOD, CHECK_OK); | 5170 Expect(Token::MOD, CHECK_OK); |
5048 // Allow "eval" or "arguments" for backward compatibility. | 5171 // Allow "eval" or "arguments" for backward compatibility. |
(...skipping 955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6004 DCHECK_NOT_NULL(name); | 6127 DCHECK_NOT_NULL(name); |
6005 | 6128 |
6006 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] | 6129 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] |
6007 // of an object literal. | 6130 // of an object literal. |
6008 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; | 6131 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; |
6009 | 6132 |
6010 if (function != nullptr) { | 6133 if (function != nullptr) { |
6011 function->set_raw_name(name); | 6134 function->set_raw_name(name); |
6012 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); | 6135 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); |
6013 } else { | 6136 } else { |
6014 DCHECK(value->IsClassLiteral()); | 6137 DCHECK(value->IsDoExpression()); |
6015 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); | 6138 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); |
6016 value->AsClassLiteral()->constructor()->set_raw_name(name); | 6139 DCHECK_NOT_NULL(value->AsDoExpression()->represented_function()); |
6140 value->AsDoExpression()->represented_function()->set_raw_name(name); | |
6017 } | 6141 } |
6018 } | 6142 } |
6019 | 6143 |
6020 | 6144 |
6021 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, | 6145 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, |
6022 Expression* identifier) { | 6146 Expression* identifier) { |
6023 if (!value->IsAnonymousFunctionDefinition()) return; | 6147 if (!value->IsAnonymousFunctionDefinition()) return; |
6024 if (!identifier->IsVariableProxy()) return; | 6148 if (!identifier->IsVariableProxy()) return; |
6025 | 6149 |
6026 auto name = identifier->AsVariableProxy()->raw_name(); | 6150 auto name = identifier->AsVariableProxy()->raw_name(); |
6027 DCHECK_NOT_NULL(name); | 6151 DCHECK_NOT_NULL(name); |
6028 | 6152 |
6029 auto function = value->AsFunctionLiteral(); | 6153 auto function = value->AsFunctionLiteral(); |
6030 if (function != nullptr) { | 6154 if (function != nullptr) { |
6031 function->set_raw_name(name); | 6155 function->set_raw_name(name); |
6032 } else { | 6156 } else { |
6033 DCHECK(value->IsClassLiteral()); | 6157 DCHECK(value->IsDoExpression()); |
6034 value->AsClassLiteral()->constructor()->set_raw_name(name); | 6158 DCHECK_NOT_NULL(value->AsDoExpression()->represented_function()); |
6159 value->AsDoExpression()->represented_function()->set_raw_name(name); | |
6035 } | 6160 } |
6036 } | 6161 } |
6037 | 6162 |
6038 | 6163 |
6039 // Desugaring of yield* | 6164 // Desugaring of yield* |
6040 // ==================== | 6165 // ==================== |
6041 // | 6166 // |
6042 // With the help of do-expressions and function.sent, we desugar yield* into a | 6167 // With the help of do-expressions and function.sent, we desugar yield* into a |
6043 // loop containing a "raw" yield (a yield that doesn't wrap an iterator result | 6168 // loop containing a "raw" yield (a yield that doesn't wrap an iterator result |
6044 // object around its argument). Concretely, "yield* iterable" turns into | 6169 // object around its argument). Concretely, "yield* iterable" turns into |
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7001 | 7126 |
7002 #ifdef DEBUG | 7127 #ifdef DEBUG |
7003 void Parser::Print(AstNode* node) { | 7128 void Parser::Print(AstNode* node) { |
7004 ast_value_factory()->Internalize(Isolate::Current()); | 7129 ast_value_factory()->Internalize(Isolate::Current()); |
7005 node->Print(Isolate::Current()); | 7130 node->Print(Isolate::Current()); |
7006 } | 7131 } |
7007 #endif // DEBUG | 7132 #endif // DEBUG |
7008 | 7133 |
7009 } // namespace internal | 7134 } // namespace internal |
7010 } // namespace v8 | 7135 } // namespace v8 |
OLD | NEW |