| 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/base/platform/platform.h" | 9 #include "src/base/platform/platform.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 return result; | 608 return result; |
| 609 } | 609 } |
| 610 | 610 |
| 611 | 611 |
| 612 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { | 612 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { |
| 613 return parser_->scanner()->NextSymbol(parser_->ast_value_factory_); | 613 return parser_->scanner()->NextSymbol(parser_->ast_value_factory_); |
| 614 } | 614 } |
| 615 | 615 |
| 616 | 616 |
| 617 Expression* ParserTraits::ThisExpression( | 617 Expression* ParserTraits::ThisExpression( |
| 618 Scope* scope, | 618 Scope* scope, AstNodeFactory<AstConstructionVisitor>* factory, int pos) { |
| 619 AstNodeFactory<AstConstructionVisitor>* factory) { | 619 return factory->NewVariableProxy(scope->receiver(), pos); |
| 620 return factory->NewVariableProxy(scope->receiver()); | |
| 621 } | 620 } |
| 622 | 621 |
| 623 | 622 |
| 624 Literal* ParserTraits::ExpressionFromLiteral( | 623 Literal* ParserTraits::ExpressionFromLiteral( |
| 625 Token::Value token, int pos, | 624 Token::Value token, int pos, |
| 626 Scanner* scanner, | 625 Scanner* scanner, |
| 627 AstNodeFactory<AstConstructionVisitor>* factory) { | 626 AstNodeFactory<AstConstructionVisitor>* factory) { |
| 628 switch (token) { | 627 switch (token) { |
| 629 case Token::NULL_LITERAL: | 628 case Token::NULL_LITERAL: |
| 630 return factory->NewNullLiteral(pos); | 629 return factory->NewNullLiteral(pos); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 !body->at(0)->AsExpressionStatement()-> | 846 !body->at(0)->AsExpressionStatement()-> |
| 848 expression()->IsFunctionLiteral()) { | 847 expression()->IsFunctionLiteral()) { |
| 849 ReportMessage("single_function_literal"); | 848 ReportMessage("single_function_literal"); |
| 850 ok = false; | 849 ok = false; |
| 851 } | 850 } |
| 852 } | 851 } |
| 853 | 852 |
| 854 ast_value_factory_->Internalize(isolate()); | 853 ast_value_factory_->Internalize(isolate()); |
| 855 if (ok) { | 854 if (ok) { |
| 856 result = factory()->NewFunctionLiteral( | 855 result = factory()->NewFunctionLiteral( |
| 857 ast_value_factory_->empty_string(), | 856 ast_value_factory_->empty_string(), ast_value_factory_, scope_, body, |
| 858 ast_value_factory_, | |
| 859 scope_, | |
| 860 body, | |
| 861 function_state.materialized_literal_count(), | 857 function_state.materialized_literal_count(), |
| 862 function_state.expected_property_count(), | 858 function_state.expected_property_count(), |
| 863 function_state.handler_count(), | 859 function_state.handler_count(), 0, |
| 864 0, | |
| 865 FunctionLiteral::kNoDuplicateParameters, | 860 FunctionLiteral::kNoDuplicateParameters, |
| 866 FunctionLiteral::ANONYMOUS_EXPRESSION, | 861 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval, |
| 867 FunctionLiteral::kGlobalOrEval, | 862 FunctionLiteral::kNotParenthesized, FunctionLiteral::kNormalFunction, |
| 868 FunctionLiteral::kNotParenthesized, | |
| 869 FunctionLiteral::kNotGenerator, | |
| 870 0); | 863 0); |
| 871 result->set_ast_properties(factory()->visitor()->ast_properties()); | 864 result->set_ast_properties(factory()->visitor()->ast_properties()); |
| 872 result->set_dont_optimize_reason( | 865 result->set_dont_optimize_reason( |
| 873 factory()->visitor()->dont_optimize_reason()); | 866 factory()->visitor()->dont_optimize_reason()); |
| 874 } else if (stack_overflow()) { | 867 } else if (stack_overflow()) { |
| 875 isolate()->StackOverflow(); | 868 isolate()->StackOverflow(); |
| 876 } else { | 869 } else { |
| 877 ThrowPendingError(); | 870 ThrowPendingError(); |
| 878 } | 871 } |
| 879 } | 872 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 FunctionState function_state(&function_state_, &scope_, scope, zone(), | 942 FunctionState function_state(&function_state_, &scope_, scope, zone(), |
| 950 ast_value_factory_); | 943 ast_value_factory_); |
| 951 ASSERT(scope->strict_mode() == SLOPPY || info()->strict_mode() == STRICT); | 944 ASSERT(scope->strict_mode() == SLOPPY || info()->strict_mode() == STRICT); |
| 952 ASSERT(info()->strict_mode() == shared_info->strict_mode()); | 945 ASSERT(info()->strict_mode() == shared_info->strict_mode()); |
| 953 scope->SetStrictMode(shared_info->strict_mode()); | 946 scope->SetStrictMode(shared_info->strict_mode()); |
| 954 FunctionLiteral::FunctionType function_type = shared_info->is_expression() | 947 FunctionLiteral::FunctionType function_type = shared_info->is_expression() |
| 955 ? (shared_info->is_anonymous() | 948 ? (shared_info->is_anonymous() |
| 956 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 949 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
| 957 : FunctionLiteral::NAMED_EXPRESSION) | 950 : FunctionLiteral::NAMED_EXPRESSION) |
| 958 : FunctionLiteral::DECLARATION; | 951 : FunctionLiteral::DECLARATION; |
| 952 bool is_generator = shared_info->is_generator(); |
| 959 bool ok = true; | 953 bool ok = true; |
| 960 result = ParseFunctionLiteral(raw_name, | 954 |
| 961 Scanner::Location::invalid(), | 955 if (shared_info->is_arrow()) { |
| 962 false, // Strict mode name already checked. | 956 ASSERT(!is_generator); |
| 963 shared_info->is_generator(), | 957 Expression* expression = ParseExpression(false, &ok); |
| 964 RelocInfo::kNoPosition, | 958 ASSERT(expression->IsFunctionLiteral()); |
| 965 function_type, | 959 result = expression->AsFunctionLiteral(); |
| 966 FunctionLiteral::NORMAL_ARITY, | 960 } else { |
| 967 &ok); | 961 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(), |
| 962 false, // Strict mode name already checked. |
| 963 is_generator, RelocInfo::kNoPosition, |
| 964 function_type, |
| 965 FunctionLiteral::NORMAL_ARITY, &ok); |
| 966 } |
| 968 // Make sure the results agree. | 967 // Make sure the results agree. |
| 969 ASSERT(ok == (result != NULL)); | 968 ASSERT(ok == (result != NULL)); |
| 970 } | 969 } |
| 971 | 970 |
| 972 // Make sure the target stack is empty. | 971 // Make sure the target stack is empty. |
| 973 ASSERT(target_stack_ == NULL); | 972 ASSERT(target_stack_ == NULL); |
| 974 | 973 |
| 975 ast_value_factory_->Internalize(isolate()); | 974 ast_value_factory_->Internalize(isolate()); |
| 976 if (result == NULL) { | 975 if (result == NULL) { |
| 977 if (stack_overflow()) { | 976 if (stack_overflow()) { |
| (...skipping 2592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3570 CHECK_OK); | 3569 CHECK_OK); |
| 3571 } | 3570 } |
| 3572 ast_properties = *factory()->visitor()->ast_properties(); | 3571 ast_properties = *factory()->visitor()->ast_properties(); |
| 3573 dont_optimize_reason = factory()->visitor()->dont_optimize_reason(); | 3572 dont_optimize_reason = factory()->visitor()->dont_optimize_reason(); |
| 3574 | 3573 |
| 3575 if (allow_harmony_scoping() && strict_mode() == STRICT) { | 3574 if (allow_harmony_scoping() && strict_mode() == STRICT) { |
| 3576 CheckConflictingVarDeclarations(scope, CHECK_OK); | 3575 CheckConflictingVarDeclarations(scope, CHECK_OK); |
| 3577 } | 3576 } |
| 3578 } | 3577 } |
| 3579 | 3578 |
| 3580 FunctionLiteral::IsGeneratorFlag generator = is_generator | 3579 FunctionLiteral::KindFlag kind = is_generator |
| 3581 ? FunctionLiteral::kIsGenerator | 3580 ? FunctionLiteral::kGeneratorFunction |
| 3582 : FunctionLiteral::kNotGenerator; | 3581 : FunctionLiteral::kNormalFunction; |
| 3583 FunctionLiteral* function_literal = | 3582 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
| 3584 factory()->NewFunctionLiteral(function_name, | 3583 function_name, ast_value_factory_, scope, body, |
| 3585 ast_value_factory_, | 3584 materialized_literal_count, expected_property_count, handler_count, |
| 3586 scope, | 3585 num_parameters, duplicate_parameters, function_type, |
| 3587 body, | 3586 FunctionLiteral::kIsFunction, parenthesized, kind, pos); |
| 3588 materialized_literal_count, | |
| 3589 expected_property_count, | |
| 3590 handler_count, | |
| 3591 num_parameters, | |
| 3592 duplicate_parameters, | |
| 3593 function_type, | |
| 3594 FunctionLiteral::kIsFunction, | |
| 3595 parenthesized, | |
| 3596 generator, | |
| 3597 pos); | |
| 3598 function_literal->set_function_token_position(function_token_pos); | 3587 function_literal->set_function_token_position(function_token_pos); |
| 3599 function_literal->set_ast_properties(&ast_properties); | 3588 function_literal->set_ast_properties(&ast_properties); |
| 3600 function_literal->set_dont_optimize_reason(dont_optimize_reason); | 3589 function_literal->set_dont_optimize_reason(dont_optimize_reason); |
| 3601 | 3590 |
| 3602 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); | 3591 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); |
| 3603 return function_literal; | 3592 return function_literal; |
| 3604 } | 3593 } |
| 3605 | 3594 |
| 3606 | 3595 |
| 3607 void Parser::SkipLazyFunctionBody(const AstRawString* function_name, | 3596 void Parser::SkipLazyFunctionBody(const AstRawString* function_name, |
| (...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4808 info()->SetAstValueFactory(ast_value_factory_); | 4797 info()->SetAstValueFactory(ast_value_factory_); |
| 4809 } | 4798 } |
| 4810 ast_value_factory_ = NULL; | 4799 ast_value_factory_ = NULL; |
| 4811 | 4800 |
| 4812 InternalizeUseCounts(); | 4801 InternalizeUseCounts(); |
| 4813 | 4802 |
| 4814 return (result != NULL); | 4803 return (result != NULL); |
| 4815 } | 4804 } |
| 4816 | 4805 |
| 4817 } } // namespace v8::internal | 4806 } } // namespace v8::internal |
| OLD | NEW |