| 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 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 } else { | 259 } else { |
| 260 DCHECK(info_->cached_data() != NULL); | 260 DCHECK(info_->cached_data() != NULL); |
| 261 if (compile_options() == ScriptCompiler::kConsumeParserCache) { | 261 if (compile_options() == ScriptCompiler::kConsumeParserCache) { |
| 262 cached_parse_data_ = new ParseData(*info_->cached_data()); | 262 cached_parse_data_ = new ParseData(*info_->cached_data()); |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 | 266 |
| 267 | 267 |
| 268 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) { | 268 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) { |
| 269 DCHECK(ast_value_factory_); | 269 DCHECK(ast_value_factory()); |
| 270 Scope* result = | 270 Scope* result = |
| 271 new (zone()) Scope(parent, scope_type, ast_value_factory_, zone()); | 271 new (zone()) Scope(parent, scope_type, ast_value_factory(), zone()); |
| 272 result->Initialize(); | 272 result->Initialize(); |
| 273 return result; | 273 return result; |
| 274 } | 274 } |
| 275 | 275 |
| 276 | 276 |
| 277 // ---------------------------------------------------------------------------- | 277 // ---------------------------------------------------------------------------- |
| 278 // Target is a support class to facilitate manipulation of the | 278 // Target is a support class to facilitate manipulation of the |
| 279 // Parser's target_stack_ (the stack of potential 'break' and | 279 // Parser's target_stack_ (the stack of potential 'break' and |
| 280 // 'continue' statement targets). Upon construction, a new target is | 280 // 'continue' statement targets). Upon construction, a new target is |
| 281 // added; it is removed upon destruction. | 281 // added; it is removed upon destruction. |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 *parser_->ast_node_id_gen_ = saved_ast_node_id_gen_; | 354 *parser_->ast_node_id_gen_ = saved_ast_node_id_gen_; |
| 355 } | 355 } |
| 356 | 356 |
| 357 private: | 357 private: |
| 358 ParserBase<ParserTraits>* parser_; | 358 ParserBase<ParserTraits>* parser_; |
| 359 AstNode::IdGen saved_ast_node_id_gen_; | 359 AstNode::IdGen saved_ast_node_id_gen_; |
| 360 }; | 360 }; |
| 361 | 361 |
| 362 | 362 |
| 363 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { | 363 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { |
| 364 return identifier == parser_->ast_value_factory_->eval_string() || | 364 return identifier == parser_->ast_value_factory()->eval_string() || |
| 365 identifier == parser_->ast_value_factory_->arguments_string(); | 365 identifier == parser_->ast_value_factory()->arguments_string(); |
| 366 } | 366 } |
| 367 | 367 |
| 368 | 368 |
| 369 bool ParserTraits::IsThisProperty(Expression* expression) { | 369 bool ParserTraits::IsThisProperty(Expression* expression) { |
| 370 DCHECK(expression != NULL); | 370 DCHECK(expression != NULL); |
| 371 Property* property = expression->AsProperty(); | 371 Property* property = expression->AsProperty(); |
| 372 return property != NULL && | 372 return property != NULL && |
| 373 property->obj()->AsVariableProxy() != NULL && | 373 property->obj()->AsVariableProxy() != NULL && |
| 374 property->obj()->AsVariableProxy()->is_this(); | 374 property->obj()->AsVariableProxy()->is_this(); |
| 375 } | 375 } |
| 376 | 376 |
| 377 | 377 |
| 378 bool ParserTraits::IsIdentifier(Expression* expression) { | 378 bool ParserTraits::IsIdentifier(Expression* expression) { |
| 379 VariableProxy* operand = expression->AsVariableProxy(); | 379 VariableProxy* operand = expression->AsVariableProxy(); |
| 380 return operand != NULL && !operand->is_this(); | 380 return operand != NULL && !operand->is_this(); |
| 381 } | 381 } |
| 382 | 382 |
| 383 | 383 |
| 384 void ParserTraits::PushPropertyName(FuncNameInferrer* fni, | 384 void ParserTraits::PushPropertyName(FuncNameInferrer* fni, |
| 385 Expression* expression) { | 385 Expression* expression) { |
| 386 if (expression->IsPropertyName()) { | 386 if (expression->IsPropertyName()) { |
| 387 fni->PushLiteralName(expression->AsLiteral()->AsRawPropertyName()); | 387 fni->PushLiteralName(expression->AsLiteral()->AsRawPropertyName()); |
| 388 } else { | 388 } else { |
| 389 fni->PushLiteralName( | 389 fni->PushLiteralName( |
| 390 parser_->ast_value_factory_->anonymous_function_string()); | 390 parser_->ast_value_factory()->anonymous_function_string()); |
| 391 } | 391 } |
| 392 } | 392 } |
| 393 | 393 |
| 394 | 394 |
| 395 void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left, | 395 void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left, |
| 396 Expression* right) { | 396 Expression* right) { |
| 397 DCHECK(left != NULL); | 397 DCHECK(left != NULL); |
| 398 if (left->AsProperty() != NULL && | 398 if (left->AsProperty() != NULL && |
| 399 right->AsFunctionLiteral() != NULL) { | 399 right->AsFunctionLiteral() != NULL) { |
| 400 right->AsFunctionLiteral()->set_pretenure(); | 400 right->AsFunctionLiteral()->set_pretenure(); |
| 401 } | 401 } |
| 402 } | 402 } |
| 403 | 403 |
| 404 | 404 |
| 405 void ParserTraits::CheckPossibleEvalCall(Expression* expression, | 405 void ParserTraits::CheckPossibleEvalCall(Expression* expression, |
| 406 Scope* scope) { | 406 Scope* scope) { |
| 407 VariableProxy* callee = expression->AsVariableProxy(); | 407 VariableProxy* callee = expression->AsVariableProxy(); |
| 408 if (callee != NULL && | 408 if (callee != NULL && |
| 409 callee->raw_name() == parser_->ast_value_factory_->eval_string()) { | 409 callee->raw_name() == parser_->ast_value_factory()->eval_string()) { |
| 410 scope->DeclarationScope()->RecordEvalCall(); | 410 scope->DeclarationScope()->RecordEvalCall(); |
| 411 } | 411 } |
| 412 } | 412 } |
| 413 | 413 |
| 414 | 414 |
| 415 Expression* ParserTraits::MarkExpressionAsAssigned(Expression* expression) { | 415 Expression* ParserTraits::MarkExpressionAsAssigned(Expression* expression) { |
| 416 VariableProxy* proxy = | 416 VariableProxy* proxy = |
| 417 expression != NULL ? expression->AsVariableProxy() : NULL; | 417 expression != NULL ? expression->AsVariableProxy() : NULL; |
| 418 if (proxy != NULL) proxy->set_is_assigned(); | 418 if (proxy != NULL) proxy->set_is_assigned(); |
| 419 return expression; | 419 return expression; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 if (op == Token::BIT_NOT) { | 519 if (op == Token::BIT_NOT) { |
| 520 return factory->NewBinaryOperation( | 520 return factory->NewBinaryOperation( |
| 521 Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos); | 521 Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos); |
| 522 } | 522 } |
| 523 return factory->NewUnaryOperation(op, expression, pos); | 523 return factory->NewUnaryOperation(op, expression, pos); |
| 524 } | 524 } |
| 525 | 525 |
| 526 | 526 |
| 527 Expression* ParserTraits::NewThrowReferenceError(const char* message, int pos) { | 527 Expression* ParserTraits::NewThrowReferenceError(const char* message, int pos) { |
| 528 return NewThrowError( | 528 return NewThrowError( |
| 529 parser_->ast_value_factory_->make_reference_error_string(), message, NULL, | 529 parser_->ast_value_factory()->make_reference_error_string(), message, |
| 530 pos); | 530 NULL, pos); |
| 531 } | 531 } |
| 532 | 532 |
| 533 | 533 |
| 534 Expression* ParserTraits::NewThrowSyntaxError( | 534 Expression* ParserTraits::NewThrowSyntaxError( |
| 535 const char* message, const AstRawString* arg, int pos) { | 535 const char* message, const AstRawString* arg, int pos) { |
| 536 return NewThrowError(parser_->ast_value_factory_->make_syntax_error_string(), | 536 return NewThrowError(parser_->ast_value_factory()->make_syntax_error_string(), |
| 537 message, arg, pos); | 537 message, arg, pos); |
| 538 } | 538 } |
| 539 | 539 |
| 540 | 540 |
| 541 Expression* ParserTraits::NewThrowTypeError( | 541 Expression* ParserTraits::NewThrowTypeError( |
| 542 const char* message, const AstRawString* arg, int pos) { | 542 const char* message, const AstRawString* arg, int pos) { |
| 543 return NewThrowError(parser_->ast_value_factory_->make_type_error_string(), | 543 return NewThrowError(parser_->ast_value_factory()->make_type_error_string(), |
| 544 message, arg, pos); | 544 message, arg, pos); |
| 545 } | 545 } |
| 546 | 546 |
| 547 | 547 |
| 548 Expression* ParserTraits::NewThrowError( | 548 Expression* ParserTraits::NewThrowError( |
| 549 const AstRawString* constructor, const char* message, | 549 const AstRawString* constructor, const char* message, |
| 550 const AstRawString* arg, int pos) { | 550 const AstRawString* arg, int pos) { |
| 551 Zone* zone = parser_->zone(); | 551 Zone* zone = parser_->zone(); |
| 552 int argc = arg != NULL ? 1 : 0; | 552 int argc = arg != NULL ? 1 : 0; |
| 553 const AstRawString* type = | 553 const AstRawString* type = |
| 554 parser_->ast_value_factory_->GetOneByteString(message); | 554 parser_->ast_value_factory()->GetOneByteString(message); |
| 555 ZoneList<const AstRawString*>* array = | 555 ZoneList<const AstRawString*>* array = |
| 556 new (zone) ZoneList<const AstRawString*>(argc, zone); | 556 new (zone) ZoneList<const AstRawString*>(argc, zone); |
| 557 if (arg != NULL) { | 557 if (arg != NULL) { |
| 558 array->Add(arg, zone); | 558 array->Add(arg, zone); |
| 559 } | 559 } |
| 560 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone); | 560 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone); |
| 561 args->Add(parser_->factory()->NewStringLiteral(type, pos), zone); | 561 args->Add(parser_->factory()->NewStringLiteral(type, pos), zone); |
| 562 args->Add(parser_->factory()->NewStringListLiteral(array, pos), zone); | 562 args->Add(parser_->factory()->NewStringListLiteral(array, pos), zone); |
| 563 CallRuntime* call_constructor = | 563 CallRuntime* call_constructor = |
| 564 parser_->factory()->NewCallRuntime(constructor, NULL, args, pos); | 564 parser_->factory()->NewCallRuntime(constructor, NULL, args, pos); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 parser_->pending_error_location_ = source_location; | 615 parser_->pending_error_location_ = source_location; |
| 616 parser_->pending_error_message_ = message; | 616 parser_->pending_error_message_ = message; |
| 617 parser_->pending_error_char_arg_ = NULL; | 617 parser_->pending_error_char_arg_ = NULL; |
| 618 parser_->pending_error_arg_ = arg; | 618 parser_->pending_error_arg_ = arg; |
| 619 parser_->pending_error_is_reference_error_ = is_reference_error; | 619 parser_->pending_error_is_reference_error_ = is_reference_error; |
| 620 } | 620 } |
| 621 | 621 |
| 622 | 622 |
| 623 const AstRawString* ParserTraits::GetSymbol(Scanner* scanner) { | 623 const AstRawString* ParserTraits::GetSymbol(Scanner* scanner) { |
| 624 const AstRawString* result = | 624 const AstRawString* result = |
| 625 parser_->scanner()->CurrentSymbol(parser_->ast_value_factory_); | 625 parser_->scanner()->CurrentSymbol(parser_->ast_value_factory()); |
| 626 DCHECK(result != NULL); | 626 DCHECK(result != NULL); |
| 627 return result; | 627 return result; |
| 628 } | 628 } |
| 629 | 629 |
| 630 | 630 |
| 631 const AstRawString* ParserTraits::GetNumberAsSymbol(Scanner* scanner) { | 631 const AstRawString* ParserTraits::GetNumberAsSymbol(Scanner* scanner) { |
| 632 double double_value = parser_->scanner()->DoubleValue(); | 632 double double_value = parser_->scanner()->DoubleValue(); |
| 633 char array[100]; | 633 char array[100]; |
| 634 const char* string = | 634 const char* string = |
| 635 DoubleToCString(double_value, Vector<char>(array, arraysize(array))); | 635 DoubleToCString(double_value, Vector<char>(array, arraysize(array))); |
| 636 return ast_value_factory()->GetOneByteString(string); | 636 return ast_value_factory()->GetOneByteString(string); |
| 637 } | 637 } |
| 638 | 638 |
| 639 | 639 |
| 640 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { | 640 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { |
| 641 return parser_->scanner()->NextSymbol(parser_->ast_value_factory_); | 641 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); |
| 642 } | 642 } |
| 643 | 643 |
| 644 | 644 |
| 645 Expression* ParserTraits::ThisExpression( | 645 Expression* ParserTraits::ThisExpression( |
| 646 Scope* scope, AstNodeFactory<AstConstructionVisitor>* factory, int pos) { | 646 Scope* scope, AstNodeFactory<AstConstructionVisitor>* factory, int pos) { |
| 647 return factory->NewVariableProxy(scope->receiver(), pos); | 647 return factory->NewVariableProxy(scope->receiver(), pos); |
| 648 } | 648 } |
| 649 | 649 |
| 650 Expression* ParserTraits::SuperReference( | 650 Expression* ParserTraits::SuperReference( |
| 651 Scope* scope, AstNodeFactory<AstConstructionVisitor>* factory, int pos) { | 651 Scope* scope, AstNodeFactory<AstConstructionVisitor>* factory, int pos) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 name_is_strict_reserved, is_generator, | 736 name_is_strict_reserved, is_generator, |
| 737 function_token_position, type, | 737 function_token_position, type, |
| 738 arity_restriction, ok); | 738 arity_restriction, ok); |
| 739 } | 739 } |
| 740 | 740 |
| 741 | 741 |
| 742 Parser::Parser(CompilationInfo* info, ParseInfo* parse_info) | 742 Parser::Parser(CompilationInfo* info, ParseInfo* parse_info) |
| 743 : ParserBase<ParserTraits>(&scanner_, parse_info->stack_limit, | 743 : ParserBase<ParserTraits>(&scanner_, parse_info->stack_limit, |
| 744 info->extension(), NULL, info->zone(), | 744 info->extension(), NULL, info->zone(), |
| 745 info->ast_node_id_gen(), this), | 745 info->ast_node_id_gen(), this), |
| 746 isolate_(info->isolate()), | |
| 747 script_(info->script()), | |
| 748 scanner_(parse_info->unicode_cache), | 746 scanner_(parse_info->unicode_cache), |
| 749 reusable_preparser_(NULL), | 747 reusable_preparser_(NULL), |
| 750 original_scope_(NULL), | 748 original_scope_(NULL), |
| 751 target_stack_(NULL), | 749 target_stack_(NULL), |
| 752 cached_parse_data_(NULL), | 750 cached_parse_data_(NULL), |
| 753 ast_value_factory_(info->ast_value_factory()), | |
| 754 info_(info), | 751 info_(info), |
| 755 has_pending_error_(false), | 752 has_pending_error_(false), |
| 756 pending_error_message_(NULL), | 753 pending_error_message_(NULL), |
| 757 pending_error_arg_(NULL), | 754 pending_error_arg_(NULL), |
| 758 pending_error_char_arg_(NULL), | 755 pending_error_char_arg_(NULL), |
| 759 total_preparse_skipped_(0), | 756 total_preparse_skipped_(0), |
| 760 pre_parse_timer_(NULL) { | 757 pre_parse_timer_(NULL) { |
| 761 DCHECK(!script_.is_null()); | 758 DCHECK(!script().is_null()); |
| 762 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); | 759 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); |
| 763 set_allow_modules(!info->is_native() && FLAG_harmony_modules); | 760 set_allow_modules(!info->is_native() && FLAG_harmony_modules); |
| 764 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); | 761 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); |
| 765 set_allow_lazy(false); // Must be explicitly enabled. | 762 set_allow_lazy(false); // Must be explicitly enabled. |
| 766 set_allow_generators(FLAG_harmony_generators); | 763 set_allow_generators(FLAG_harmony_generators); |
| 767 set_allow_arrow_functions(FLAG_harmony_arrow_functions); | 764 set_allow_arrow_functions(FLAG_harmony_arrow_functions); |
| 768 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); | 765 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); |
| 769 set_allow_classes(FLAG_harmony_classes); | 766 set_allow_classes(FLAG_harmony_classes); |
| 770 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; | 767 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
| 771 ++feature) { | 768 ++feature) { |
| 772 use_counts_[feature] = 0; | 769 use_counts_[feature] = 0; |
| 773 } | 770 } |
| 774 if (ast_value_factory_ == NULL) { | 771 if (info->ast_value_factory() == NULL) { |
| 775 ast_value_factory_ = new AstValueFactory(zone(), parse_info->hash_seed); | 772 // info takes ownership of AstValueFactory. |
| 773 info->SetAstValueFactory(new stValueFactory(zone(), parse_info->hash_seed)); |
| 776 } | 774 } |
| 777 } | 775 } |
| 778 | 776 |
| 779 | 777 |
| 780 FunctionLiteral* Parser::ParseProgram() { | 778 FunctionLiteral* Parser::ParseProgram() { |
| 781 // TODO(bmeurer): We temporarily need to pass allow_nesting = true here, | 779 // TODO(bmeurer): We temporarily need to pass allow_nesting = true here, |
| 782 // see comment for HistogramTimerScope class. | 780 // see comment for HistogramTimerScope class. |
| 783 | 781 |
| 784 // It's OK to use the counters here, since this function is only called in | 782 // It's OK to use the counters here, since this function is only called in |
| 785 // the main thread. | 783 // the main thread. |
| 786 HistogramTimerScope timer_scope(isolate()->counters()->parse(), true); | 784 HistogramTimerScope timer_scope(isolate()->counters()->parse(), true); |
| 787 Handle<String> source(String::cast(script_->source())); | 785 Handle<String> source(String::cast(script()->source())); |
| 788 isolate()->counters()->total_parse_size()->Increment(source->length()); | 786 isolate()->counters()->total_parse_size()->Increment(source->length()); |
| 789 base::ElapsedTimer timer; | 787 base::ElapsedTimer timer; |
| 790 if (FLAG_trace_parse) { | 788 if (FLAG_trace_parse) { |
| 791 timer.Start(); | 789 timer.Start(); |
| 792 } | 790 } |
| 793 fni_ = new(zone()) FuncNameInferrer(ast_value_factory_, zone()); | 791 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone()); |
| 794 | 792 |
| 795 // Initialize parser state. | 793 // Initialize parser state. |
| 796 CompleteParserRecorder recorder; | 794 CompleteParserRecorder recorder; |
| 797 | 795 |
| 798 if (compile_options() == ScriptCompiler::kProduceParserCache) { | 796 if (compile_options() == ScriptCompiler::kProduceParserCache) { |
| 799 log_ = &recorder; | 797 log_ = &recorder; |
| 800 } else if (compile_options() == ScriptCompiler::kConsumeParserCache) { | 798 } else if (compile_options() == ScriptCompiler::kConsumeParserCache) { |
| 801 cached_parse_data_->Initialize(); | 799 cached_parse_data_->Initialize(); |
| 802 } | 800 } |
| 803 | 801 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 | 844 |
| 847 FunctionLiteral* result = NULL; | 845 FunctionLiteral* result = NULL; |
| 848 { Scope* scope = NewScope(scope_, GLOBAL_SCOPE); | 846 { Scope* scope = NewScope(scope_, GLOBAL_SCOPE); |
| 849 info->SetGlobalScope(scope); | 847 info->SetGlobalScope(scope); |
| 850 if (!info->context().is_null() && !info->context()->IsNativeContext()) { | 848 if (!info->context().is_null() && !info->context()->IsNativeContext()) { |
| 851 scope = Scope::DeserializeScopeChain(*info->context(), scope, zone()); | 849 scope = Scope::DeserializeScopeChain(*info->context(), scope, zone()); |
| 852 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this | 850 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this |
| 853 // means the Parser cannot operate independent of the V8 heap. Tell the | 851 // means the Parser cannot operate independent of the V8 heap. Tell the |
| 854 // string table to internalize strings and values right after they're | 852 // string table to internalize strings and values right after they're |
| 855 // created. | 853 // created. |
| 856 ast_value_factory_->Internalize(isolate()); | 854 ast_value_factory()->Internalize(isolate()); |
| 857 } | 855 } |
| 858 original_scope_ = scope; | 856 original_scope_ = scope; |
| 859 if (info->is_eval()) { | 857 if (info->is_eval()) { |
| 860 if (!scope->is_global_scope() || info->strict_mode() == STRICT) { | 858 if (!scope->is_global_scope() || info->strict_mode() == STRICT) { |
| 861 scope = NewScope(scope, EVAL_SCOPE); | 859 scope = NewScope(scope, EVAL_SCOPE); |
| 862 } | 860 } |
| 863 } else if (info->is_global()) { | 861 } else if (info->is_global()) { |
| 864 scope = NewScope(scope, GLOBAL_SCOPE); | 862 scope = NewScope(scope, GLOBAL_SCOPE); |
| 865 } | 863 } |
| 866 scope->set_start_position(0); | 864 scope->set_start_position(0); |
| 867 scope->set_end_position(source->length()); | 865 scope->set_end_position(source->length()); |
| 868 | 866 |
| 869 // Compute the parsing mode. | 867 // Compute the parsing mode. |
| 870 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; | 868 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; |
| 871 if (allow_natives_syntax() || | 869 if (allow_natives_syntax() || |
| 872 extension_ != NULL || | 870 extension_ != NULL || |
| 873 scope->is_eval_scope()) { | 871 scope->is_eval_scope()) { |
| 874 mode = PARSE_EAGERLY; | 872 mode = PARSE_EAGERLY; |
| 875 } | 873 } |
| 876 ParsingModeScope parsing_mode(this, mode); | 874 ParsingModeScope parsing_mode(this, mode); |
| 877 | 875 |
| 878 // Enters 'scope'. | 876 // Enters 'scope'. |
| 879 FunctionState function_state(&function_state_, &scope_, scope, zone(), | 877 FunctionState function_state(&function_state_, &scope_, scope, zone(), |
| 880 ast_value_factory_, info->ast_node_id_gen()); | 878 ast_value_factory(), info->ast_node_id_gen()); |
| 881 | 879 |
| 882 scope_->SetStrictMode(info->strict_mode()); | 880 scope_->SetStrictMode(info->strict_mode()); |
| 883 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); | 881 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
| 884 bool ok = true; | 882 bool ok = true; |
| 885 int beg_pos = scanner()->location().beg_pos; | 883 int beg_pos = scanner()->location().beg_pos; |
| 886 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); | 884 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); |
| 887 | 885 |
| 888 if (ok && strict_mode() == STRICT) { | 886 if (ok && strict_mode() == STRICT) { |
| 889 CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); | 887 CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); |
| 890 } | 888 } |
| 891 | 889 |
| 892 if (ok && allow_harmony_scoping() && strict_mode() == STRICT) { | 890 if (ok && allow_harmony_scoping() && strict_mode() == STRICT) { |
| 893 CheckConflictingVarDeclarations(scope_, &ok); | 891 CheckConflictingVarDeclarations(scope_, &ok); |
| 894 } | 892 } |
| 895 | 893 |
| 896 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { | 894 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { |
| 897 if (body->length() != 1 || | 895 if (body->length() != 1 || |
| 898 !body->at(0)->IsExpressionStatement() || | 896 !body->at(0)->IsExpressionStatement() || |
| 899 !body->at(0)->AsExpressionStatement()-> | 897 !body->at(0)->AsExpressionStatement()-> |
| 900 expression()->IsFunctionLiteral()) { | 898 expression()->IsFunctionLiteral()) { |
| 901 ReportMessage("single_function_literal"); | 899 ReportMessage("single_function_literal"); |
| 902 ok = false; | 900 ok = false; |
| 903 } | 901 } |
| 904 } | 902 } |
| 905 | 903 |
| 906 if (ok) { | 904 if (ok) { |
| 907 result = factory()->NewFunctionLiteral( | 905 result = factory()->NewFunctionLiteral( |
| 908 ast_value_factory_->empty_string(), ast_value_factory_, scope_, body, | 906 ast_value_factory()->empty_string(), ast_value_factory(), scope_, |
| 909 function_state.materialized_literal_count(), | 907 body, function_state.materialized_literal_count(), |
| 910 function_state.expected_property_count(), | 908 function_state.expected_property_count(), |
| 911 function_state.handler_count(), 0, | 909 function_state.handler_count(), 0, |
| 912 FunctionLiteral::kNoDuplicateParameters, | 910 FunctionLiteral::kNoDuplicateParameters, |
| 913 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval, | 911 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval, |
| 914 FunctionLiteral::kNotParenthesized, FunctionLiteral::kNormalFunction, | 912 FunctionLiteral::kNotParenthesized, FunctionLiteral::kNormalFunction, |
| 915 0); | 913 0); |
| 916 result->set_ast_properties(factory()->visitor()->ast_properties()); | 914 result->set_ast_properties(factory()->visitor()->ast_properties()); |
| 917 result->set_dont_optimize_reason( | 915 result->set_dont_optimize_reason( |
| 918 factory()->visitor()->dont_optimize_reason()); | 916 factory()->visitor()->dont_optimize_reason()); |
| 919 } | 917 } |
| 920 } | 918 } |
| 921 | 919 |
| 922 // Make sure the target stack is empty. | 920 // Make sure the target stack is empty. |
| 923 DCHECK(target_stack_ == NULL); | 921 DCHECK(target_stack_ == NULL); |
| 924 | 922 |
| 925 return result; | 923 return result; |
| 926 } | 924 } |
| 927 | 925 |
| 928 | 926 |
| 929 FunctionLiteral* Parser::ParseLazy() { | 927 FunctionLiteral* Parser::ParseLazy() { |
| 930 // It's OK to use the counters here, since this function is only called in | 928 // It's OK to use the counters here, since this function is only called in |
| 931 // the main thread. | 929 // the main thread. |
| 932 HistogramTimerScope timer_scope(isolate()->counters()->parse_lazy()); | 930 HistogramTimerScope timer_scope(isolate()->counters()->parse_lazy()); |
| 933 Handle<String> source(String::cast(script_->source())); | 931 Handle<String> source(String::cast(script()->source())); |
| 934 isolate()->counters()->total_parse_size()->Increment(source->length()); | 932 isolate()->counters()->total_parse_size()->Increment(source->length()); |
| 935 base::ElapsedTimer timer; | 933 base::ElapsedTimer timer; |
| 936 if (FLAG_trace_parse) { | 934 if (FLAG_trace_parse) { |
| 937 timer.Start(); | 935 timer.Start(); |
| 938 } | 936 } |
| 939 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); | 937 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); |
| 940 | 938 |
| 941 // Initialize parser state. | 939 // Initialize parser state. |
| 942 source = String::Flatten(source); | 940 source = String::Flatten(source); |
| 943 FunctionLiteral* result; | 941 FunctionLiteral* result; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 963 } | 961 } |
| 964 | 962 |
| 965 | 963 |
| 966 FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) { | 964 FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) { |
| 967 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); | 965 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); |
| 968 scanner_.Initialize(source); | 966 scanner_.Initialize(source); |
| 969 DCHECK(scope_ == NULL); | 967 DCHECK(scope_ == NULL); |
| 970 DCHECK(target_stack_ == NULL); | 968 DCHECK(target_stack_ == NULL); |
| 971 | 969 |
| 972 Handle<String> name(String::cast(shared_info->name())); | 970 Handle<String> name(String::cast(shared_info->name())); |
| 973 DCHECK(ast_value_factory_); | 971 DCHECK(ast_value_factory()); |
| 974 fni_ = new(zone()) FuncNameInferrer(ast_value_factory_, zone()); | 972 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone()); |
| 975 const AstRawString* raw_name = ast_value_factory_->GetString(name); | 973 const AstRawString* raw_name = ast_value_factory()->GetString(name); |
| 976 fni_->PushEnclosingName(raw_name); | 974 fni_->PushEnclosingName(raw_name); |
| 977 | 975 |
| 978 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 976 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
| 979 | 977 |
| 980 // Place holder for the result. | 978 // Place holder for the result. |
| 981 FunctionLiteral* result = NULL; | 979 FunctionLiteral* result = NULL; |
| 982 | 980 |
| 983 { | 981 { |
| 984 // Parse the function literal. | 982 // Parse the function literal. |
| 985 Scope* scope = NewScope(scope_, GLOBAL_SCOPE); | 983 Scope* scope = NewScope(scope_, GLOBAL_SCOPE); |
| 986 info()->SetGlobalScope(scope); | 984 info()->SetGlobalScope(scope); |
| 987 if (!info()->closure().is_null()) { | 985 if (!info()->closure().is_null()) { |
| 988 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, | 986 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, |
| 989 zone()); | 987 zone()); |
| 990 } | 988 } |
| 991 original_scope_ = scope; | 989 original_scope_ = scope; |
| 992 FunctionState function_state(&function_state_, &scope_, scope, zone(), | 990 FunctionState function_state(&function_state_, &scope_, scope, zone(), |
| 993 ast_value_factory_, info()->ast_node_id_gen()); | 991 ast_value_factory(), |
| 992 info()->ast_node_id_gen()); |
| 994 DCHECK(scope->strict_mode() == SLOPPY || info()->strict_mode() == STRICT); | 993 DCHECK(scope->strict_mode() == SLOPPY || info()->strict_mode() == STRICT); |
| 995 DCHECK(info()->strict_mode() == shared_info->strict_mode()); | 994 DCHECK(info()->strict_mode() == shared_info->strict_mode()); |
| 996 scope->SetStrictMode(shared_info->strict_mode()); | 995 scope->SetStrictMode(shared_info->strict_mode()); |
| 997 FunctionLiteral::FunctionType function_type = shared_info->is_expression() | 996 FunctionLiteral::FunctionType function_type = shared_info->is_expression() |
| 998 ? (shared_info->is_anonymous() | 997 ? (shared_info->is_anonymous() |
| 999 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 998 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
| 1000 : FunctionLiteral::NAMED_EXPRESSION) | 999 : FunctionLiteral::NAMED_EXPRESSION) |
| 1001 : FunctionLiteral::DECLARATION; | 1000 : FunctionLiteral::DECLARATION; |
| 1002 bool is_generator = shared_info->is_generator(); | 1001 bool is_generator = shared_info->is_generator(); |
| 1003 bool ok = true; | 1002 bool ok = true; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 ExpressionStatement* e_stat; | 1067 ExpressionStatement* e_stat; |
| 1069 Literal* literal; | 1068 Literal* literal; |
| 1070 // Still processing directive prologue? | 1069 // Still processing directive prologue? |
| 1071 if ((e_stat = stat->AsExpressionStatement()) != NULL && | 1070 if ((e_stat = stat->AsExpressionStatement()) != NULL && |
| 1072 (literal = e_stat->expression()->AsLiteral()) != NULL && | 1071 (literal = e_stat->expression()->AsLiteral()) != NULL && |
| 1073 literal->raw_value()->IsString()) { | 1072 literal->raw_value()->IsString()) { |
| 1074 // Check "use strict" directive (ES5 14.1) and "use asm" directive. Only | 1073 // Check "use strict" directive (ES5 14.1) and "use asm" directive. Only |
| 1075 // one can be present. | 1074 // one can be present. |
| 1076 if (strict_mode() == SLOPPY && | 1075 if (strict_mode() == SLOPPY && |
| 1077 literal->raw_value()->AsString() == | 1076 literal->raw_value()->AsString() == |
| 1078 ast_value_factory_->use_strict_string() && | 1077 ast_value_factory()->use_strict_string() && |
| 1079 token_loc.end_pos - token_loc.beg_pos == | 1078 token_loc.end_pos - token_loc.beg_pos == |
| 1080 ast_value_factory_->use_strict_string()->length() + 2) { | 1079 ast_value_factory()->use_strict_string()->length() + 2) { |
| 1081 // TODO(mstarzinger): Global strict eval calls, need their own scope | 1080 // TODO(mstarzinger): Global strict eval calls, need their own scope |
| 1082 // as specified in ES5 10.4.2(3). The correct fix would be to always | 1081 // as specified in ES5 10.4.2(3). The correct fix would be to always |
| 1083 // add this scope in DoParseProgram(), but that requires adaptations | 1082 // add this scope in DoParseProgram(), but that requires adaptations |
| 1084 // all over the code base, so we go with a quick-fix for now. | 1083 // all over the code base, so we go with a quick-fix for now. |
| 1085 // In the same manner, we have to patch the parsing mode. | 1084 // In the same manner, we have to patch the parsing mode. |
| 1086 if (is_eval && !scope_->is_eval_scope()) { | 1085 if (is_eval && !scope_->is_eval_scope()) { |
| 1087 DCHECK(scope_->is_global_scope()); | 1086 DCHECK(scope_->is_global_scope()); |
| 1088 Scope* scope = NewScope(scope_, EVAL_SCOPE); | 1087 Scope* scope = NewScope(scope_, EVAL_SCOPE); |
| 1089 scope->set_start_position(scope_->start_position()); | 1088 scope->set_start_position(scope_->start_position()); |
| 1090 scope->set_end_position(scope_->end_position()); | 1089 scope->set_end_position(scope_->end_position()); |
| 1091 scope_ = scope; | 1090 scope_ = scope; |
| 1092 mode_ = PARSE_EAGERLY; | 1091 mode_ = PARSE_EAGERLY; |
| 1093 } | 1092 } |
| 1094 scope_->SetStrictMode(STRICT); | 1093 scope_->SetStrictMode(STRICT); |
| 1095 // "use strict" is the only directive for now. | 1094 // "use strict" is the only directive for now. |
| 1096 directive_prologue = false; | 1095 directive_prologue = false; |
| 1097 } else if (literal->raw_value()->AsString() == | 1096 } else if (literal->raw_value()->AsString() == |
| 1098 ast_value_factory_->use_asm_string() && | 1097 ast_value_factory()->use_asm_string() && |
| 1099 token_loc.end_pos - token_loc.beg_pos == | 1098 token_loc.end_pos - token_loc.beg_pos == |
| 1100 ast_value_factory_->use_asm_string()->length() + 2) { | 1099 ast_value_factory()->use_asm_string()->length() + 2) { |
| 1101 // Store the usage count; The actual use counter on the isolate is | 1100 // Store the usage count; The actual use counter on the isolate is |
| 1102 // incremented after parsing is done. | 1101 // incremented after parsing is done. |
| 1103 ++use_counts_[v8::Isolate::kUseAsm]; | 1102 ++use_counts_[v8::Isolate::kUseAsm]; |
| 1104 } | 1103 } |
| 1105 } else { | 1104 } else { |
| 1106 // End of the directive prologue. | 1105 // End of the directive prologue. |
| 1107 directive_prologue = false; | 1106 directive_prologue = false; |
| 1108 } | 1107 } |
| 1109 } | 1108 } |
| 1110 | 1109 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1149 default: { | 1148 default: { |
| 1150 Statement* stmt = ParseStatement(labels, CHECK_OK); | 1149 Statement* stmt = ParseStatement(labels, CHECK_OK); |
| 1151 // Handle 'module' as a context-sensitive keyword. | 1150 // Handle 'module' as a context-sensitive keyword. |
| 1152 if (FLAG_harmony_modules && | 1151 if (FLAG_harmony_modules && |
| 1153 peek() == Token::IDENTIFIER && | 1152 peek() == Token::IDENTIFIER && |
| 1154 !scanner()->HasAnyLineTerminatorBeforeNext() && | 1153 !scanner()->HasAnyLineTerminatorBeforeNext() && |
| 1155 stmt != NULL) { | 1154 stmt != NULL) { |
| 1156 ExpressionStatement* estmt = stmt->AsExpressionStatement(); | 1155 ExpressionStatement* estmt = stmt->AsExpressionStatement(); |
| 1157 if (estmt != NULL && estmt->expression()->AsVariableProxy() != NULL && | 1156 if (estmt != NULL && estmt->expression()->AsVariableProxy() != NULL && |
| 1158 estmt->expression()->AsVariableProxy()->raw_name() == | 1157 estmt->expression()->AsVariableProxy()->raw_name() == |
| 1159 ast_value_factory_->module_string() && | 1158 ast_value_factory()->module_string() && |
| 1160 !scanner()->literal_contains_escapes()) { | 1159 !scanner()->literal_contains_escapes()) { |
| 1161 return ParseModuleDeclaration(NULL, ok); | 1160 return ParseModuleDeclaration(NULL, ok); |
| 1162 } | 1161 } |
| 1163 } | 1162 } |
| 1164 return stmt; | 1163 return stmt; |
| 1165 } | 1164 } |
| 1166 } | 1165 } |
| 1167 } | 1166 } |
| 1168 | 1167 |
| 1169 | 1168 |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1447 Expect(Token::EXPORT, CHECK_OK); | 1446 Expect(Token::EXPORT, CHECK_OK); |
| 1448 | 1447 |
| 1449 Statement* result = NULL; | 1448 Statement* result = NULL; |
| 1450 ZoneList<const AstRawString*> names(1, zone()); | 1449 ZoneList<const AstRawString*> names(1, zone()); |
| 1451 switch (peek()) { | 1450 switch (peek()) { |
| 1452 case Token::IDENTIFIER: { | 1451 case Token::IDENTIFIER: { |
| 1453 int pos = position(); | 1452 int pos = position(); |
| 1454 const AstRawString* name = | 1453 const AstRawString* name = |
| 1455 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); | 1454 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); |
| 1456 // Handle 'module' as a context-sensitive keyword. | 1455 // Handle 'module' as a context-sensitive keyword. |
| 1457 if (name != ast_value_factory_->module_string()) { | 1456 if (name != ast_value_factory()->module_string()) { |
| 1458 names.Add(name, zone()); | 1457 names.Add(name, zone()); |
| 1459 while (peek() == Token::COMMA) { | 1458 while (peek() == Token::COMMA) { |
| 1460 Consume(Token::COMMA); | 1459 Consume(Token::COMMA); |
| 1461 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); | 1460 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); |
| 1462 names.Add(name, zone()); | 1461 names.Add(name, zone()); |
| 1463 } | 1462 } |
| 1464 ExpectSemicolon(CHECK_OK); | 1463 ExpectSemicolon(CHECK_OK); |
| 1465 result = factory()->NewEmptyStatement(pos); | 1464 result = factory()->NewEmptyStatement(pos); |
| 1466 } else { | 1465 } else { |
| 1467 result = ParseModuleDeclaration(&names, CHECK_OK); | 1466 result = ParseModuleDeclaration(&names, CHECK_OK); |
| (...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2224 | 2223 |
| 2225 if (is_const) { | 2224 if (is_const) { |
| 2226 arguments->Add(value, zone()); | 2225 arguments->Add(value, zone()); |
| 2227 value = NULL; // zap the value to avoid the unnecessary assignment | 2226 value = NULL; // zap the value to avoid the unnecessary assignment |
| 2228 | 2227 |
| 2229 // Construct the call to Runtime_InitializeConstGlobal | 2228 // Construct the call to Runtime_InitializeConstGlobal |
| 2230 // and add it to the initialization statement block. | 2229 // and add it to the initialization statement block. |
| 2231 // Note that the function does different things depending on | 2230 // Note that the function does different things depending on |
| 2232 // the number of arguments (1 or 2). | 2231 // the number of arguments (1 or 2). |
| 2233 initialize = factory()->NewCallRuntime( | 2232 initialize = factory()->NewCallRuntime( |
| 2234 ast_value_factory_->initialize_const_global_string(), | 2233 ast_value_factory()->initialize_const_global_string(), |
| 2235 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), | 2234 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), arguments, |
| 2236 arguments, pos); | 2235 pos); |
| 2237 } else { | 2236 } else { |
| 2238 // Add strict mode. | 2237 // Add strict mode. |
| 2239 // We may want to pass singleton to avoid Literal allocations. | 2238 // We may want to pass singleton to avoid Literal allocations. |
| 2240 StrictMode strict_mode = initialization_scope->strict_mode(); | 2239 StrictMode strict_mode = initialization_scope->strict_mode(); |
| 2241 arguments->Add(factory()->NewNumberLiteral(strict_mode, pos), zone()); | 2240 arguments->Add(factory()->NewNumberLiteral(strict_mode, pos), zone()); |
| 2242 | 2241 |
| 2243 // Be careful not to assign a value to the global variable if | 2242 // Be careful not to assign a value to the global variable if |
| 2244 // we're in a with. The initialization value should not | 2243 // we're in a with. The initialization value should not |
| 2245 // necessarily be stored in the global object in that case, | 2244 // necessarily be stored in the global object in that case, |
| 2246 // which is why we need to generate a separate assignment node. | 2245 // which is why we need to generate a separate assignment node. |
| 2247 if (value != NULL && !inside_with()) { | 2246 if (value != NULL && !inside_with()) { |
| 2248 arguments->Add(value, zone()); | 2247 arguments->Add(value, zone()); |
| 2249 value = NULL; // zap the value to avoid the unnecessary assignment | 2248 value = NULL; // zap the value to avoid the unnecessary assignment |
| 2250 // Construct the call to Runtime_InitializeVarGlobal | 2249 // Construct the call to Runtime_InitializeVarGlobal |
| 2251 // and add it to the initialization statement block. | 2250 // and add it to the initialization statement block. |
| 2252 initialize = factory()->NewCallRuntime( | 2251 initialize = factory()->NewCallRuntime( |
| 2253 ast_value_factory_->initialize_var_global_string(), | 2252 ast_value_factory()->initialize_var_global_string(), |
| 2254 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), arguments, | 2253 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), arguments, |
| 2255 pos); | 2254 pos); |
| 2256 } else { | 2255 } else { |
| 2257 initialize = NULL; | 2256 initialize = NULL; |
| 2258 } | 2257 } |
| 2259 } | 2258 } |
| 2260 | 2259 |
| 2261 if (initialize != NULL) { | 2260 if (initialize != NULL) { |
| 2262 block->AddStatement(factory()->NewExpressionStatement( | 2261 block->AddStatement(factory()->NewExpressionStatement( |
| 2263 initialize, RelocInfo::kNoPosition), | 2262 initialize, RelocInfo::kNoPosition), |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2358 // from the top scope. This way, we don't try to resolve it | 2357 // from the top scope. This way, we don't try to resolve it |
| 2359 // during the scope processing. | 2358 // during the scope processing. |
| 2360 scope_->RemoveUnresolved(var); | 2359 scope_->RemoveUnresolved(var); |
| 2361 Expect(Token::COLON, CHECK_OK); | 2360 Expect(Token::COLON, CHECK_OK); |
| 2362 return ParseStatement(labels, ok); | 2361 return ParseStatement(labels, ok); |
| 2363 } | 2362 } |
| 2364 | 2363 |
| 2365 // If we have an extension, we allow a native function declaration. | 2364 // If we have an extension, we allow a native function declaration. |
| 2366 // A native function declaration starts with "native function" with | 2365 // A native function declaration starts with "native function" with |
| 2367 // no line-terminator between the two words. | 2366 // no line-terminator between the two words. |
| 2368 if (extension_ != NULL && | 2367 if (extension_ != NULL && peek() == Token::FUNCTION && |
| 2369 peek() == Token::FUNCTION && | 2368 !scanner()->HasAnyLineTerminatorBeforeNext() && expr != NULL && |
| 2370 !scanner()->HasAnyLineTerminatorBeforeNext() && | |
| 2371 expr != NULL && | |
| 2372 expr->AsVariableProxy() != NULL && | 2369 expr->AsVariableProxy() != NULL && |
| 2373 expr->AsVariableProxy()->raw_name() == | 2370 expr->AsVariableProxy()->raw_name() == |
| 2374 ast_value_factory_->native_string() && | 2371 ast_value_factory()->native_string() && |
| 2375 !scanner()->literal_contains_escapes()) { | 2372 !scanner()->literal_contains_escapes()) { |
| 2376 return ParseNativeDeclaration(ok); | 2373 return ParseNativeDeclaration(ok); |
| 2377 } | 2374 } |
| 2378 | 2375 |
| 2379 // Parsed expression statement, or the context-sensitive 'module' keyword. | 2376 // Parsed expression statement, or the context-sensitive 'module' keyword. |
| 2380 // Only expect semicolon in the former case. | 2377 // Only expect semicolon in the former case. |
| 2381 if (!FLAG_harmony_modules || | 2378 if (!FLAG_harmony_modules || peek() != Token::IDENTIFIER || |
| 2382 peek() != Token::IDENTIFIER || | |
| 2383 scanner()->HasAnyLineTerminatorBeforeNext() || | 2379 scanner()->HasAnyLineTerminatorBeforeNext() || |
| 2384 expr->AsVariableProxy() == NULL || | 2380 expr->AsVariableProxy() == NULL || |
| 2385 expr->AsVariableProxy()->raw_name() != | 2381 expr->AsVariableProxy()->raw_name() != |
| 2386 ast_value_factory_->module_string() || | 2382 ast_value_factory()->module_string() || |
| 2387 scanner()->literal_contains_escapes()) { | 2383 scanner()->literal_contains_escapes()) { |
| 2388 ExpectSemicolon(CHECK_OK); | 2384 ExpectSemicolon(CHECK_OK); |
| 2389 } | 2385 } |
| 2390 return factory()->NewExpressionStatement(expr, pos); | 2386 return factory()->NewExpressionStatement(expr, pos); |
| 2391 } | 2387 } |
| 2392 | 2388 |
| 2393 | 2389 |
| 2394 IfStatement* Parser::ParseIfStatement(ZoneList<const AstRawString*>* labels, | 2390 IfStatement* Parser::ParseIfStatement(ZoneList<const AstRawString*>* labels, |
| 2395 bool* ok) { | 2391 bool* ok) { |
| 2396 // IfStatement :: | 2392 // IfStatement :: |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2798 | 2794 |
| 2799 | 2795 |
| 2800 void Parser::InitializeForEachStatement(ForEachStatement* stmt, | 2796 void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
| 2801 Expression* each, | 2797 Expression* each, |
| 2802 Expression* subject, | 2798 Expression* subject, |
| 2803 Statement* body) { | 2799 Statement* body) { |
| 2804 ForOfStatement* for_of = stmt->AsForOfStatement(); | 2800 ForOfStatement* for_of = stmt->AsForOfStatement(); |
| 2805 | 2801 |
| 2806 if (for_of != NULL) { | 2802 if (for_of != NULL) { |
| 2807 Variable* iterator = scope_->DeclarationScope()->NewTemporary( | 2803 Variable* iterator = scope_->DeclarationScope()->NewTemporary( |
| 2808 ast_value_factory_->dot_iterator_string()); | 2804 ast_value_factory()->dot_iterator_string()); |
| 2809 Variable* result = scope_->DeclarationScope()->NewTemporary( | 2805 Variable* result = scope_->DeclarationScope()->NewTemporary( |
| 2810 ast_value_factory_->dot_result_string()); | 2806 ast_value_factory()->dot_result_string()); |
| 2811 | 2807 |
| 2812 Expression* assign_iterator; | 2808 Expression* assign_iterator; |
| 2813 Expression* next_result; | 2809 Expression* next_result; |
| 2814 Expression* result_done; | 2810 Expression* result_done; |
| 2815 Expression* assign_each; | 2811 Expression* assign_each; |
| 2816 | 2812 |
| 2817 // var iterator = subject[Symbol.iterator](); | 2813 // var iterator = subject[Symbol.iterator](); |
| 2818 assign_iterator = factory()->NewAssignment( | 2814 assign_iterator = factory()->NewAssignment( |
| 2819 Token::ASSIGN, factory()->NewVariableProxy(iterator), | 2815 Token::ASSIGN, factory()->NewVariableProxy(iterator), |
| 2820 GetIterator(subject, factory()), RelocInfo::kNoPosition); | 2816 GetIterator(subject, factory()), RelocInfo::kNoPosition); |
| 2821 | 2817 |
| 2822 // var result = iterator.next(); | 2818 // var result = iterator.next(); |
| 2823 { | 2819 { |
| 2824 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); | 2820 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 2825 Expression* next_literal = factory()->NewStringLiteral( | 2821 Expression* next_literal = factory()->NewStringLiteral( |
| 2826 ast_value_factory_->next_string(), RelocInfo::kNoPosition); | 2822 ast_value_factory()->next_string(), RelocInfo::kNoPosition); |
| 2827 Expression* next_property = factory()->NewProperty( | 2823 Expression* next_property = factory()->NewProperty( |
| 2828 iterator_proxy, next_literal, RelocInfo::kNoPosition); | 2824 iterator_proxy, next_literal, RelocInfo::kNoPosition); |
| 2829 ZoneList<Expression*>* next_arguments = | 2825 ZoneList<Expression*>* next_arguments = |
| 2830 new(zone()) ZoneList<Expression*>(0, zone()); | 2826 new(zone()) ZoneList<Expression*>(0, zone()); |
| 2831 Expression* next_call = factory()->NewCall( | 2827 Expression* next_call = factory()->NewCall( |
| 2832 next_property, next_arguments, RelocInfo::kNoPosition); | 2828 next_property, next_arguments, RelocInfo::kNoPosition); |
| 2833 Expression* result_proxy = factory()->NewVariableProxy(result); | 2829 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2834 next_result = factory()->NewAssignment( | 2830 next_result = factory()->NewAssignment( |
| 2835 Token::ASSIGN, result_proxy, next_call, RelocInfo::kNoPosition); | 2831 Token::ASSIGN, result_proxy, next_call, RelocInfo::kNoPosition); |
| 2836 } | 2832 } |
| 2837 | 2833 |
| 2838 // result.done | 2834 // result.done |
| 2839 { | 2835 { |
| 2840 Expression* done_literal = factory()->NewStringLiteral( | 2836 Expression* done_literal = factory()->NewStringLiteral( |
| 2841 ast_value_factory_->done_string(), RelocInfo::kNoPosition); | 2837 ast_value_factory()->done_string(), RelocInfo::kNoPosition); |
| 2842 Expression* result_proxy = factory()->NewVariableProxy(result); | 2838 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2843 result_done = factory()->NewProperty( | 2839 result_done = factory()->NewProperty( |
| 2844 result_proxy, done_literal, RelocInfo::kNoPosition); | 2840 result_proxy, done_literal, RelocInfo::kNoPosition); |
| 2845 } | 2841 } |
| 2846 | 2842 |
| 2847 // each = result.value | 2843 // each = result.value |
| 2848 { | 2844 { |
| 2849 Expression* value_literal = factory()->NewStringLiteral( | 2845 Expression* value_literal = factory()->NewStringLiteral( |
| 2850 ast_value_factory_->value_string(), RelocInfo::kNoPosition); | 2846 ast_value_factory()->value_string(), RelocInfo::kNoPosition); |
| 2851 Expression* result_proxy = factory()->NewVariableProxy(result); | 2847 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2852 Expression* result_value = factory()->NewProperty( | 2848 Expression* result_value = factory()->NewProperty( |
| 2853 result_proxy, value_literal, RelocInfo::kNoPosition); | 2849 result_proxy, value_literal, RelocInfo::kNoPosition); |
| 2854 assign_each = factory()->NewAssignment( | 2850 assign_each = factory()->NewAssignment( |
| 2855 Token::ASSIGN, each, result_value, RelocInfo::kNoPosition); | 2851 Token::ASSIGN, each, result_value, RelocInfo::kNoPosition); |
| 2856 } | 2852 } |
| 2857 | 2853 |
| 2858 for_of->Initialize(each, subject, body, | 2854 for_of->Initialize(each, subject, body, |
| 2859 assign_iterator, | 2855 assign_iterator, |
| 2860 next_result, | 2856 next_result, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2903 // } | 2899 // } |
| 2904 | 2900 |
| 2905 DCHECK(names->length() > 0); | 2901 DCHECK(names->length() > 0); |
| 2906 Scope* for_scope = scope_; | 2902 Scope* for_scope = scope_; |
| 2907 ZoneList<Variable*> temps(names->length(), zone()); | 2903 ZoneList<Variable*> temps(names->length(), zone()); |
| 2908 | 2904 |
| 2909 Block* outer_block = factory()->NewBlock(NULL, names->length() + 3, false, | 2905 Block* outer_block = factory()->NewBlock(NULL, names->length() + 3, false, |
| 2910 RelocInfo::kNoPosition); | 2906 RelocInfo::kNoPosition); |
| 2911 outer_block->AddStatement(init, zone()); | 2907 outer_block->AddStatement(init, zone()); |
| 2912 | 2908 |
| 2913 const AstRawString* temp_name = ast_value_factory_->dot_for_string(); | 2909 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); |
| 2914 | 2910 |
| 2915 // For each let variable x: | 2911 // For each let variable x: |
| 2916 // make statement: temp_x = x. | 2912 // make statement: temp_x = x. |
| 2917 for (int i = 0; i < names->length(); i++) { | 2913 for (int i = 0; i < names->length(); i++) { |
| 2918 VariableProxy* proxy = | 2914 VariableProxy* proxy = |
| 2919 NewUnresolved(names->at(i), LET, Interface::NewValue()); | 2915 NewUnresolved(names->at(i), LET, Interface::NewValue()); |
| 2920 Variable* temp = scope_->DeclarationScope()->NewTemporary(temp_name); | 2916 Variable* temp = scope_->DeclarationScope()->NewTemporary(temp_name); |
| 2921 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); | 2917 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
| 2922 Assignment* assignment = factory()->NewAssignment( | 2918 Assignment* assignment = factory()->NewAssignment( |
| 2923 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); | 2919 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3101 // <let x' be a temporary variable> | 3097 // <let x' be a temporary variable> |
| 3102 // for (x' in e) { | 3098 // for (x' in e) { |
| 3103 // let x; | 3099 // let x; |
| 3104 // x = x'; | 3100 // x = x'; |
| 3105 // b; | 3101 // b; |
| 3106 // } | 3102 // } |
| 3107 | 3103 |
| 3108 // TODO(keuchel): Move the temporary variable to the block scope, after | 3104 // TODO(keuchel): Move the temporary variable to the block scope, after |
| 3109 // implementing stack allocated block scoped variables. | 3105 // implementing stack allocated block scoped variables. |
| 3110 Variable* temp = scope_->DeclarationScope()->NewTemporary( | 3106 Variable* temp = scope_->DeclarationScope()->NewTemporary( |
| 3111 ast_value_factory_->dot_for_string()); | 3107 ast_value_factory()->dot_for_string()); |
| 3112 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); | 3108 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
| 3113 ForEachStatement* loop = | 3109 ForEachStatement* loop = |
| 3114 factory()->NewForEachStatement(mode, labels, pos); | 3110 factory()->NewForEachStatement(mode, labels, pos); |
| 3115 Target target(&this->target_stack_, loop); | 3111 Target target(&this->target_stack_, loop); |
| 3116 | 3112 |
| 3117 // The expression does not see the loop variable. | 3113 // The expression does not see the loop variable. |
| 3118 scope_ = saved_scope; | 3114 scope_ = saved_scope; |
| 3119 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3115 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 3120 scope_ = for_scope; | 3116 scope_ = for_scope; |
| 3121 Expect(Token::RPAREN, CHECK_OK); | 3117 Expect(Token::RPAREN, CHECK_OK); |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3385 int pos = function_token_pos == RelocInfo::kNoPosition | 3381 int pos = function_token_pos == RelocInfo::kNoPosition |
| 3386 ? peek_position() : function_token_pos; | 3382 ? peek_position() : function_token_pos; |
| 3387 | 3383 |
| 3388 // Anonymous functions were passed either the empty symbol or a null | 3384 // Anonymous functions were passed either the empty symbol or a null |
| 3389 // handle as the function name. Remember if we were passed a non-empty | 3385 // handle as the function name. Remember if we were passed a non-empty |
| 3390 // handle to decide whether to invoke function name inference. | 3386 // handle to decide whether to invoke function name inference. |
| 3391 bool should_infer_name = function_name == NULL; | 3387 bool should_infer_name = function_name == NULL; |
| 3392 | 3388 |
| 3393 // We want a non-null handle as the function name. | 3389 // We want a non-null handle as the function name. |
| 3394 if (should_infer_name) { | 3390 if (should_infer_name) { |
| 3395 function_name = ast_value_factory_->empty_string(); | 3391 function_name = ast_value_factory()->empty_string(); |
| 3396 } | 3392 } |
| 3397 | 3393 |
| 3398 int num_parameters = 0; | 3394 int num_parameters = 0; |
| 3399 // Function declarations are function scoped in normal mode, so they are | 3395 // Function declarations are function scoped in normal mode, so they are |
| 3400 // hoisted. In harmony block scoping mode they are block scoped, so they | 3396 // hoisted. In harmony block scoping mode they are block scoped, so they |
| 3401 // are not hoisted. | 3397 // are not hoisted. |
| 3402 // | 3398 // |
| 3403 // One tricky case are function declarations in a local sloppy-mode eval: | 3399 // One tricky case are function declarations in a local sloppy-mode eval: |
| 3404 // their declaration is hoisted, but they still see the local scope. E.g., | 3400 // their declaration is hoisted, but they still see the local scope. E.g., |
| 3405 // | 3401 // |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3439 FunctionLiteral::ParameterFlag duplicate_parameters = | 3435 FunctionLiteral::ParameterFlag duplicate_parameters = |
| 3440 FunctionLiteral::kNoDuplicateParameters; | 3436 FunctionLiteral::kNoDuplicateParameters; |
| 3441 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ | 3437 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ |
| 3442 ? FunctionLiteral::kIsParenthesized | 3438 ? FunctionLiteral::kIsParenthesized |
| 3443 : FunctionLiteral::kNotParenthesized; | 3439 : FunctionLiteral::kNotParenthesized; |
| 3444 AstProperties ast_properties; | 3440 AstProperties ast_properties; |
| 3445 BailoutReason dont_optimize_reason = kNoReason; | 3441 BailoutReason dont_optimize_reason = kNoReason; |
| 3446 // Parse function body. | 3442 // Parse function body. |
| 3447 { | 3443 { |
| 3448 FunctionState function_state(&function_state_, &scope_, scope, zone(), | 3444 FunctionState function_state(&function_state_, &scope_, scope, zone(), |
| 3449 ast_value_factory_, info()->ast_node_id_gen()); | 3445 ast_value_factory(), |
| 3446 info()->ast_node_id_gen()); |
| 3450 scope_->SetScopeName(function_name); | 3447 scope_->SetScopeName(function_name); |
| 3451 | 3448 |
| 3452 if (is_generator) { | 3449 if (is_generator) { |
| 3453 // For generators, allocating variables in contexts is currently a win | 3450 // For generators, allocating variables in contexts is currently a win |
| 3454 // because it minimizes the work needed to suspend and resume an | 3451 // because it minimizes the work needed to suspend and resume an |
| 3455 // activation. | 3452 // activation. |
| 3456 scope_->ForceContextAllocation(); | 3453 scope_->ForceContextAllocation(); |
| 3457 | 3454 |
| 3458 // Calling a generator returns a generator object. That object is stored | 3455 // Calling a generator returns a generator object. That object is stored |
| 3459 // in a temporary variable, a definition that is used by "yield" | 3456 // in a temporary variable, a definition that is used by "yield" |
| 3460 // expressions. This also marks the FunctionState as a generator. | 3457 // expressions. This also marks the FunctionState as a generator. |
| 3461 Variable* temp = scope_->DeclarationScope()->NewTemporary( | 3458 Variable* temp = scope_->DeclarationScope()->NewTemporary( |
| 3462 ast_value_factory_->dot_generator_object_string()); | 3459 ast_value_factory()->dot_generator_object_string()); |
| 3463 function_state.set_generator_object_variable(temp); | 3460 function_state.set_generator_object_variable(temp); |
| 3464 } | 3461 } |
| 3465 | 3462 |
| 3466 // FormalParameterList :: | 3463 // FormalParameterList :: |
| 3467 // '(' (Identifier)*[','] ')' | 3464 // '(' (Identifier)*[','] ')' |
| 3468 Expect(Token::LPAREN, CHECK_OK); | 3465 Expect(Token::LPAREN, CHECK_OK); |
| 3469 scope->set_start_position(scanner()->location().beg_pos); | 3466 scope->set_start_position(scanner()->location().beg_pos); |
| 3470 | 3467 |
| 3471 // We don't yet know if the function will be strict, so we cannot yet | 3468 // We don't yet know if the function will be strict, so we cannot yet |
| 3472 // produce errors for parameter names or duplicates. However, we remember | 3469 // produce errors for parameter names or duplicates. However, we remember |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3610 | 3607 |
| 3611 if (allow_harmony_scoping() && strict_mode() == STRICT) { | 3608 if (allow_harmony_scoping() && strict_mode() == STRICT) { |
| 3612 CheckConflictingVarDeclarations(scope, CHECK_OK); | 3609 CheckConflictingVarDeclarations(scope, CHECK_OK); |
| 3613 } | 3610 } |
| 3614 } | 3611 } |
| 3615 | 3612 |
| 3616 FunctionLiteral::KindFlag kind = is_generator | 3613 FunctionLiteral::KindFlag kind = is_generator |
| 3617 ? FunctionLiteral::kGeneratorFunction | 3614 ? FunctionLiteral::kGeneratorFunction |
| 3618 : FunctionLiteral::kNormalFunction; | 3615 : FunctionLiteral::kNormalFunction; |
| 3619 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( | 3616 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
| 3620 function_name, ast_value_factory_, scope, body, | 3617 function_name, ast_value_factory(), scope, body, |
| 3621 materialized_literal_count, expected_property_count, handler_count, | 3618 materialized_literal_count, expected_property_count, handler_count, |
| 3622 num_parameters, duplicate_parameters, function_type, | 3619 num_parameters, duplicate_parameters, function_type, |
| 3623 FunctionLiteral::kIsFunction, parenthesized, kind, pos); | 3620 FunctionLiteral::kIsFunction, parenthesized, kind, pos); |
| 3624 function_literal->set_function_token_position(function_token_pos); | 3621 function_literal->set_function_token_position(function_token_pos); |
| 3625 function_literal->set_ast_properties(&ast_properties); | 3622 function_literal->set_ast_properties(&ast_properties); |
| 3626 function_literal->set_dont_optimize_reason(dont_optimize_reason); | 3623 function_literal->set_dont_optimize_reason(dont_optimize_reason); |
| 3627 | 3624 |
| 3628 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); | 3625 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); |
| 3629 return function_literal; | 3626 return function_literal; |
| 3630 } | 3627 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3713 factory()->NewThisFunction(pos), | 3710 factory()->NewThisFunction(pos), |
| 3714 RelocInfo::kNoPosition), | 3711 RelocInfo::kNoPosition), |
| 3715 RelocInfo::kNoPosition), zone()); | 3712 RelocInfo::kNoPosition), zone()); |
| 3716 } | 3713 } |
| 3717 | 3714 |
| 3718 // For generators, allocate and yield an iterator on function entry. | 3715 // For generators, allocate and yield an iterator on function entry. |
| 3719 if (is_generator) { | 3716 if (is_generator) { |
| 3720 ZoneList<Expression*>* arguments = | 3717 ZoneList<Expression*>* arguments = |
| 3721 new(zone()) ZoneList<Expression*>(0, zone()); | 3718 new(zone()) ZoneList<Expression*>(0, zone()); |
| 3722 CallRuntime* allocation = factory()->NewCallRuntime( | 3719 CallRuntime* allocation = factory()->NewCallRuntime( |
| 3723 ast_value_factory_->empty_string(), | 3720 ast_value_factory()->empty_string(), |
| 3724 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), | 3721 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments, |
| 3725 arguments, pos); | 3722 pos); |
| 3726 VariableProxy* init_proxy = factory()->NewVariableProxy( | 3723 VariableProxy* init_proxy = factory()->NewVariableProxy( |
| 3727 function_state_->generator_object_variable()); | 3724 function_state_->generator_object_variable()); |
| 3728 Assignment* assignment = factory()->NewAssignment( | 3725 Assignment* assignment = factory()->NewAssignment( |
| 3729 Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition); | 3726 Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition); |
| 3730 VariableProxy* get_proxy = factory()->NewVariableProxy( | 3727 VariableProxy* get_proxy = factory()->NewVariableProxy( |
| 3731 function_state_->generator_object_variable()); | 3728 function_state_->generator_object_variable()); |
| 3732 Yield* yield = factory()->NewYield( | 3729 Yield* yield = factory()->NewYield( |
| 3733 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition); | 3730 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition); |
| 3734 body->Add(factory()->NewExpressionStatement( | 3731 body->Add(factory()->NewExpressionStatement( |
| 3735 yield, RelocInfo::kNoPosition), zone()); | 3732 yield, RelocInfo::kNoPosition), zone()); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3928 } | 3925 } |
| 3929 if (scanner_.source_mapping_url()->length() > 0) { | 3926 if (scanner_.source_mapping_url()->length() > 0) { |
| 3930 Handle<String> source_mapping_url = | 3927 Handle<String> source_mapping_url = |
| 3931 scanner_.source_mapping_url()->Internalize(isolate()); | 3928 scanner_.source_mapping_url()->Internalize(isolate()); |
| 3932 info_->script()->set_source_mapping_url(*source_mapping_url); | 3929 info_->script()->set_source_mapping_url(*source_mapping_url); |
| 3933 } | 3930 } |
| 3934 } | 3931 } |
| 3935 | 3932 |
| 3936 | 3933 |
| 3937 void Parser::ThrowPendingError() { | 3934 void Parser::ThrowPendingError() { |
| 3938 DCHECK(ast_value_factory_->IsInternalized()); | 3935 DCHECK(ast_value_factory()->IsInternalized()); |
| 3939 if (has_pending_error_) { | 3936 if (has_pending_error_) { |
| 3940 MessageLocation location(script_, | 3937 MessageLocation location(script(), pending_error_location_.beg_pos, |
| 3941 pending_error_location_.beg_pos, | |
| 3942 pending_error_location_.end_pos); | 3938 pending_error_location_.end_pos); |
| 3943 Factory* factory = isolate()->factory(); | 3939 Factory* factory = isolate()->factory(); |
| 3944 bool has_arg = | 3940 bool has_arg = |
| 3945 pending_error_arg_ != NULL || pending_error_char_arg_ != NULL; | 3941 pending_error_arg_ != NULL || pending_error_char_arg_ != NULL; |
| 3946 Handle<FixedArray> elements = factory->NewFixedArray(has_arg ? 1 : 0); | 3942 Handle<FixedArray> elements = factory->NewFixedArray(has_arg ? 1 : 0); |
| 3947 if (pending_error_arg_ != NULL) { | 3943 if (pending_error_arg_ != NULL) { |
| 3948 Handle<String> arg_string = pending_error_arg_->string(); | 3944 Handle<String> arg_string = pending_error_arg_->string(); |
| 3949 elements->set(0, *arg_string); | 3945 elements->set(0, *arg_string); |
| 3950 } else if (pending_error_char_arg_ != NULL) { | 3946 } else if (pending_error_char_arg_ != NULL) { |
| 3951 Handle<String> arg_string = | 3947 Handle<String> arg_string = |
| 3952 factory->NewStringFromUtf8(CStrVector(pending_error_char_arg_)) | 3948 factory->NewStringFromUtf8(CStrVector(pending_error_char_arg_)) |
| 3953 .ToHandleChecked(); | 3949 .ToHandleChecked(); |
| 3954 elements->set(0, *arg_string); | 3950 elements->set(0, *arg_string); |
| 3955 } | 3951 } |
| 3956 isolate()->debug()->OnCompileError(script_); | 3952 isolate()->debug()->OnCompileError(script()); |
| 3957 | 3953 |
| 3958 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); | 3954 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); |
| 3959 Handle<Object> error; | 3955 Handle<Object> error; |
| 3960 MaybeHandle<Object> maybe_error = | 3956 MaybeHandle<Object> maybe_error = |
| 3961 pending_error_is_reference_error_ | 3957 pending_error_is_reference_error_ |
| 3962 ? factory->NewReferenceError(pending_error_message_, array) | 3958 ? factory->NewReferenceError(pending_error_message_, array) |
| 3963 : factory->NewSyntaxError(pending_error_message_, array); | 3959 : factory->NewSyntaxError(pending_error_message_, array); |
| 3964 if (maybe_error.ToHandle(&error)) isolate()->Throw(*error, &location); | 3960 if (maybe_error.ToHandle(&error)) isolate()->Throw(*error, &location); |
| 3965 } | 3961 } |
| 3966 } | 3962 } |
| 3967 | 3963 |
| 3968 | 3964 |
| 3969 void Parser::Internalize() { | 3965 void Parser::Internalize() { |
| 3970 // Internalize strings. | 3966 // Internalize strings. |
| 3971 ast_value_factory_->Internalize(isolate()); | 3967 ast_value_factory()->Internalize(isolate()); |
| 3972 | 3968 |
| 3973 // Error processing. | 3969 // Error processing. |
| 3974 if (info()->function() == NULL) { | 3970 if (info()->function() == NULL) { |
| 3975 if (stack_overflow()) { | 3971 if (stack_overflow()) { |
| 3976 isolate()->StackOverflow(); | 3972 isolate()->StackOverflow(); |
| 3977 } else { | 3973 } else { |
| 3978 ThrowPendingError(); | 3974 ThrowPendingError(); |
| 3979 } | 3975 } |
| 3980 } | 3976 } |
| 3981 | 3977 |
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4823 | 4819 |
| 4824 | 4820 |
| 4825 bool Parser::Parse() { | 4821 bool Parser::Parse() { |
| 4826 DCHECK(info()->function() == NULL); | 4822 DCHECK(info()->function() == NULL); |
| 4827 FunctionLiteral* result = NULL; | 4823 FunctionLiteral* result = NULL; |
| 4828 pre_parse_timer_ = isolate()->counters()->pre_parse(); | 4824 pre_parse_timer_ = isolate()->counters()->pre_parse(); |
| 4829 if (allow_natives_syntax() || extension_ != NULL) { | 4825 if (allow_natives_syntax() || extension_ != NULL) { |
| 4830 // If intrinsics are allowed, the Parser cannot operate independent of the | 4826 // If intrinsics are allowed, the Parser cannot operate independent of the |
| 4831 // V8 heap because of Runtime. Tell the string table to internalize strings | 4827 // V8 heap because of Runtime. Tell the string table to internalize strings |
| 4832 // and values right after they're created. | 4828 // and values right after they're created. |
| 4833 ast_value_factory_->Internalize(isolate()); | 4829 ast_value_factory()->Internalize(isolate()); |
| 4834 } | 4830 } |
| 4835 | 4831 |
| 4836 if (info()->is_lazy()) { | 4832 if (info()->is_lazy()) { |
| 4837 DCHECK(!info()->is_eval()); | 4833 DCHECK(!info()->is_eval()); |
| 4838 if (info()->shared_info()->is_function()) { | 4834 if (info()->shared_info()->is_function()) { |
| 4839 result = ParseLazy(); | 4835 result = ParseLazy(); |
| 4840 } else { | 4836 } else { |
| 4841 result = ParseProgram(); | 4837 result = ParseProgram(); |
| 4842 } | 4838 } |
| 4843 } else { | 4839 } else { |
| 4844 SetCachedData(); | 4840 SetCachedData(); |
| 4845 result = ParseProgram(); | 4841 result = ParseProgram(); |
| 4846 } | 4842 } |
| 4847 info()->SetFunction(result); | 4843 info()->SetFunction(result); |
| 4848 | 4844 |
| 4849 Internalize(); | 4845 Internalize(); |
| 4850 DCHECK(ast_value_factory_->IsInternalized()); | 4846 DCHECK(ast_value_factory()->IsInternalized()); |
| 4851 // info takes ownership of ast_value_factory_. | |
| 4852 if (info()->ast_value_factory() == NULL) { | |
| 4853 info()->SetAstValueFactory(ast_value_factory_); | |
| 4854 } | |
| 4855 ast_value_factory_ = NULL; | |
| 4856 return (result != NULL); | 4847 return (result != NULL); |
| 4857 } | 4848 } |
| 4858 | 4849 |
| 4859 } } // namespace v8::internal | 4850 } } // namespace v8::internal |
| OLD | NEW |