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

Side by Side Diff: src/parsing/parser.cc

Issue 2315733003: Class fields, part 1 (parsing and infrastructure) (Closed)
Patch Set: whitespace Created 4 years, 3 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
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.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 // 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-expression-rewriter.h" 10 #include "src/ast/ast-expression-rewriter.h"
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 cached_parse_data_ = NULL; 144 cached_parse_data_ = NULL;
145 } else { 145 } else {
146 DCHECK(info->cached_data() != NULL); 146 DCHECK(info->cached_data() != NULL);
147 if (compile_options_ == ScriptCompiler::kConsumeParserCache) { 147 if (compile_options_ == ScriptCompiler::kConsumeParserCache) {
148 cached_parse_data_ = ParseData::FromCachedData(*info->cached_data()); 148 cached_parse_data_ = ParseData::FromCachedData(*info->cached_data());
149 } 149 }
150 } 150 }
151 } 151 }
152 152
153 FunctionLiteral* Parser::DefaultConstructor(const AstRawString* name, 153 FunctionLiteral* Parser::DefaultConstructor(const AstRawString* name,
154 bool call_super, int pos, 154 bool call_super,
155 int end_pos, 155 bool requires_class_field_init,
156 int pos, int end_pos,
156 LanguageMode language_mode) { 157 LanguageMode language_mode) {
157 int materialized_literal_count = -1; 158 int materialized_literal_count = -1;
158 int expected_property_count = -1; 159 int expected_property_count = -1;
159 int parameter_count = 0; 160 int parameter_count = 0;
160 if (name == nullptr) name = ast_value_factory()->empty_string(); 161 if (name == nullptr) name = ast_value_factory()->empty_string();
161 162
162 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor 163 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor
163 : FunctionKind::kDefaultBaseConstructor; 164 : FunctionKind::kDefaultBaseConstructor;
164 DeclarationScope* function_scope = NewFunctionScope(kind); 165 DeclarationScope* function_scope = NewFunctionScope(kind);
165 SetLanguageMode(function_scope, 166 SetLanguageMode(function_scope,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 expected_property_count = function_state.expected_property_count(); 215 expected_property_count = function_state.expected_property_count();
215 } 216 }
216 217
217 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( 218 FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
218 name, function_scope, body, materialized_literal_count, 219 name, function_scope, body, materialized_literal_count,
219 expected_property_count, parameter_count, 220 expected_property_count, parameter_count,
220 FunctionLiteral::kNoDuplicateParameters, 221 FunctionLiteral::kNoDuplicateParameters,
221 FunctionLiteral::kAnonymousExpression, 222 FunctionLiteral::kAnonymousExpression,
222 FunctionLiteral::kShouldLazyCompile, kind, pos); 223 FunctionLiteral::kShouldLazyCompile, kind, pos);
223 224
225 function_literal->set_requires_class_field_init(requires_class_field_init);
226
224 return function_literal; 227 return function_literal;
225 } 228 }
226 229
227 230
228 // ---------------------------------------------------------------------------- 231 // ----------------------------------------------------------------------------
229 // Target is a support class to facilitate manipulation of the 232 // Target is a support class to facilitate manipulation of the
230 // Parser's target_stack_ (the stack of potential 'break' and 233 // Parser's target_stack_ (the stack of potential 'break' and
231 // 'continue' statement targets). Upon construction, a new target is 234 // 'continue' statement targets). Upon construction, a new target is
232 // added; it is removed upon destruction. 235 // added; it is removed upon destruction.
233 236
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() && 531 set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() &&
529 info->isolate()->is_tail_call_elimination_enabled()); 532 info->isolate()->is_tail_call_elimination_enabled());
530 set_allow_harmony_do_expressions(FLAG_harmony_do_expressions); 533 set_allow_harmony_do_expressions(FLAG_harmony_do_expressions);
531 set_allow_harmony_for_in(FLAG_harmony_for_in); 534 set_allow_harmony_for_in(FLAG_harmony_for_in);
532 set_allow_harmony_function_sent(FLAG_harmony_function_sent); 535 set_allow_harmony_function_sent(FLAG_harmony_function_sent);
533 set_allow_harmony_restrictive_declarations( 536 set_allow_harmony_restrictive_declarations(
534 FLAG_harmony_restrictive_declarations); 537 FLAG_harmony_restrictive_declarations);
535 set_allow_harmony_async_await(FLAG_harmony_async_await); 538 set_allow_harmony_async_await(FLAG_harmony_async_await);
536 set_allow_harmony_restrictive_generators(FLAG_harmony_restrictive_generators); 539 set_allow_harmony_restrictive_generators(FLAG_harmony_restrictive_generators);
537 set_allow_harmony_trailing_commas(FLAG_harmony_trailing_commas); 540 set_allow_harmony_trailing_commas(FLAG_harmony_trailing_commas);
541 set_allow_harmony_class_fields(FLAG_harmony_class_fields);
538 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; 542 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
539 ++feature) { 543 ++feature) {
540 use_counts_[feature] = 0; 544 use_counts_[feature] = 0;
541 } 545 }
542 if (info->ast_value_factory() == NULL) { 546 if (info->ast_value_factory() == NULL) {
543 // info takes ownership of AstValueFactory. 547 // info takes ownership of AstValueFactory.
544 info->set_ast_value_factory(new AstValueFactory(zone(), info->hash_seed())); 548 info->set_ast_value_factory(new AstValueFactory(zone(), info->hash_seed()));
545 info->set_ast_value_factory_owned(); 549 info->set_ast_value_factory_owned();
546 ast_value_factory_ = info->ast_value_factory(); 550 ast_value_factory_ = info->ast_value_factory();
547 ast_node_factory_.set_ast_value_factory(ast_value_factory_); 551 ast_node_factory_.set_ast_value_factory(ast_value_factory_);
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 result = expression->AsFunctionLiteral(); 906 result = expression->AsFunctionLiteral();
903 } else { 907 } else {
904 ok = false; 908 ok = false;
905 } 909 }
906 } 910 }
907 } 911 }
908 } else if (info->is_default_constructor()) { 912 } else if (info->is_default_constructor()) {
909 DCHECK_EQ(scope(), outer); 913 DCHECK_EQ(scope(), outer);
910 result = DefaultConstructor( 914 result = DefaultConstructor(
911 raw_name, IsSubclassConstructor(info->function_kind()), 915 raw_name, IsSubclassConstructor(info->function_kind()),
912 info->start_position(), info->end_position(), info->language_mode()); 916 info->requires_class_field_init(), info->start_position(),
917 info->end_position(), info->language_mode());
913 } else { 918 } else {
914 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(), 919 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(),
915 kSkipFunctionNameCheck, 920 kSkipFunctionNameCheck,
916 info->function_kind(), kNoSourcePosition, 921 info->function_kind(), kNoSourcePosition,
917 function_type, info->language_mode(), &ok); 922 function_type, info->language_mode(), &ok);
918 } 923 }
919 // Make sure the results agree. 924 // Make sure the results agree.
920 DCHECK(ok == (result != nullptr)); 925 DCHECK(ok == (result != nullptr));
921 } 926 }
922 927
(...skipping 3247 matching lines...) Expand 10 before | Expand all | Expand 10 after
4170 NULL, stack_limit_); 4175 NULL, stack_limit_);
4171 reusable_preparser_->set_allow_lazy(true); 4176 reusable_preparser_->set_allow_lazy(true);
4172 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name()); 4177 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name());
4173 SET_ALLOW(natives); 4178 SET_ALLOW(natives);
4174 SET_ALLOW(harmony_do_expressions); 4179 SET_ALLOW(harmony_do_expressions);
4175 SET_ALLOW(harmony_for_in); 4180 SET_ALLOW(harmony_for_in);
4176 SET_ALLOW(harmony_function_sent); 4181 SET_ALLOW(harmony_function_sent);
4177 SET_ALLOW(harmony_restrictive_declarations); 4182 SET_ALLOW(harmony_restrictive_declarations);
4178 SET_ALLOW(harmony_async_await); 4183 SET_ALLOW(harmony_async_await);
4179 SET_ALLOW(harmony_trailing_commas); 4184 SET_ALLOW(harmony_trailing_commas);
4185 SET_ALLOW(harmony_class_fields);
4180 #undef SET_ALLOW 4186 #undef SET_ALLOW
4181 } 4187 }
4182 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( 4188 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction(
4183 language_mode(), function_state_->kind(), 4189 language_mode(), function_state_->kind(),
4184 scope()->AsDeclarationScope()->has_simple_parameters(), parsing_module_, 4190 scope()->AsDeclarationScope()->has_simple_parameters(), parsing_module_,
4185 logger, may_abort, use_counts_); 4191 logger, may_abort, use_counts_);
4186 if (pre_parse_timer_ != NULL) { 4192 if (pre_parse_timer_ != NULL) {
4187 pre_parse_timer_->Stop(); 4193 pre_parse_timer_->Stop();
4188 } 4194 }
4189 return result; 4195 return result;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
4230 CheckNoTailCallExpressions(CHECK_OK); 4236 CheckNoTailCallExpressions(CHECK_OK);
4231 RewriteNonPattern(CHECK_OK); 4237 RewriteNonPattern(CHECK_OK);
4232 impl()->AccumulateFormalParameterContainmentErrors(); 4238 impl()->AccumulateFormalParameterContainmentErrors();
4233 } else { 4239 } else {
4234 block_state.set_start_position(scanner()->location().end_pos); 4240 block_state.set_start_position(scanner()->location().end_pos);
4235 } 4241 }
4236 4242
4237 4243
4238 ClassLiteralChecker checker(this); 4244 ClassLiteralChecker checker(this);
4239 ZoneList<ClassLiteral::Property*>* properties = NewClassPropertyList(4); 4245 ZoneList<ClassLiteral::Property*>* properties = NewClassPropertyList(4);
4246 ZoneList<Expression*>* instance_field_initializers =
4247 new (zone()) ZoneList<Expression*>(0, zone());
4240 FunctionLiteral* constructor = nullptr; 4248 FunctionLiteral* constructor = nullptr;
4241 bool has_seen_constructor = false; 4249 bool has_seen_constructor = false;
4250 Variable* static_initializer_var = nullptr;
4251
4252 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos);
4253 Variable* result_var = NewTemporary(ast_value_factory()->empty_string());
4254 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos);
4242 4255
4243 Expect(Token::LBRACE, CHECK_OK); 4256 Expect(Token::LBRACE, CHECK_OK);
4244 4257
4245 const bool has_extends = extends != nullptr; 4258 const bool has_extends = extends != nullptr;
4246 while (peek() != Token::RBRACE) { 4259 while (peek() != Token::RBRACE) {
4247 if (Check(Token::SEMICOLON)) continue; 4260 if (Check(Token::SEMICOLON)) continue;
4248 FuncNameInferrer::State fni_state(fni_); 4261 FuncNameInferrer::State fni_state(fni_);
4249 bool is_computed_name = false; // Classes do not care about computed 4262 bool is_computed_name = false; // Classes do not care about computed
4250 // property names here. 4263 // property names here.
4251 ExpressionClassifier property_classifier(this); 4264 ExpressionClassifier property_classifier(this);
4252 ClassLiteral::Property* property = 4265 ClassLiteral::Property* property =
4253 ParseClassPropertyDefinition(&checker, has_extends, &is_computed_name, 4266 ParseClassPropertyDefinition(&checker, has_extends, &is_computed_name,
4254 &has_seen_constructor, CHECK_OK); 4267 &has_seen_constructor, CHECK_OK);
4255 RewriteNonPattern(CHECK_OK); 4268 RewriteNonPattern(CHECK_OK);
4256 impl()->AccumulateFormalParameterContainmentErrors(); 4269 impl()->AccumulateFormalParameterContainmentErrors();
4257 4270
4258 if (has_seen_constructor && constructor == nullptr) { 4271 if (has_seen_constructor && constructor == nullptr) {
4259 constructor = GetPropertyValue(property)->AsFunctionLiteral(); 4272 constructor = GetPropertyValue(property)->AsFunctionLiteral();
4260 DCHECK_NOT_NULL(constructor); 4273 DCHECK_NOT_NULL(constructor);
4261 constructor->set_raw_name( 4274 constructor->set_raw_name(
4262 name != nullptr ? name : ast_value_factory()->empty_string()); 4275 name != nullptr ? name : ast_value_factory()->empty_string());
4263 } else { 4276 } else {
4277 if (property->kind() == ClassLiteralProperty::FIELD) {
4278 DCHECK(allow_harmony_class_fields());
4279 continue; // TODO(bakkot) implementation
4280 }
4264 properties->Add(property, zone()); 4281 properties->Add(property, zone());
4265 } 4282 }
4266 4283
4267 DCHECK_NOT_NULL(fni_); 4284 DCHECK_NOT_NULL(fni_);
4268 fni_->Infer(); 4285 fni_->Infer();
4269 } 4286 }
4270 4287
4271 Expect(Token::RBRACE, CHECK_OK); 4288 Expect(Token::RBRACE, CHECK_OK);
4272 int end_pos = scanner()->location().end_pos; 4289 int end_pos = scanner()->location().end_pos;
4273 4290
4274 if (constructor == nullptr) { 4291 bool has_instance_fields = instance_field_initializers->length() > 0;
4275 constructor = DefaultConstructor(name, has_extends, pos, end_pos, 4292 DCHECK(!has_instance_fields || allow_harmony_class_fields());
4276 block_state.language_mode()); 4293 bool has_default_constructor = constructor == nullptr;
4294 if (has_default_constructor) {
4295 constructor = DefaultConstructor(name, has_extends, has_instance_fields,
4296 pos, end_pos, block_state.language_mode());
4277 } 4297 }
4278 4298
4279 // Note that we do not finalize this block scope because it is 4299 if (has_instance_fields && extends == nullptr) {
4280 // used as a sentinel value indicating an anonymous class. 4300 constructor->set_requires_class_field_init(true);
4301 } // The derived case is handled by rewriting super calls.
4302
4281 block_state.set_end_position(end_pos); 4303 block_state.set_end_position(end_pos);
4282 4304
4283 if (name != nullptr) { 4305 if (name != nullptr) {
4284 DCHECK_NOT_NULL(proxy); 4306 DCHECK_NOT_NULL(proxy);
4285 proxy->var()->set_initializer_position(end_pos); 4307 proxy->var()->set_initializer_position(end_pos);
4286 } 4308 }
4287 4309
4288 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos);
4289 Variable* result_var = NewTemporary(ast_value_factory()->empty_string());
4290 do_block->set_scope(block_state.FinalizedBlockScope());
4291 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos);
4292
4293 ClassLiteral* class_literal = factory()->NewClassLiteral( 4310 ClassLiteral* class_literal = factory()->NewClassLiteral(
4294 proxy, extends, constructor, properties, pos, end_pos); 4311 proxy, extends, constructor, properties, pos, end_pos);
4295 4312
4313 if (static_initializer_var != nullptr) {
4314 class_literal->set_static_initializer_proxy(
4315 factory()->NewVariableProxy(static_initializer_var));
4316 }
4317
4296 do_block->statements()->Add( 4318 do_block->statements()->Add(
4297 factory()->NewExpressionStatement(class_literal, pos), zone()); 4319 factory()->NewExpressionStatement(
4320 factory()->NewAssignment(Token::ASSIGN,
4321 factory()->NewVariableProxy(result_var),
4322 class_literal, kNoSourcePosition),
4323 pos),
4324 zone());
4325 do_block->set_scope(block_state.FinalizedBlockScope());
4298 do_expr->set_represented_function(constructor); 4326 do_expr->set_represented_function(constructor);
4299 Rewriter::Rewrite(this, GetClosureScope(), do_expr, ast_value_factory());
4300 4327
4301 return do_expr; 4328 return do_expr;
4302 } 4329 }
4303 4330
4304 4331
4305 Expression* Parser::ParseV8Intrinsic(bool* ok) { 4332 Expression* Parser::ParseV8Intrinsic(bool* ok) {
4306 // CallRuntime :: 4333 // CallRuntime ::
4307 // '%' Identifier Arguments 4334 // '%' Identifier Arguments
4308 4335
4309 int pos = peek_position(); 4336 int pos = peek_position();
(...skipping 1871 matching lines...) Expand 10 before | Expand all | Expand 10 after
6181 node->Print(Isolate::Current()); 6208 node->Print(Isolate::Current());
6182 } 6209 }
6183 #endif // DEBUG 6210 #endif // DEBUG
6184 6211
6185 #undef CHECK_OK 6212 #undef CHECK_OK
6186 #undef CHECK_OK_VOID 6213 #undef CHECK_OK_VOID
6187 #undef CHECK_FAILED 6214 #undef CHECK_FAILED
6188 6215
6189 } // namespace internal 6216 } // namespace internal
6190 } // namespace v8 6217 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698