OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 | 544 |
545 | 545 |
546 bool ParserTraits::IsEvalOrArguments(Handle<String> identifier) const { | 546 bool ParserTraits::IsEvalOrArguments(Handle<String> identifier) const { |
547 return identifier.is_identical_to( | 547 return identifier.is_identical_to( |
548 parser_->isolate()->factory()->eval_string()) || | 548 parser_->isolate()->factory()->eval_string()) || |
549 identifier.is_identical_to( | 549 identifier.is_identical_to( |
550 parser_->isolate()->factory()->arguments_string()); | 550 parser_->isolate()->factory()->arguments_string()); |
551 } | 551 } |
552 | 552 |
553 | 553 |
| 554 int ParserTraits::NextMaterializedLiteralIndex() { |
| 555 return parser_->current_function_state_->NextMaterializedLiteralIndex(); |
| 556 } |
| 557 |
| 558 |
554 void ParserTraits::ReportMessageAt(Scanner::Location source_location, | 559 void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
555 const char* message, | 560 const char* message, |
556 Vector<const char*> args) { | 561 Vector<const char*> args) { |
557 MessageLocation location(parser_->script_, | 562 MessageLocation location(parser_->script_, |
558 source_location.beg_pos, | 563 source_location.beg_pos, |
559 source_location.end_pos); | 564 source_location.end_pos); |
560 Factory* factory = parser_->isolate()->factory(); | 565 Factory* factory = parser_->isolate()->factory(); |
561 Handle<FixedArray> elements = factory->NewFixedArray(args.length()); | 566 Handle<FixedArray> elements = factory->NewFixedArray(args.length()); |
562 for (int i = 0; i < args.length(); i++) { | 567 for (int i = 0; i < args.length(); i++) { |
563 Handle<String> arg_string = factory->NewStringFromUtf8(CStrVector(args[i])); | 568 Handle<String> arg_string = factory->NewStringFromUtf8(CStrVector(args[i])); |
(...skipping 30 matching lines...) Expand all Loading... |
594 | 599 |
595 | 600 |
596 Handle<String> ParserTraits::GetSymbol() { | 601 Handle<String> ParserTraits::GetSymbol() { |
597 int symbol_id = -1; | 602 int symbol_id = -1; |
598 if (parser_->pre_parse_data() != NULL) { | 603 if (parser_->pre_parse_data() != NULL) { |
599 symbol_id = parser_->pre_parse_data()->GetSymbolIdentifier(); | 604 symbol_id = parser_->pre_parse_data()->GetSymbolIdentifier(); |
600 } | 605 } |
601 return parser_->LookupSymbol(symbol_id); | 606 return parser_->LookupSymbol(symbol_id); |
602 } | 607 } |
603 | 608 |
| 609 |
| 610 Handle<String> ParserTraits::NextLiteralString(PretenureFlag tenured) { |
| 611 Scanner& scanner = parser_->scanner(); |
| 612 if (scanner.is_next_literal_ascii()) { |
| 613 return parser_->isolate_->factory()->NewStringFromAscii( |
| 614 scanner.next_literal_ascii_string(), tenured); |
| 615 } else { |
| 616 return parser_->isolate_->factory()->NewStringFromTwoByte( |
| 617 scanner.next_literal_utf16_string(), tenured); |
| 618 } |
| 619 } |
| 620 |
| 621 |
| 622 Expression* ParserTraits::NewRegExpLiteral(Handle<String> js_pattern, |
| 623 Handle<String> js_flags, |
| 624 int literal_index, |
| 625 int pos) { |
| 626 return parser_->factory()->NewRegExpLiteral( |
| 627 js_pattern, js_flags, literal_index, pos); |
| 628 } |
| 629 |
604 Parser::Parser(CompilationInfo* info) | 630 Parser::Parser(CompilationInfo* info) |
605 : ParserBase<ParserTraits>(&scanner_, | 631 : ParserBase<ParserTraits>(&scanner_, |
606 info->isolate()->stack_guard()->real_climit(), | 632 info->isolate()->stack_guard()->real_climit(), |
607 this), | 633 this), |
608 isolate_(info->isolate()), | 634 isolate_(info->isolate()), |
609 symbol_cache_(0, info->zone()), | 635 symbol_cache_(0, info->zone()), |
610 script_(info->script()), | 636 script_(info->script()), |
611 scanner_(isolate_->unicode_cache()), | 637 scanner_(isolate_->unicode_cache()), |
612 reusable_preparser_(NULL), | 638 reusable_preparser_(NULL), |
613 top_scope_(NULL), | 639 top_scope_(NULL), |
(...skipping 3213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3827 int literal_index = current_function_state_->NextMaterializedLiteralIndex(); | 3853 int literal_index = current_function_state_->NextMaterializedLiteralIndex(); |
3828 | 3854 |
3829 return factory()->NewObjectLiteral(properties, | 3855 return factory()->NewObjectLiteral(properties, |
3830 literal_index, | 3856 literal_index, |
3831 number_of_boilerplate_properties, | 3857 number_of_boilerplate_properties, |
3832 has_function, | 3858 has_function, |
3833 pos); | 3859 pos); |
3834 } | 3860 } |
3835 | 3861 |
3836 | 3862 |
3837 Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) { | |
3838 int pos = peek_position(); | |
3839 if (!scanner().ScanRegExpPattern(seen_equal)) { | |
3840 Next(); | |
3841 ReportMessage("unterminated_regexp", Vector<const char*>::empty()); | |
3842 *ok = false; | |
3843 return NULL; | |
3844 } | |
3845 | |
3846 int literal_index = current_function_state_->NextMaterializedLiteralIndex(); | |
3847 | |
3848 Handle<String> js_pattern = NextLiteralString(TENURED); | |
3849 scanner().ScanRegExpFlags(); | |
3850 Handle<String> js_flags = NextLiteralString(TENURED); | |
3851 Next(); | |
3852 | |
3853 return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos); | |
3854 } | |
3855 | |
3856 | |
3857 ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { | 3863 ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { |
3858 // Arguments :: | 3864 // Arguments :: |
3859 // '(' (AssignmentExpression)*[','] ')' | 3865 // '(' (AssignmentExpression)*[','] ')' |
3860 | 3866 |
3861 ZoneList<Expression*>* result = new(zone()) ZoneList<Expression*>(4, zone()); | 3867 ZoneList<Expression*>* result = new(zone()) ZoneList<Expression*>(4, zone()); |
3862 Expect(Token::LPAREN, CHECK_OK); | 3868 Expect(Token::LPAREN, CHECK_OK); |
3863 bool done = (peek() == Token::RPAREN); | 3869 bool done = (peek() == Token::RPAREN); |
3864 while (!done) { | 3870 while (!done) { |
3865 Expression* argument = ParseAssignmentExpression(true, CHECK_OK); | 3871 Expression* argument = ParseAssignmentExpression(true, CHECK_OK); |
3866 result->Add(argument, zone()); | 3872 result->Add(argument, zone()); |
(...skipping 1653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5520 ASSERT(info()->isolate()->has_pending_exception()); | 5526 ASSERT(info()->isolate()->has_pending_exception()); |
5521 } else { | 5527 } else { |
5522 result = ParseProgram(); | 5528 result = ParseProgram(); |
5523 } | 5529 } |
5524 } | 5530 } |
5525 info()->SetFunction(result); | 5531 info()->SetFunction(result); |
5526 return (result != NULL); | 5532 return (result != NULL); |
5527 } | 5533 } |
5528 | 5534 |
5529 } } // namespace v8::internal | 5535 } } // namespace v8::internal |
OLD | NEW |