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

Side by Side Diff: src/parser.cc

Issue 917753002: new classes: implement default constructors. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase to run try jobs Created 5 years, 10 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
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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 264
265 265
266 FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope, 266 FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope,
267 int pos, int end_pos) { 267 int pos, int end_pos) {
268 int materialized_literal_count = -1; 268 int materialized_literal_count = -1;
269 int expected_property_count = -1; 269 int expected_property_count = -1;
270 int handler_count = 0; 270 int handler_count = 0;
271 int parameter_count = 0; 271 int parameter_count = 0;
272 const AstRawString* name = ast_value_factory()->empty_string(); 272 const AstRawString* name = ast_value_factory()->empty_string();
273 273
274 Scope* function_scope = 274
275 NewScope(scope, FUNCTION_SCOPE, FunctionKind::kDefaultConstructor); 275 FunctionKind kind = call_super && !FLAG_experimental_classes
276 ? FunctionKind::kDefaultBaseConstructor
277 : FunctionKind::kDefaultSubclassConstructor;
278 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE, kind);
276 function_scope->SetLanguageMode( 279 function_scope->SetLanguageMode(
277 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT)); 280 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT));
278 // Set start and end position to the same value 281 // Set start and end position to the same value
279 function_scope->set_start_position(pos); 282 function_scope->set_start_position(pos);
280 function_scope->set_end_position(pos); 283 function_scope->set_end_position(pos);
281 ZoneList<Statement*>* body = NULL; 284 ZoneList<Statement*>* body = NULL;
282 285
283 { 286 {
284 AstNodeFactory function_factory(ast_value_factory()); 287 AstNodeFactory function_factory(ast_value_factory());
285 FunctionState function_state(&function_state_, &scope_, function_scope, 288 FunctionState function_state(&function_state_, &scope_, function_scope,
286 kDefaultConstructor, &function_factory); 289 kind, &function_factory);
287 290
288 body = new (zone()) ZoneList<Statement*>(1, zone()); 291 body = new (zone()) ZoneList<Statement*>(call_super ? 2 : 1, zone());
292 AddAssertIsConstruct(body, pos);
289 if (call_super) { 293 if (call_super) {
290 ZoneList<Expression*>* args = 294 ZoneList<Expression*>* args =
291 new (zone()) ZoneList<Expression*>(0, zone()); 295 new (zone()) ZoneList<Expression*>(0, zone());
292 CallRuntime* call = factory()->NewCallRuntime( 296 if (FLAG_experimental_classes) {
293 ast_value_factory()->empty_string(), 297 CallRuntime* call = factory()->NewCallRuntime(
294 Runtime::FunctionForId(Runtime::kDefaultConstructorSuperCall), args, 298 ast_value_factory()->empty_string(),
295 pos); 299 Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper),
296 body->Add(factory()->NewExpressionStatement(call, pos), zone()); 300 args, pos);
301 body->Add(factory()->NewReturnStatement(call, pos), zone());
302 } else {
303 CallRuntime* call = factory()->NewCallRuntime(
304 ast_value_factory()->empty_string(),
305 Runtime::FunctionForId(Runtime::kDefaultConstructorSuperCall), args,
306 pos);
307 body->Add(factory()->NewExpressionStatement(call, pos), zone());
308 }
297 function_scope->RecordSuperConstructorCallUsage(); 309 function_scope->RecordSuperConstructorCallUsage();
298 } 310 }
299 311
300 materialized_literal_count = function_state.materialized_literal_count(); 312 materialized_literal_count = function_state.materialized_literal_count();
301 expected_property_count = function_state.expected_property_count(); 313 expected_property_count = function_state.expected_property_count();
302 handler_count = function_state.handler_count(); 314 handler_count = function_state.handler_count();
303 } 315 }
304 316
305 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( 317 FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
306 name, ast_value_factory(), function_scope, body, 318 name, ast_value_factory(), function_scope, body,
307 materialized_literal_count, expected_property_count, handler_count, 319 materialized_literal_count, expected_property_count, handler_count,
308 parameter_count, FunctionLiteral::kNoDuplicateParameters, 320 parameter_count, FunctionLiteral::kNoDuplicateParameters,
309 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, 321 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
310 FunctionLiteral::kNotParenthesized, FunctionKind::kDefaultConstructor, 322 FunctionLiteral::kNotParenthesized, kind, pos);
311 pos);
312 323
313 return function_literal; 324 return function_literal;
314 } 325 }
315 326
316 327
317 // ---------------------------------------------------------------------------- 328 // ----------------------------------------------------------------------------
318 // Target is a support class to facilitate manipulation of the 329 // Target is a support class to facilitate manipulation of the
319 // Parser's target_stack_ (the stack of potential 'break' and 330 // Parser's target_stack_ (the stack of potential 'break' and
320 // 'continue' statement targets). Upon construction, a new target is 331 // 'continue' statement targets). Upon construction, a new target is
321 // added; it is removed upon destruction. 332 // added; it is removed upon destruction.
(...skipping 3565 matching lines...) Expand 10 before | Expand all | Expand 10 after
3887 if (produce_cached_parse_data()) { 3898 if (produce_cached_parse_data()) {
3888 DCHECK(log_); 3899 DCHECK(log_);
3889 // Position right after terminal '}'. 3900 // Position right after terminal '}'.
3890 int body_end = scanner()->location().end_pos; 3901 int body_end = scanner()->location().end_pos;
3891 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, 3902 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count,
3892 *expected_property_count, scope_->language_mode()); 3903 *expected_property_count, scope_->language_mode());
3893 } 3904 }
3894 } 3905 }
3895 3906
3896 3907
3908 void Parser::AddAssertIsConstruct(ZoneList<Statement*>* body, int pos) {
3909 if (!FLAG_experimental_classes) return;
3910
3911 ZoneList<Expression*>* arguments =
3912 new (zone()) ZoneList<Expression*>(0, zone());
3913 CallRuntime* construct_check = factory()->NewCallRuntime(
3914 ast_value_factory()->is_construct_call_string(),
3915 Runtime::FunctionForId(Runtime::kInlineIsConstructCall), arguments, pos);
3916 CallRuntime* non_callable_error = factory()->NewCallRuntime(
3917 ast_value_factory()->empty_string(),
3918 Runtime::FunctionForId(Runtime::kThrowConstructorNonCallableError),
3919 arguments, pos);
3920 IfStatement* if_statement = factory()->NewIfStatement(
3921 factory()->NewUnaryOperation(Token::NOT, construct_check, pos),
3922 factory()->NewReturnStatement(non_callable_error, pos),
3923 factory()->NewEmptyStatement(pos), pos);
3924 body->Add(if_statement, zone());
3925 }
3926
3927
3897 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( 3928 ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
3898 const AstRawString* function_name, int pos, Variable* fvar, 3929 const AstRawString* function_name, int pos, Variable* fvar,
3899 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { 3930 Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
3900 // Everything inside an eagerly parsed function will be parsed eagerly 3931 // Everything inside an eagerly parsed function will be parsed eagerly
3901 // (see comment above). 3932 // (see comment above).
3902 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 3933 ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
3903 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone()); 3934 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone());
3904 if (fvar != NULL) { 3935 if (fvar != NULL) {
3905 VariableProxy* fproxy = scope_->NewUnresolved( 3936 VariableProxy* fproxy = scope_->NewUnresolved(
3906 factory(), function_name, Interface::NewConst()); 3937 factory(), function_name, Interface::NewConst());
3907 fproxy->BindTo(fvar); 3938 fproxy->BindTo(fvar);
3908 body->Add(factory()->NewExpressionStatement( 3939 body->Add(factory()->NewExpressionStatement(
3909 factory()->NewAssignment(fvar_init_op, 3940 factory()->NewAssignment(fvar_init_op,
3910 fproxy, 3941 fproxy,
3911 factory()->NewThisFunction(pos), 3942 factory()->NewThisFunction(pos),
3912 RelocInfo::kNoPosition), 3943 RelocInfo::kNoPosition),
3913 RelocInfo::kNoPosition), zone()); 3944 RelocInfo::kNoPosition), zone());
3914 } 3945 }
3915 3946
3916 3947
3917 // For concise constructors, check that they are constructed, 3948 // For concise constructors, check that they are constructed,
3918 // not called. 3949 // not called.
3919 if (FLAG_experimental_classes && i::IsConstructor(kind)) { 3950 if (i::IsConstructor(kind)) {
3920 ZoneList<Expression*>* arguments = 3951 AddAssertIsConstruct(body, pos);
3921 new (zone()) ZoneList<Expression*>(0, zone());
3922 CallRuntime* construct_check = factory()->NewCallRuntime(
3923 ast_value_factory()->is_construct_call_string(),
3924 Runtime::FunctionForId(Runtime::kInlineIsConstructCall), arguments,
3925 pos);
3926 CallRuntime* non_callable_error = factory()->NewCallRuntime(
3927 ast_value_factory()->empty_string(),
3928 Runtime::FunctionForId(Runtime::kThrowConstructorNonCallableError),
3929 arguments, pos);
3930 IfStatement* if_statement = factory()->NewIfStatement(
3931 factory()->NewUnaryOperation(Token::NOT, construct_check, pos),
3932 factory()->NewReturnStatement(non_callable_error, pos),
3933 factory()->NewEmptyStatement(pos), pos);
3934 body->Add(if_statement, zone());
3935 } 3952 }
3936 3953
3937 // For generators, allocate and yield an iterator on function entry. 3954 // For generators, allocate and yield an iterator on function entry.
3938 if (IsGeneratorFunction(kind)) { 3955 if (IsGeneratorFunction(kind)) {
3939 ZoneList<Expression*>* arguments = 3956 ZoneList<Expression*>* arguments =
3940 new(zone()) ZoneList<Expression*>(0, zone()); 3957 new(zone()) ZoneList<Expression*>(0, zone());
3941 CallRuntime* allocation = factory()->NewCallRuntime( 3958 CallRuntime* allocation = factory()->NewCallRuntime(
3942 ast_value_factory()->empty_string(), 3959 ast_value_factory()->empty_string(),
3943 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments, 3960 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments,
3944 pos); 3961 pos);
(...skipping 1474 matching lines...) Expand 10 before | Expand all | Expand 10 after
5419 } else { 5436 } else {
5420 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); 5437 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
5421 running_hash = StringHasher::ComputeRunningHash(running_hash, data, 5438 running_hash = StringHasher::ComputeRunningHash(running_hash, data,
5422 raw_string->length()); 5439 raw_string->length());
5423 } 5440 }
5424 } 5441 }
5425 5442
5426 return running_hash; 5443 return running_hash;
5427 } 5444 }
5428 } } // namespace v8::internal 5445 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/runtime/runtime.h » ('j') | src/x64/code-stubs-x64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698