| 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 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 cached_parse_data_ = ParseData::FromCachedData(*info->cached_data()); | 329 cached_parse_data_ = ParseData::FromCachedData(*info->cached_data()); |
| 330 } | 330 } |
| 331 } | 331 } |
| 332 } | 332 } |
| 333 | 333 |
| 334 | 334 |
| 335 FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope, | 335 FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope, |
| 336 int pos, int end_pos) { | 336 int pos, int end_pos) { |
| 337 int materialized_literal_count = -1; | 337 int materialized_literal_count = -1; |
| 338 int expected_property_count = -1; | 338 int expected_property_count = -1; |
| 339 int handler_count = 0; | |
| 340 int parameter_count = 0; | 339 int parameter_count = 0; |
| 341 const AstRawString* name = ast_value_factory()->empty_string(); | 340 const AstRawString* name = ast_value_factory()->empty_string(); |
| 342 | 341 |
| 343 | 342 |
| 344 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor | 343 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor |
| 345 : FunctionKind::kDefaultBaseConstructor; | 344 : FunctionKind::kDefaultBaseConstructor; |
| 346 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE, kind); | 345 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE, kind); |
| 347 function_scope->SetLanguageMode( | 346 function_scope->SetLanguageMode( |
| 348 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT)); | 347 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT)); |
| 349 // Set start and end position to the same value | 348 // Set start and end position to the same value |
| (...skipping 22 matching lines...) Expand all Loading... |
| 372 args->Add(this_function_proxy, zone()); | 371 args->Add(this_function_proxy, zone()); |
| 373 CallRuntime* call = factory()->NewCallRuntime( | 372 CallRuntime* call = factory()->NewCallRuntime( |
| 374 ast_value_factory()->empty_string(), | 373 ast_value_factory()->empty_string(), |
| 375 Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper), | 374 Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper), |
| 376 args, pos); | 375 args, pos); |
| 377 body->Add(factory()->NewReturnStatement(call, pos), zone()); | 376 body->Add(factory()->NewReturnStatement(call, pos), zone()); |
| 378 } | 377 } |
| 379 | 378 |
| 380 materialized_literal_count = function_state.materialized_literal_count(); | 379 materialized_literal_count = function_state.materialized_literal_count(); |
| 381 expected_property_count = function_state.expected_property_count(); | 380 expected_property_count = function_state.expected_property_count(); |
| 382 handler_count = function_state.handler_count(); | |
| 383 } | 381 } |
| 384 | 382 |
| 385 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( | 383 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
| 386 name, ast_value_factory(), function_scope, body, | 384 name, ast_value_factory(), function_scope, body, |
| 387 materialized_literal_count, expected_property_count, handler_count, | 385 materialized_literal_count, expected_property_count, parameter_count, |
| 388 parameter_count, FunctionLiteral::kNoDuplicateParameters, | 386 FunctionLiteral::kNoDuplicateParameters, |
| 389 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, | 387 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, |
| 390 FunctionLiteral::kShouldLazyCompile, kind, pos); | 388 FunctionLiteral::kShouldLazyCompile, kind, pos); |
| 391 | 389 |
| 392 return function_literal; | 390 return function_literal; |
| 393 } | 391 } |
| 394 | 392 |
| 395 | 393 |
| 396 // ---------------------------------------------------------------------------- | 394 // ---------------------------------------------------------------------------- |
| 397 // Target is a support class to facilitate manipulation of the | 395 // Target is a support class to facilitate manipulation of the |
| 398 // Parser's target_stack_ (the stack of potential 'break' and | 396 // Parser's target_stack_ (the stack of potential 'break' and |
| (...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 expression()->IsFunctionLiteral()) { | 1061 expression()->IsFunctionLiteral()) { |
| 1064 ReportMessage(MessageTemplate::kSingleFunctionLiteral); | 1062 ReportMessage(MessageTemplate::kSingleFunctionLiteral); |
| 1065 ok = false; | 1063 ok = false; |
| 1066 } | 1064 } |
| 1067 } | 1065 } |
| 1068 | 1066 |
| 1069 if (ok) { | 1067 if (ok) { |
| 1070 result = factory()->NewFunctionLiteral( | 1068 result = factory()->NewFunctionLiteral( |
| 1071 ast_value_factory()->empty_string(), ast_value_factory(), scope_, | 1069 ast_value_factory()->empty_string(), ast_value_factory(), scope_, |
| 1072 body, function_state.materialized_literal_count(), | 1070 body, function_state.materialized_literal_count(), |
| 1073 function_state.expected_property_count(), | 1071 function_state.expected_property_count(), 0, |
| 1074 function_state.handler_count(), 0, | |
| 1075 FunctionLiteral::kNoDuplicateParameters, | 1072 FunctionLiteral::kNoDuplicateParameters, |
| 1076 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval, | 1073 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval, |
| 1077 FunctionLiteral::kShouldLazyCompile, FunctionKind::kNormalFunction, | 1074 FunctionLiteral::kShouldLazyCompile, FunctionKind::kNormalFunction, |
| 1078 0); | 1075 0); |
| 1079 } | 1076 } |
| 1080 } | 1077 } |
| 1081 | 1078 |
| 1082 // Make sure the target stack is empty. | 1079 // Make sure the target stack is empty. |
| 1083 DCHECK(target_stack_ == NULL); | 1080 DCHECK(target_stack_ == NULL); |
| 1084 | 1081 |
| (...skipping 1928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3013 } | 3010 } |
| 3014 | 3011 |
| 3015 // Simplify the AST nodes by converting: | 3012 // Simplify the AST nodes by converting: |
| 3016 // 'try B0 catch B1 finally B2' | 3013 // 'try B0 catch B1 finally B2' |
| 3017 // to: | 3014 // to: |
| 3018 // 'try { try B0 catch B1 } finally B2' | 3015 // 'try { try B0 catch B1 } finally B2' |
| 3019 | 3016 |
| 3020 if (catch_block != NULL && finally_block != NULL) { | 3017 if (catch_block != NULL && finally_block != NULL) { |
| 3021 // If we have both, create an inner try/catch. | 3018 // If we have both, create an inner try/catch. |
| 3022 DCHECK(catch_scope != NULL && catch_variable != NULL); | 3019 DCHECK(catch_scope != NULL && catch_variable != NULL); |
| 3023 int index = function_state_->NextHandlerIndex(); | 3020 TryCatchStatement* statement = |
| 3024 TryCatchStatement* statement = factory()->NewTryCatchStatement( | 3021 factory()->NewTryCatchStatement(try_block, catch_scope, catch_variable, |
| 3025 index, try_block, catch_scope, catch_variable, catch_block, | 3022 catch_block, RelocInfo::kNoPosition); |
| 3026 RelocInfo::kNoPosition); | |
| 3027 try_block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); | 3023 try_block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); |
| 3028 try_block->AddStatement(statement, zone()); | 3024 try_block->AddStatement(statement, zone()); |
| 3029 catch_block = NULL; // Clear to indicate it's been handled. | 3025 catch_block = NULL; // Clear to indicate it's been handled. |
| 3030 } | 3026 } |
| 3031 | 3027 |
| 3032 TryStatement* result = NULL; | 3028 TryStatement* result = NULL; |
| 3033 if (catch_block != NULL) { | 3029 if (catch_block != NULL) { |
| 3034 DCHECK(finally_block == NULL); | 3030 DCHECK(finally_block == NULL); |
| 3035 DCHECK(catch_scope != NULL && catch_variable != NULL); | 3031 DCHECK(catch_scope != NULL && catch_variable != NULL); |
| 3036 int index = function_state_->NextHandlerIndex(); | 3032 result = factory()->NewTryCatchStatement(try_block, catch_scope, |
| 3037 result = factory()->NewTryCatchStatement( | 3033 catch_variable, catch_block, pos); |
| 3038 index, try_block, catch_scope, catch_variable, catch_block, pos); | |
| 3039 } else { | 3034 } else { |
| 3040 DCHECK(finally_block != NULL); | 3035 DCHECK(finally_block != NULL); |
| 3041 int index = function_state_->NextHandlerIndex(); | 3036 result = factory()->NewTryFinallyStatement(try_block, finally_block, pos); |
| 3042 result = factory()->NewTryFinallyStatement( | |
| 3043 index, try_block, finally_block, pos); | |
| 3044 } | 3037 } |
| 3045 | 3038 |
| 3046 return result; | 3039 return result; |
| 3047 } | 3040 } |
| 3048 | 3041 |
| 3049 | 3042 |
| 3050 DoWhileStatement* Parser::ParseDoWhileStatement( | 3043 DoWhileStatement* Parser::ParseDoWhileStatement( |
| 3051 ZoneList<const AstRawString*>* labels, bool* ok) { | 3044 ZoneList<const AstRawString*>* labels, bool* ok) { |
| 3052 // DoStatement :: | 3045 // DoStatement :: |
| 3053 // 'do' Statement 'while' '(' Expression ')' ';' | 3046 // 'do' Statement 'while' '(' Expression ')' ';' |
| (...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3876 Scope* original_declaration_scope = original_scope_->DeclarationScope(); | 3869 Scope* original_declaration_scope = original_scope_->DeclarationScope(); |
| 3877 Scope* scope = function_type == FunctionLiteral::DECLARATION && | 3870 Scope* scope = function_type == FunctionLiteral::DECLARATION && |
| 3878 is_sloppy(language_mode()) && | 3871 is_sloppy(language_mode()) && |
| 3879 (original_scope_ == original_declaration_scope || | 3872 (original_scope_ == original_declaration_scope || |
| 3880 declaration_scope != original_declaration_scope) | 3873 declaration_scope != original_declaration_scope) |
| 3881 ? NewScope(declaration_scope, FUNCTION_SCOPE, kind) | 3874 ? NewScope(declaration_scope, FUNCTION_SCOPE, kind) |
| 3882 : NewScope(scope_, FUNCTION_SCOPE, kind); | 3875 : NewScope(scope_, FUNCTION_SCOPE, kind); |
| 3883 ZoneList<Statement*>* body = NULL; | 3876 ZoneList<Statement*>* body = NULL; |
| 3884 int materialized_literal_count = -1; | 3877 int materialized_literal_count = -1; |
| 3885 int expected_property_count = -1; | 3878 int expected_property_count = -1; |
| 3886 int handler_count = 0; | |
| 3887 ExpressionClassifier formals_classifier; | 3879 ExpressionClassifier formals_classifier; |
| 3888 FunctionLiteral::EagerCompileHint eager_compile_hint = | 3880 FunctionLiteral::EagerCompileHint eager_compile_hint = |
| 3889 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile | 3881 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile |
| 3890 : FunctionLiteral::kShouldLazyCompile; | 3882 : FunctionLiteral::kShouldLazyCompile; |
| 3891 bool should_be_used_once_hint = false; | 3883 bool should_be_used_once_hint = false; |
| 3892 // Parse function body. | 3884 // Parse function body. |
| 3893 { | 3885 { |
| 3894 AstNodeFactory function_factory(ast_value_factory()); | 3886 AstNodeFactory function_factory(ast_value_factory()); |
| 3895 FunctionState function_state(&function_state_, &scope_, scope, kind, | 3887 FunctionState function_state(&function_state_, &scope_, scope, kind, |
| 3896 &function_factory); | 3888 &function_factory); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4013 // used once. | 4005 // used once. |
| 4014 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; | 4006 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; |
| 4015 should_be_used_once_hint = true; | 4007 should_be_used_once_hint = true; |
| 4016 } | 4008 } |
| 4017 } | 4009 } |
| 4018 if (!is_lazily_parsed) { | 4010 if (!is_lazily_parsed) { |
| 4019 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, | 4011 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, |
| 4020 kind, CHECK_OK); | 4012 kind, CHECK_OK); |
| 4021 materialized_literal_count = function_state.materialized_literal_count(); | 4013 materialized_literal_count = function_state.materialized_literal_count(); |
| 4022 expected_property_count = function_state.expected_property_count(); | 4014 expected_property_count = function_state.expected_property_count(); |
| 4023 handler_count = function_state.handler_count(); | |
| 4024 | 4015 |
| 4025 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { | 4016 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { |
| 4026 if (!function_state.super_location().IsValid()) { | 4017 if (!function_state.super_location().IsValid()) { |
| 4027 ReportMessageAt(function_name_location, | 4018 ReportMessageAt(function_name_location, |
| 4028 MessageTemplate::kStrongSuperCallMissing, | 4019 MessageTemplate::kStrongSuperCallMissing, |
| 4029 kReferenceError); | 4020 kReferenceError); |
| 4030 *ok = false; | 4021 *ok = false; |
| 4031 return nullptr; | 4022 return nullptr; |
| 4032 } | 4023 } |
| 4033 } | 4024 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4052 } | 4043 } |
| 4053 | 4044 |
| 4054 bool has_duplicate_parameters = | 4045 bool has_duplicate_parameters = |
| 4055 !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); | 4046 !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); |
| 4056 FunctionLiteral::ParameterFlag duplicate_parameters = | 4047 FunctionLiteral::ParameterFlag duplicate_parameters = |
| 4057 has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters | 4048 has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters |
| 4058 : FunctionLiteral::kNoDuplicateParameters; | 4049 : FunctionLiteral::kNoDuplicateParameters; |
| 4059 | 4050 |
| 4060 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( | 4051 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
| 4061 function_name, ast_value_factory(), scope, body, | 4052 function_name, ast_value_factory(), scope, body, |
| 4062 materialized_literal_count, expected_property_count, handler_count, | 4053 materialized_literal_count, expected_property_count, num_parameters, |
| 4063 num_parameters, duplicate_parameters, function_type, | 4054 duplicate_parameters, function_type, FunctionLiteral::kIsFunction, |
| 4064 FunctionLiteral::kIsFunction, eager_compile_hint, kind, pos); | 4055 eager_compile_hint, kind, pos); |
| 4065 function_literal->set_function_token_position(function_token_pos); | 4056 function_literal->set_function_token_position(function_token_pos); |
| 4066 if (should_be_used_once_hint) | 4057 if (should_be_used_once_hint) |
| 4067 function_literal->set_should_be_used_once_hint(); | 4058 function_literal->set_should_be_used_once_hint(); |
| 4068 | 4059 |
| 4069 if (scope->has_rest_parameter()) { | 4060 if (scope->has_rest_parameter()) { |
| 4070 // TODO(caitp): enable optimization of functions with rest params | 4061 // TODO(caitp): enable optimization of functions with rest params |
| 4071 function_literal->set_dont_optimize_reason(kRestParameter); | 4062 function_literal->set_dont_optimize_reason(kRestParameter); |
| 4072 } | 4063 } |
| 4073 | 4064 |
| 4074 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); | 4065 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); |
| (...skipping 1747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5822 Expression* Parser::SpreadCallNew(Expression* function, | 5813 Expression* Parser::SpreadCallNew(Expression* function, |
| 5823 ZoneList<v8::internal::Expression*>* args, | 5814 ZoneList<v8::internal::Expression*>* args, |
| 5824 int pos) { | 5815 int pos) { |
| 5825 args->InsertAt(0, function, zone()); | 5816 args->InsertAt(0, function, zone()); |
| 5826 | 5817 |
| 5827 return factory()->NewCallRuntime( | 5818 return factory()->NewCallRuntime( |
| 5828 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5819 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
| 5829 } | 5820 } |
| 5830 } // namespace internal | 5821 } // namespace internal |
| 5831 } // namespace v8 | 5822 } // namespace v8 |
| OLD | NEW |