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 |