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/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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 | 274 |
275 FunctionKind kind = call_super && !FLAG_experimental_classes | 275 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor |
276 ? FunctionKind::kDefaultBaseConstructor | 276 : FunctionKind::kDefaultBaseConstructor; |
277 : FunctionKind::kDefaultSubclassConstructor; | |
278 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE, kind); | 277 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE, kind); |
279 function_scope->SetLanguageMode( | 278 function_scope->SetLanguageMode( |
280 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT)); | 279 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT)); |
281 // Set start and end position to the same value | 280 // Set start and end position to the same value |
282 function_scope->set_start_position(pos); | 281 function_scope->set_start_position(pos); |
283 function_scope->set_end_position(pos); | 282 function_scope->set_end_position(pos); |
284 ZoneList<Statement*>* body = NULL; | 283 ZoneList<Statement*>* body = NULL; |
285 | 284 |
286 { | 285 { |
287 AstNodeFactory function_factory(ast_value_factory()); | 286 AstNodeFactory function_factory(ast_value_factory()); |
288 FunctionState function_state(&function_state_, &scope_, function_scope, | 287 FunctionState function_state(&function_state_, &scope_, function_scope, |
289 kind, &function_factory); | 288 kind, &function_factory); |
290 | 289 |
291 body = new (zone()) ZoneList<Statement*>(call_super ? 2 : 1, zone()); | 290 body = new (zone()) ZoneList<Statement*>(call_super ? 2 : 1, zone()); |
292 AddAssertIsConstruct(body, pos); | 291 AddAssertIsConstruct(body, pos); |
293 if (call_super) { | 292 if (call_super) { |
294 ZoneList<Expression*>* args = | 293 ZoneList<Expression*>* args = |
295 new (zone()) ZoneList<Expression*>(0, zone()); | 294 new (zone()) ZoneList<Expression*>(0, zone()); |
296 if (FLAG_experimental_classes) { | 295 CallRuntime* call = factory()->NewCallRuntime( |
297 CallRuntime* call = factory()->NewCallRuntime( | 296 ast_value_factory()->empty_string(), |
298 ast_value_factory()->empty_string(), | 297 Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper), |
299 Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper), | 298 args, pos); |
300 args, pos); | 299 body->Add(factory()->NewReturnStatement(call, pos), zone()); |
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 } | |
309 function_scope->RecordSuperConstructorCallUsage(); | 300 function_scope->RecordSuperConstructorCallUsage(); |
310 } | 301 } |
311 | 302 |
312 materialized_literal_count = function_state.materialized_literal_count(); | 303 materialized_literal_count = function_state.materialized_literal_count(); |
313 expected_property_count = function_state.expected_property_count(); | 304 expected_property_count = function_state.expected_property_count(); |
314 handler_count = function_state.handler_count(); | 305 handler_count = function_state.handler_count(); |
315 } | 306 } |
316 | 307 |
317 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( | 308 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
318 name, ast_value_factory(), function_scope, body, | 309 name, ast_value_factory(), function_scope, body, |
(...skipping 2309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2628 Expect(Token::RETURN, CHECK_OK); | 2619 Expect(Token::RETURN, CHECK_OK); |
2629 Scanner::Location loc = scanner()->location(); | 2620 Scanner::Location loc = scanner()->location(); |
2630 | 2621 |
2631 Token::Value tok = peek(); | 2622 Token::Value tok = peek(); |
2632 Statement* result; | 2623 Statement* result; |
2633 Expression* return_value; | 2624 Expression* return_value; |
2634 if (scanner()->HasAnyLineTerminatorBeforeNext() || | 2625 if (scanner()->HasAnyLineTerminatorBeforeNext() || |
2635 tok == Token::SEMICOLON || | 2626 tok == Token::SEMICOLON || |
2636 tok == Token::RBRACE || | 2627 tok == Token::RBRACE || |
2637 tok == Token::EOS) { | 2628 tok == Token::EOS) { |
2638 if (FLAG_experimental_classes && | 2629 if (IsSubclassConstructor(function_state_->kind())) { |
2639 IsSubclassConstructor(function_state_->kind())) { | |
2640 return_value = ThisExpression(scope_, factory(), loc.beg_pos); | 2630 return_value = ThisExpression(scope_, factory(), loc.beg_pos); |
2641 } else { | 2631 } else { |
2642 return_value = GetLiteralUndefined(position()); | 2632 return_value = GetLiteralUndefined(position()); |
2643 } | 2633 } |
2644 } else { | 2634 } else { |
2645 return_value = ParseExpression(true, CHECK_OK); | 2635 return_value = ParseExpression(true, CHECK_OK); |
2646 } | 2636 } |
2647 ExpectSemicolon(CHECK_OK); | 2637 ExpectSemicolon(CHECK_OK); |
2648 | 2638 |
2649 if (is_generator()) { | 2639 if (is_generator()) { |
(...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3915 DCHECK(log_); | 3905 DCHECK(log_); |
3916 // Position right after terminal '}'. | 3906 // Position right after terminal '}'. |
3917 int body_end = scanner()->location().end_pos; | 3907 int body_end = scanner()->location().end_pos; |
3918 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, | 3908 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, |
3919 *expected_property_count, scope_->language_mode()); | 3909 *expected_property_count, scope_->language_mode()); |
3920 } | 3910 } |
3921 } | 3911 } |
3922 | 3912 |
3923 | 3913 |
3924 void Parser::AddAssertIsConstruct(ZoneList<Statement*>* body, int pos) { | 3914 void Parser::AddAssertIsConstruct(ZoneList<Statement*>* body, int pos) { |
3925 if (!FLAG_experimental_classes) return; | |
3926 | |
3927 ZoneList<Expression*>* arguments = | 3915 ZoneList<Expression*>* arguments = |
3928 new (zone()) ZoneList<Expression*>(0, zone()); | 3916 new (zone()) ZoneList<Expression*>(0, zone()); |
3929 CallRuntime* construct_check = factory()->NewCallRuntime( | 3917 CallRuntime* construct_check = factory()->NewCallRuntime( |
3930 ast_value_factory()->is_construct_call_string(), | 3918 ast_value_factory()->is_construct_call_string(), |
3931 Runtime::FunctionForId(Runtime::kInlineIsConstructCall), arguments, pos); | 3919 Runtime::FunctionForId(Runtime::kInlineIsConstructCall), arguments, pos); |
3932 CallRuntime* non_callable_error = factory()->NewCallRuntime( | 3920 CallRuntime* non_callable_error = factory()->NewCallRuntime( |
3933 ast_value_factory()->empty_string(), | 3921 ast_value_factory()->empty_string(), |
3934 Runtime::FunctionForId(Runtime::kThrowConstructorNonCallableError), | 3922 Runtime::FunctionForId(Runtime::kThrowConstructorNonCallableError), |
3935 arguments, pos); | 3923 arguments, pos); |
3936 IfStatement* if_statement = factory()->NewIfStatement( | 3924 IfStatement* if_statement = factory()->NewIfStatement( |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3993 VariableProxy* get_proxy = factory()->NewVariableProxy( | 3981 VariableProxy* get_proxy = factory()->NewVariableProxy( |
3994 function_state_->generator_object_variable()); | 3982 function_state_->generator_object_variable()); |
3995 Expression* undefined = | 3983 Expression* undefined = |
3996 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition); | 3984 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition); |
3997 Yield* yield = factory()->NewYield(get_proxy, undefined, Yield::kFinal, | 3985 Yield* yield = factory()->NewYield(get_proxy, undefined, Yield::kFinal, |
3998 RelocInfo::kNoPosition); | 3986 RelocInfo::kNoPosition); |
3999 body->Add(factory()->NewExpressionStatement( | 3987 body->Add(factory()->NewExpressionStatement( |
4000 yield, RelocInfo::kNoPosition), zone()); | 3988 yield, RelocInfo::kNoPosition), zone()); |
4001 } | 3989 } |
4002 | 3990 |
4003 if (FLAG_experimental_classes && IsSubclassConstructor(kind)) { | 3991 if (IsSubclassConstructor(kind)) { |
4004 body->Add( | 3992 body->Add( |
4005 factory()->NewReturnStatement( | 3993 factory()->NewReturnStatement( |
4006 this->ThisExpression(scope_, factory(), RelocInfo::kNoPosition), | 3994 this->ThisExpression(scope_, factory(), RelocInfo::kNoPosition), |
4007 RelocInfo::kNoPosition), | 3995 RelocInfo::kNoPosition), |
4008 zone()); | 3996 zone()); |
4009 } | 3997 } |
4010 | 3998 |
4011 Expect(Token::RBRACE, CHECK_OK); | 3999 Expect(Token::RBRACE, CHECK_OK); |
4012 scope_->set_end_position(scanner()->location().end_pos); | 4000 scope_->set_end_position(scanner()->location().end_pos); |
4013 | 4001 |
(...skipping 1456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5470 } else { | 5458 } else { |
5471 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); | 5459 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); |
5472 running_hash = StringHasher::ComputeRunningHash(running_hash, data, | 5460 running_hash = StringHasher::ComputeRunningHash(running_hash, data, |
5473 raw_string->length()); | 5461 raw_string->length()); |
5474 } | 5462 } |
5475 } | 5463 } |
5476 | 5464 |
5477 return running_hash; | 5465 return running_hash; |
5478 } | 5466 } |
5479 } } // namespace v8::internal | 5467 } } // namespace v8::internal |
OLD | NEW |