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 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 ~BlockState() { parser_->top_scope_ = outer_scope_; } | 479 ~BlockState() { parser_->top_scope_ = outer_scope_; } |
480 | 480 |
481 private: | 481 private: |
482 Parser* parser_; | 482 Parser* parser_; |
483 Scope* outer_scope_; | 483 Scope* outer_scope_; |
484 }; | 484 }; |
485 | 485 |
486 | 486 |
487 Parser::FunctionState::FunctionState(Parser* parser, | 487 Parser::FunctionState::FunctionState(Parser* parser, |
488 Scope* scope, | 488 Scope* scope, |
| 489 bool is_generator, |
489 Isolate* isolate) | 490 Isolate* isolate) |
490 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), | 491 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), |
491 next_handler_index_(0), | 492 next_handler_index_(0), |
492 expected_property_count_(0), | 493 expected_property_count_(0), |
| 494 is_generator_(is_generator), |
493 only_simple_this_property_assignments_(false), | 495 only_simple_this_property_assignments_(false), |
494 this_property_assignments_(isolate->factory()->empty_fixed_array()), | 496 this_property_assignments_(isolate->factory()->empty_fixed_array()), |
495 parser_(parser), | 497 parser_(parser), |
496 outer_function_state_(parser->current_function_state_), | 498 outer_function_state_(parser->current_function_state_), |
497 outer_scope_(parser->top_scope_), | 499 outer_scope_(parser->top_scope_), |
498 saved_ast_node_id_(isolate->ast_node_id()), | 500 saved_ast_node_id_(isolate->ast_node_id()), |
499 factory_(isolate, parser->zone()) { | 501 factory_(isolate, parser->zone()) { |
500 parser->top_scope_ = scope; | 502 parser->top_scope_ = scope; |
501 parser->current_function_state_ = this; | 503 parser->current_function_state_ = this; |
502 isolate->set_ast_node_id(BailoutId::FirstUsable().ToInt()); | 504 isolate->set_ast_node_id(BailoutId::FirstUsable().ToInt()); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 scope->set_start_position(0); | 637 scope->set_start_position(0); |
636 scope->set_end_position(source->length()); | 638 scope->set_end_position(source->length()); |
637 | 639 |
638 // Compute the parsing mode. | 640 // Compute the parsing mode. |
639 Mode mode = (FLAG_lazy && allow_lazy_) ? PARSE_LAZILY : PARSE_EAGERLY; | 641 Mode mode = (FLAG_lazy && allow_lazy_) ? PARSE_LAZILY : PARSE_EAGERLY; |
640 if (allow_natives_syntax_ || extension_ != NULL || scope->is_eval_scope()) { | 642 if (allow_natives_syntax_ || extension_ != NULL || scope->is_eval_scope()) { |
641 mode = PARSE_EAGERLY; | 643 mode = PARSE_EAGERLY; |
642 } | 644 } |
643 ParsingModeScope parsing_mode(this, mode); | 645 ParsingModeScope parsing_mode(this, mode); |
644 | 646 |
645 FunctionState function_state(this, scope, isolate()); // Enters 'scope'. | 647 bool is_generator = false; |
| 648 // Enters 'scope'. |
| 649 FunctionState function_state(this, scope, is_generator, isolate()); |
| 650 |
646 top_scope_->SetLanguageMode(info->language_mode()); | 651 top_scope_->SetLanguageMode(info->language_mode()); |
647 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); | 652 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
648 bool ok = true; | 653 bool ok = true; |
649 int beg_loc = scanner().location().beg_pos; | 654 int beg_loc = scanner().location().beg_pos; |
650 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); | 655 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); |
651 if (ok && !top_scope_->is_classic_mode()) { | 656 if (ok && !top_scope_->is_classic_mode()) { |
652 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); | 657 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); |
653 } | 658 } |
654 | 659 |
655 if (ok && is_extended_mode()) { | 660 if (ok && is_extended_mode()) { |
(...skipping 17 matching lines...) Expand all Loading... |
673 body, | 678 body, |
674 function_state.materialized_literal_count(), | 679 function_state.materialized_literal_count(), |
675 function_state.expected_property_count(), | 680 function_state.expected_property_count(), |
676 function_state.handler_count(), | 681 function_state.handler_count(), |
677 function_state.only_simple_this_property_assignments(), | 682 function_state.only_simple_this_property_assignments(), |
678 function_state.this_property_assignments(), | 683 function_state.this_property_assignments(), |
679 0, | 684 0, |
680 FunctionLiteral::kNoDuplicateParameters, | 685 FunctionLiteral::kNoDuplicateParameters, |
681 FunctionLiteral::ANONYMOUS_EXPRESSION, | 686 FunctionLiteral::ANONYMOUS_EXPRESSION, |
682 FunctionLiteral::kGlobalOrEval, | 687 FunctionLiteral::kGlobalOrEval, |
683 FunctionLiteral::kNotParenthesized); | 688 FunctionLiteral::kNotParenthesized, |
| 689 FunctionLiteral::kNotGenerator); |
684 result->set_ast_properties(factory()->visitor()->ast_properties()); | 690 result->set_ast_properties(factory()->visitor()->ast_properties()); |
685 } else if (stack_overflow_) { | 691 } else if (stack_overflow_) { |
686 isolate()->StackOverflow(); | 692 isolate()->StackOverflow(); |
687 } | 693 } |
688 } | 694 } |
689 | 695 |
690 // Make sure the target stack is empty. | 696 // Make sure the target stack is empty. |
691 ASSERT(target_stack_ == NULL); | 697 ASSERT(target_stack_ == NULL); |
692 | 698 |
693 // If there was a syntax error we have to get rid of the AST | 699 // If there was a syntax error we have to get rid of the AST |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 FunctionLiteral* result = NULL; | 753 FunctionLiteral* result = NULL; |
748 | 754 |
749 { | 755 { |
750 // Parse the function literal. | 756 // Parse the function literal. |
751 Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); | 757 Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); |
752 info()->SetGlobalScope(scope); | 758 info()->SetGlobalScope(scope); |
753 if (!info()->closure().is_null()) { | 759 if (!info()->closure().is_null()) { |
754 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, | 760 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, |
755 zone()); | 761 zone()); |
756 } | 762 } |
757 FunctionState function_state(this, scope, isolate()); | 763 bool is_generator = false; // Top scope is not a generator. |
| 764 FunctionState function_state(this, scope, is_generator, isolate()); |
758 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_classic_mode()); | 765 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_classic_mode()); |
759 ASSERT(scope->language_mode() != EXTENDED_MODE || | 766 ASSERT(scope->language_mode() != EXTENDED_MODE || |
760 info()->is_extended_mode()); | 767 info()->is_extended_mode()); |
761 ASSERT(info()->language_mode() == shared_info->language_mode()); | 768 ASSERT(info()->language_mode() == shared_info->language_mode()); |
762 scope->SetLanguageMode(shared_info->language_mode()); | 769 scope->SetLanguageMode(shared_info->language_mode()); |
763 FunctionLiteral::Type type = shared_info->is_expression() | 770 FunctionLiteral::Type type = shared_info->is_expression() |
764 ? (shared_info->is_anonymous() | 771 ? (shared_info->is_anonymous() |
765 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 772 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
766 : FunctionLiteral::NAMED_EXPRESSION) | 773 : FunctionLiteral::NAMED_EXPRESSION) |
767 : FunctionLiteral::DECLARATION; | 774 : FunctionLiteral::DECLARATION; |
768 bool ok = true; | 775 bool ok = true; |
769 result = ParseFunctionLiteral(name, | 776 result = ParseFunctionLiteral(name, |
770 false, // Strict mode name already checked. | 777 false, // Strict mode name already checked. |
| 778 shared_info->is_generator(), |
771 RelocInfo::kNoPosition, | 779 RelocInfo::kNoPosition, |
772 type, | 780 type, |
773 &ok); | 781 &ok); |
774 // Make sure the results agree. | 782 // Make sure the results agree. |
775 ASSERT(ok == (result != NULL)); | 783 ASSERT(ok == (result != NULL)); |
776 } | 784 } |
777 | 785 |
778 // Make sure the target stack is empty. | 786 // Make sure the target stack is empty. |
779 ASSERT(target_stack_ == NULL); | 787 ASSERT(target_stack_ == NULL); |
780 | 788 |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1125 // Statement | 1133 // Statement |
1126 // FunctionDeclaration | 1134 // FunctionDeclaration |
1127 // | 1135 // |
1128 // In harmony mode we allow additionally the following productions | 1136 // In harmony mode we allow additionally the following productions |
1129 // ModuleElement: | 1137 // ModuleElement: |
1130 // LetDeclaration | 1138 // LetDeclaration |
1131 // ConstDeclaration | 1139 // ConstDeclaration |
1132 // ModuleDeclaration | 1140 // ModuleDeclaration |
1133 // ImportDeclaration | 1141 // ImportDeclaration |
1134 // ExportDeclaration | 1142 // ExportDeclaration |
| 1143 // GeneratorDeclaration |
1135 | 1144 |
1136 switch (peek()) { | 1145 switch (peek()) { |
1137 case Token::FUNCTION: | 1146 case Token::FUNCTION: |
1138 return ParseFunctionDeclaration(NULL, ok); | 1147 return ParseFunctionDeclaration(NULL, ok); |
1139 case Token::LET: | 1148 case Token::LET: |
1140 case Token::CONST: | 1149 case Token::CONST: |
1141 return ParseVariableStatement(kModuleElement, NULL, ok); | 1150 return ParseVariableStatement(kModuleElement, NULL, ok); |
1142 case Token::IMPORT: | 1151 case Token::IMPORT: |
1143 return ParseImportDeclaration(ok); | 1152 return ParseImportDeclaration(ok); |
1144 case Token::EXPORT: | 1153 case Token::EXPORT: |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1423 | 1432 |
1424 return block; | 1433 return block; |
1425 } | 1434 } |
1426 | 1435 |
1427 | 1436 |
1428 Statement* Parser::ParseExportDeclaration(bool* ok) { | 1437 Statement* Parser::ParseExportDeclaration(bool* ok) { |
1429 // ExportDeclaration: | 1438 // ExportDeclaration: |
1430 // 'export' Identifier (',' Identifier)* ';' | 1439 // 'export' Identifier (',' Identifier)* ';' |
1431 // 'export' VariableDeclaration | 1440 // 'export' VariableDeclaration |
1432 // 'export' FunctionDeclaration | 1441 // 'export' FunctionDeclaration |
| 1442 // 'export' GeneratorDeclaration |
1433 // 'export' ModuleDeclaration | 1443 // 'export' ModuleDeclaration |
1434 // | 1444 // |
1435 // TODO(ES6): implement structuring ExportSpecifiers | 1445 // TODO(ES6): implement structuring ExportSpecifiers |
1436 | 1446 |
1437 Expect(Token::EXPORT, CHECK_OK); | 1447 Expect(Token::EXPORT, CHECK_OK); |
1438 | 1448 |
1439 Statement* result = NULL; | 1449 Statement* result = NULL; |
1440 ZoneStringList names(1, zone()); | 1450 ZoneStringList names(1, zone()); |
1441 switch (peek()) { | 1451 switch (peek()) { |
1442 case Token::IDENTIFIER: { | 1452 case Token::IDENTIFIER: { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1502 bool* ok) { | 1512 bool* ok) { |
1503 // (Ecma 262 5th Edition, clause 14): | 1513 // (Ecma 262 5th Edition, clause 14): |
1504 // SourceElement: | 1514 // SourceElement: |
1505 // Statement | 1515 // Statement |
1506 // FunctionDeclaration | 1516 // FunctionDeclaration |
1507 // | 1517 // |
1508 // In harmony mode we allow additionally the following productions | 1518 // In harmony mode we allow additionally the following productions |
1509 // BlockElement (aka SourceElement): | 1519 // BlockElement (aka SourceElement): |
1510 // LetDeclaration | 1520 // LetDeclaration |
1511 // ConstDeclaration | 1521 // ConstDeclaration |
| 1522 // GeneratorDeclaration |
1512 | 1523 |
1513 switch (peek()) { | 1524 switch (peek()) { |
1514 case Token::FUNCTION: | 1525 case Token::FUNCTION: |
1515 return ParseFunctionDeclaration(NULL, ok); | 1526 return ParseFunctionDeclaration(NULL, ok); |
1516 case Token::LET: | 1527 case Token::LET: |
1517 case Token::CONST: | 1528 case Token::CONST: |
1518 return ParseVariableStatement(kModuleElement, NULL, ok); | 1529 return ParseVariableStatement(kModuleElement, NULL, ok); |
1519 default: | 1530 default: |
1520 return ParseStatement(labels, ok); | 1531 return ParseStatement(labels, ok); |
1521 } | 1532 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1621 } | 1632 } |
1622 | 1633 |
1623 case Token::FUNCTION: { | 1634 case Token::FUNCTION: { |
1624 // FunctionDeclaration is only allowed in the context of SourceElements | 1635 // FunctionDeclaration is only allowed in the context of SourceElements |
1625 // (Ecma 262 5th Edition, clause 14): | 1636 // (Ecma 262 5th Edition, clause 14): |
1626 // SourceElement: | 1637 // SourceElement: |
1627 // Statement | 1638 // Statement |
1628 // FunctionDeclaration | 1639 // FunctionDeclaration |
1629 // Common language extension is to allow function declaration in place | 1640 // Common language extension is to allow function declaration in place |
1630 // of any statement. This language extension is disabled in strict mode. | 1641 // of any statement. This language extension is disabled in strict mode. |
| 1642 // |
| 1643 // In Harmony mode, this case also handles the extension: |
| 1644 // Statement: |
| 1645 // GeneratorDeclaration |
1631 if (!top_scope_->is_classic_mode()) { | 1646 if (!top_scope_->is_classic_mode()) { |
1632 ReportMessageAt(scanner().peek_location(), "strict_function", | 1647 ReportMessageAt(scanner().peek_location(), "strict_function", |
1633 Vector<const char*>::empty()); | 1648 Vector<const char*>::empty()); |
1634 *ok = false; | 1649 *ok = false; |
1635 return NULL; | 1650 return NULL; |
1636 } | 1651 } |
1637 return ParseFunctionDeclaration(NULL, ok); | 1652 return ParseFunctionDeclaration(NULL, ok); |
1638 } | 1653 } |
1639 | 1654 |
1640 case Token::DEBUGGER: | 1655 case Token::DEBUGGER: |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1883 factory()->NewSharedFunctionInfoLiteral(shared); | 1898 factory()->NewSharedFunctionInfoLiteral(shared); |
1884 return factory()->NewExpressionStatement( | 1899 return factory()->NewExpressionStatement( |
1885 factory()->NewAssignment( | 1900 factory()->NewAssignment( |
1886 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition)); | 1901 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition)); |
1887 } | 1902 } |
1888 | 1903 |
1889 | 1904 |
1890 Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) { | 1905 Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) { |
1891 // FunctionDeclaration :: | 1906 // FunctionDeclaration :: |
1892 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' | 1907 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' |
| 1908 // GeneratorDeclaration :: |
| 1909 // 'function' '*' Identifier '(' FormalParameterListopt ')' |
| 1910 // '{' FunctionBody '}' |
1893 Expect(Token::FUNCTION, CHECK_OK); | 1911 Expect(Token::FUNCTION, CHECK_OK); |
1894 int function_token_position = scanner().location().beg_pos; | 1912 int function_token_position = scanner().location().beg_pos; |
| 1913 bool is_generator = FLAG_harmony_generators && Check(Token::MUL); |
1895 bool is_strict_reserved = false; | 1914 bool is_strict_reserved = false; |
1896 Handle<String> name = ParseIdentifierOrStrictReservedWord( | 1915 Handle<String> name = ParseIdentifierOrStrictReservedWord( |
1897 &is_strict_reserved, CHECK_OK); | 1916 &is_strict_reserved, CHECK_OK); |
1898 FunctionLiteral* fun = ParseFunctionLiteral(name, | 1917 FunctionLiteral* fun = ParseFunctionLiteral(name, |
1899 is_strict_reserved, | 1918 is_strict_reserved, |
| 1919 is_generator, |
1900 function_token_position, | 1920 function_token_position, |
1901 FunctionLiteral::DECLARATION, | 1921 FunctionLiteral::DECLARATION, |
1902 CHECK_OK); | 1922 CHECK_OK); |
1903 // Even if we're not at the top-level of the global or a function | 1923 // Even if we're not at the top-level of the global or a function |
1904 // scope, we treat it as such and introduce the function with its | 1924 // scope, we treat it as such and introduce the function with its |
1905 // initial value upon entering the corresponding scope. | 1925 // initial value upon entering the corresponding scope. |
1906 // In extended mode, a function behaves as a lexical binding, except in the | 1926 // In extended mode, a function behaves as a lexical binding, except in the |
1907 // global scope. | 1927 // global scope. |
1908 VariableMode mode = | 1928 VariableMode mode = |
1909 is_extended_mode() && !top_scope_->is_global_scope() ? LET : VAR; | 1929 is_extended_mode() && !top_scope_->is_global_scope() ? LET : VAR; |
(...skipping 1087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2997 factory()->NewBinaryOperation(Token::COMMA, result, right, position); | 3017 factory()->NewBinaryOperation(Token::COMMA, result, right, position); |
2998 } | 3018 } |
2999 return result; | 3019 return result; |
3000 } | 3020 } |
3001 | 3021 |
3002 | 3022 |
3003 // Precedence = 2 | 3023 // Precedence = 2 |
3004 Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { | 3024 Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { |
3005 // AssignmentExpression :: | 3025 // AssignmentExpression :: |
3006 // ConditionalExpression | 3026 // ConditionalExpression |
| 3027 // YieldExpression |
3007 // LeftHandSideExpression AssignmentOperator AssignmentExpression | 3028 // LeftHandSideExpression AssignmentOperator AssignmentExpression |
3008 | 3029 |
| 3030 if (peek() == Token::YIELD && is_generator()) { |
| 3031 return ParseYieldExpression(ok); |
| 3032 } |
| 3033 |
3009 if (fni_ != NULL) fni_->Enter(); | 3034 if (fni_ != NULL) fni_->Enter(); |
3010 Expression* expression = ParseConditionalExpression(accept_IN, CHECK_OK); | 3035 Expression* expression = ParseConditionalExpression(accept_IN, CHECK_OK); |
3011 | 3036 |
3012 if (!Token::IsAssignmentOp(peek())) { | 3037 if (!Token::IsAssignmentOp(peek())) { |
3013 if (fni_ != NULL) fni_->Leave(); | 3038 if (fni_ != NULL) fni_->Leave(); |
3014 // Parsed conditional expression only (no assignment). | 3039 // Parsed conditional expression only (no assignment). |
3015 return expression; | 3040 return expression; |
3016 } | 3041 } |
3017 | 3042 |
3018 // Signal a reference error if the expression is an invalid left-hand | 3043 // Signal a reference error if the expression is an invalid left-hand |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3067 } else { | 3092 } else { |
3068 fni_->RemoveLastFunction(); | 3093 fni_->RemoveLastFunction(); |
3069 } | 3094 } |
3070 fni_->Leave(); | 3095 fni_->Leave(); |
3071 } | 3096 } |
3072 | 3097 |
3073 return factory()->NewAssignment(op, expression, right, pos); | 3098 return factory()->NewAssignment(op, expression, right, pos); |
3074 } | 3099 } |
3075 | 3100 |
3076 | 3101 |
| 3102 Expression* Parser::ParseYieldExpression(bool* ok) { |
| 3103 // YieldExpression :: |
| 3104 // 'yield' '*'? AssignmentExpression |
| 3105 int position = scanner().peek_location().beg_pos; |
| 3106 Expect(Token::YIELD, CHECK_OK); |
| 3107 bool is_yield_star = Check(Token::MUL); |
| 3108 Expression* expression = ParseAssignmentExpression(false, CHECK_OK); |
| 3109 return factory()->NewYield(expression, is_yield_star, position); |
| 3110 } |
| 3111 |
| 3112 |
3077 // Precedence = 3 | 3113 // Precedence = 3 |
3078 Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) { | 3114 Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) { |
3079 // ConditionalExpression :: | 3115 // ConditionalExpression :: |
3080 // LogicalOrExpression | 3116 // LogicalOrExpression |
3081 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression | 3117 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression |
3082 | 3118 |
3083 // We start using the binary expression parser for prec >= 4 only! | 3119 // We start using the binary expression parser for prec >= 4 only! |
3084 Expression* expression = ParseBinaryExpression(4, accept_IN, CHECK_OK); | 3120 Expression* expression = ParseBinaryExpression(4, accept_IN, CHECK_OK); |
3085 if (peek() != Token::CONDITIONAL) return expression; | 3121 if (peek() != Token::CONDITIONAL) return expression; |
3086 Consume(Token::CONDITIONAL); | 3122 Consume(Token::CONDITIONAL); |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3443 bool* ok) { | 3479 bool* ok) { |
3444 // MemberExpression :: | 3480 // MemberExpression :: |
3445 // (PrimaryExpression | FunctionLiteral) | 3481 // (PrimaryExpression | FunctionLiteral) |
3446 // ('[' Expression ']' | '.' Identifier | Arguments)* | 3482 // ('[' Expression ']' | '.' Identifier | Arguments)* |
3447 | 3483 |
3448 // Parse the initial primary or function expression. | 3484 // Parse the initial primary or function expression. |
3449 Expression* result = NULL; | 3485 Expression* result = NULL; |
3450 if (peek() == Token::FUNCTION) { | 3486 if (peek() == Token::FUNCTION) { |
3451 Expect(Token::FUNCTION, CHECK_OK); | 3487 Expect(Token::FUNCTION, CHECK_OK); |
3452 int function_token_position = scanner().location().beg_pos; | 3488 int function_token_position = scanner().location().beg_pos; |
| 3489 bool is_generator = FLAG_harmony_generators && Check(Token::MUL); |
3453 Handle<String> name; | 3490 Handle<String> name; |
3454 bool is_strict_reserved_name = false; | 3491 bool is_strict_reserved_name = false; |
3455 if (peek_any_identifier()) { | 3492 if (peek_any_identifier()) { |
3456 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, | 3493 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, |
3457 CHECK_OK); | 3494 CHECK_OK); |
3458 } | 3495 } |
3459 FunctionLiteral::Type type = name.is_null() | 3496 FunctionLiteral::Type type = name.is_null() |
3460 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 3497 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
3461 : FunctionLiteral::NAMED_EXPRESSION; | 3498 : FunctionLiteral::NAMED_EXPRESSION; |
3462 result = ParseFunctionLiteral(name, | 3499 result = ParseFunctionLiteral(name, |
3463 is_strict_reserved_name, | 3500 is_strict_reserved_name, |
| 3501 is_generator, |
3464 function_token_position, | 3502 function_token_position, |
3465 type, | 3503 type, |
3466 CHECK_OK); | 3504 CHECK_OK); |
3467 } else { | 3505 } else { |
3468 result = ParsePrimaryExpression(CHECK_OK); | 3506 result = ParsePrimaryExpression(CHECK_OK); |
3469 } | 3507 } |
3470 | 3508 |
3471 while (true) { | 3509 while (true) { |
3472 switch (peek()) { | 3510 switch (peek()) { |
3473 case Token::LBRACK: { | 3511 case Token::LBRACK: { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3597 Consume(Token::TRUE_LITERAL); | 3635 Consume(Token::TRUE_LITERAL); |
3598 result = factory()->NewLiteral(isolate()->factory()->true_value()); | 3636 result = factory()->NewLiteral(isolate()->factory()->true_value()); |
3599 break; | 3637 break; |
3600 | 3638 |
3601 case Token::FALSE_LITERAL: | 3639 case Token::FALSE_LITERAL: |
3602 Consume(Token::FALSE_LITERAL); | 3640 Consume(Token::FALSE_LITERAL); |
3603 result = factory()->NewLiteral(isolate()->factory()->false_value()); | 3641 result = factory()->NewLiteral(isolate()->factory()->false_value()); |
3604 break; | 3642 break; |
3605 | 3643 |
3606 case Token::IDENTIFIER: | 3644 case Token::IDENTIFIER: |
| 3645 case Token::YIELD: |
3607 case Token::FUTURE_STRICT_RESERVED_WORD: { | 3646 case Token::FUTURE_STRICT_RESERVED_WORD: { |
3608 Handle<String> name = ParseIdentifier(CHECK_OK); | 3647 Handle<String> name = ParseIdentifier(CHECK_OK); |
3609 if (fni_ != NULL) fni_->PushVariableName(name); | 3648 if (fni_ != NULL) fni_->PushVariableName(name); |
3610 // The name may refer to a module instance object, so its type is unknown. | 3649 // The name may refer to a module instance object, so its type is unknown. |
3611 #ifdef DEBUG | 3650 #ifdef DEBUG |
3612 if (FLAG_print_interface_details) | 3651 if (FLAG_print_interface_details) |
3613 PrintF("# Variable %s ", name->ToAsciiArray()); | 3652 PrintF("# Variable %s ", name->ToAsciiArray()); |
3614 #endif | 3653 #endif |
3615 Interface* interface = Interface::NewUnknown(zone()); | 3654 Interface* interface = Interface::NewUnknown(zone()); |
3616 result = top_scope_->NewUnresolved( | 3655 result = top_scope_->NewUnresolved( |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4002 next == Token::STRING || is_keyword) { | 4041 next == Token::STRING || is_keyword) { |
4003 Handle<String> name; | 4042 Handle<String> name; |
4004 if (is_keyword) { | 4043 if (is_keyword) { |
4005 name = isolate_->factory()->InternalizeUtf8String(Token::String(next)); | 4044 name = isolate_->factory()->InternalizeUtf8String(Token::String(next)); |
4006 } else { | 4045 } else { |
4007 name = GetSymbol(CHECK_OK); | 4046 name = GetSymbol(CHECK_OK); |
4008 } | 4047 } |
4009 FunctionLiteral* value = | 4048 FunctionLiteral* value = |
4010 ParseFunctionLiteral(name, | 4049 ParseFunctionLiteral(name, |
4011 false, // reserved words are allowed here | 4050 false, // reserved words are allowed here |
| 4051 false, // not a generator |
4012 RelocInfo::kNoPosition, | 4052 RelocInfo::kNoPosition, |
4013 FunctionLiteral::ANONYMOUS_EXPRESSION, | 4053 FunctionLiteral::ANONYMOUS_EXPRESSION, |
4014 CHECK_OK); | 4054 CHECK_OK); |
4015 // Allow any number of parameters for compatibilty with JSC. | 4055 // Allow any number of parameters for compatibilty with JSC. |
4016 // Specification only allows zero parameters for get and one for set. | 4056 // Specification only allows zero parameters for get and one for set. |
4017 return factory()->NewObjectLiteralProperty(is_getter, value); | 4057 return factory()->NewObjectLiteralProperty(is_getter, value); |
4018 } else { | 4058 } else { |
4019 ReportUnexpectedToken(next); | 4059 ReportUnexpectedToken(next); |
4020 *ok = false; | 4060 *ok = false; |
4021 return NULL; | 4061 return NULL; |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4303 int properties_; | 4343 int properties_; |
4304 LanguageMode mode_; | 4344 LanguageMode mode_; |
4305 // For error messages. | 4345 // For error messages. |
4306 const char* message_; | 4346 const char* message_; |
4307 const char* argument_opt_; | 4347 const char* argument_opt_; |
4308 }; | 4348 }; |
4309 | 4349 |
4310 | 4350 |
4311 FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name, | 4351 FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name, |
4312 bool name_is_strict_reserved, | 4352 bool name_is_strict_reserved, |
| 4353 bool is_generator, |
4313 int function_token_position, | 4354 int function_token_position, |
4314 FunctionLiteral::Type type, | 4355 FunctionLiteral::Type type, |
4315 bool* ok) { | 4356 bool* ok) { |
4316 // Function :: | 4357 // Function :: |
4317 // '(' FormalParameterList? ')' '{' FunctionBody '}' | 4358 // '(' FormalParameterList? ')' '{' FunctionBody '}' |
4318 | 4359 |
4319 // Anonymous functions were passed either the empty symbol or a null | 4360 // Anonymous functions were passed either the empty symbol or a null |
4320 // handle as the function name. Remember if we were passed a non-empty | 4361 // handle as the function name. Remember if we were passed a non-empty |
4321 // handle to decide whether to invoke function name inference. | 4362 // handle to decide whether to invoke function name inference. |
4322 bool should_infer_name = function_name.is_null(); | 4363 bool should_infer_name = function_name.is_null(); |
(...skipping 14 matching lines...) Expand all Loading... |
4337 int materialized_literal_count = -1; | 4378 int materialized_literal_count = -1; |
4338 int expected_property_count = -1; | 4379 int expected_property_count = -1; |
4339 int handler_count = 0; | 4380 int handler_count = 0; |
4340 bool only_simple_this_property_assignments; | 4381 bool only_simple_this_property_assignments; |
4341 Handle<FixedArray> this_property_assignments; | 4382 Handle<FixedArray> this_property_assignments; |
4342 FunctionLiteral::ParameterFlag duplicate_parameters = | 4383 FunctionLiteral::ParameterFlag duplicate_parameters = |
4343 FunctionLiteral::kNoDuplicateParameters; | 4384 FunctionLiteral::kNoDuplicateParameters; |
4344 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ | 4385 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ |
4345 ? FunctionLiteral::kIsParenthesized | 4386 ? FunctionLiteral::kIsParenthesized |
4346 : FunctionLiteral::kNotParenthesized; | 4387 : FunctionLiteral::kNotParenthesized; |
| 4388 FunctionLiteral::IsGeneratorFlag generator = is_generator |
| 4389 ? FunctionLiteral::kIsGenerator |
| 4390 : FunctionLiteral::kNotGenerator; |
4347 AstProperties ast_properties; | 4391 AstProperties ast_properties; |
4348 // Parse function body. | 4392 // Parse function body. |
4349 { FunctionState function_state(this, scope, isolate()); | 4393 { FunctionState function_state(this, scope, is_generator, isolate()); |
4350 top_scope_->SetScopeName(function_name); | 4394 top_scope_->SetScopeName(function_name); |
4351 | 4395 |
4352 // FormalParameterList :: | 4396 // FormalParameterList :: |
4353 // '(' (Identifier)*[','] ')' | 4397 // '(' (Identifier)*[','] ')' |
4354 Expect(Token::LPAREN, CHECK_OK); | 4398 Expect(Token::LPAREN, CHECK_OK); |
4355 scope->set_start_position(scanner().location().beg_pos); | 4399 scope->set_start_position(scanner().location().beg_pos); |
4356 Scanner::Location name_loc = Scanner::Location::invalid(); | 4400 Scanner::Location name_loc = Scanner::Location::invalid(); |
4357 Scanner::Location dupe_loc = Scanner::Location::invalid(); | 4401 Scanner::Location dupe_loc = Scanner::Location::invalid(); |
4358 Scanner::Location reserved_loc = Scanner::Location::invalid(); | 4402 Scanner::Location reserved_loc = Scanner::Location::invalid(); |
4359 | 4403 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4577 body, | 4621 body, |
4578 materialized_literal_count, | 4622 materialized_literal_count, |
4579 expected_property_count, | 4623 expected_property_count, |
4580 handler_count, | 4624 handler_count, |
4581 only_simple_this_property_assignments, | 4625 only_simple_this_property_assignments, |
4582 this_property_assignments, | 4626 this_property_assignments, |
4583 num_parameters, | 4627 num_parameters, |
4584 duplicate_parameters, | 4628 duplicate_parameters, |
4585 type, | 4629 type, |
4586 FunctionLiteral::kIsFunction, | 4630 FunctionLiteral::kIsFunction, |
4587 parenthesized); | 4631 parenthesized, |
| 4632 generator); |
4588 function_literal->set_function_token_position(function_token_position); | 4633 function_literal->set_function_token_position(function_token_position); |
4589 function_literal->set_ast_properties(&ast_properties); | 4634 function_literal->set_ast_properties(&ast_properties); |
4590 | 4635 |
4591 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); | 4636 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); |
4592 return function_literal; | 4637 return function_literal; |
4593 } | 4638 } |
4594 | 4639 |
4595 | 4640 |
4596 preparser::PreParser::PreParseResult Parser::LazyParseFunctionLiteral( | 4641 preparser::PreParser::PreParseResult Parser::LazyParseFunctionLiteral( |
4597 SingletonLogger* logger) { | 4642 SingletonLogger* logger) { |
4598 HistogramTimerScope preparse_scope(isolate()->counters()->pre_parse()); | 4643 HistogramTimerScope preparse_scope(isolate()->counters()->pre_parse()); |
4599 ASSERT_EQ(Token::LBRACE, scanner().current_token()); | 4644 ASSERT_EQ(Token::LBRACE, scanner().current_token()); |
4600 | 4645 |
4601 if (reusable_preparser_ == NULL) { | 4646 if (reusable_preparser_ == NULL) { |
4602 intptr_t stack_limit = isolate()->stack_guard()->real_climit(); | 4647 intptr_t stack_limit = isolate()->stack_guard()->real_climit(); |
4603 bool do_allow_lazy = true; | 4648 bool do_allow_lazy = true; |
4604 reusable_preparser_ = new preparser::PreParser(&scanner_, | 4649 reusable_preparser_ = new preparser::PreParser(&scanner_, |
4605 NULL, | 4650 NULL, |
4606 stack_limit, | 4651 stack_limit, |
4607 do_allow_lazy, | 4652 do_allow_lazy, |
4608 allow_natives_syntax_, | 4653 allow_natives_syntax_, |
4609 allow_modules_); | 4654 allow_modules_, |
| 4655 FLAG_harmony_generators); |
4610 } | 4656 } |
4611 preparser::PreParser::PreParseResult result = | 4657 preparser::PreParser::PreParseResult result = |
4612 reusable_preparser_->PreParseLazyFunction(top_scope_->language_mode(), | 4658 reusable_preparser_->PreParseLazyFunction(top_scope_->language_mode(), |
| 4659 is_generator(), |
4613 logger); | 4660 logger); |
4614 return result; | 4661 return result; |
4615 } | 4662 } |
4616 | 4663 |
4617 | 4664 |
4618 Expression* Parser::ParseV8Intrinsic(bool* ok) { | 4665 Expression* Parser::ParseV8Intrinsic(bool* ok) { |
4619 // CallRuntime :: | 4666 // CallRuntime :: |
4620 // '%' Identifier Arguments | 4667 // '%' Identifier Arguments |
4621 | 4668 |
4622 Expect(Token::MOD, CHECK_OK); | 4669 Expect(Token::MOD, CHECK_OK); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4665 | 4712 |
4666 // We have a valid intrinsics call or a call to a builtin. | 4713 // We have a valid intrinsics call or a call to a builtin. |
4667 return factory()->NewCallRuntime(name, function, args); | 4714 return factory()->NewCallRuntime(name, function, args); |
4668 } | 4715 } |
4669 | 4716 |
4670 | 4717 |
4671 bool Parser::peek_any_identifier() { | 4718 bool Parser::peek_any_identifier() { |
4672 Token::Value next = peek(); | 4719 Token::Value next = peek(); |
4673 return next == Token::IDENTIFIER || | 4720 return next == Token::IDENTIFIER || |
4674 next == Token::FUTURE_RESERVED_WORD || | 4721 next == Token::FUTURE_RESERVED_WORD || |
4675 next == Token::FUTURE_STRICT_RESERVED_WORD; | 4722 next == Token::FUTURE_STRICT_RESERVED_WORD || |
| 4723 next == Token::YIELD; |
4676 } | 4724 } |
4677 | 4725 |
4678 | 4726 |
4679 void Parser::Consume(Token::Value token) { | 4727 void Parser::Consume(Token::Value token) { |
4680 Token::Value next = Next(); | 4728 Token::Value next = Next(); |
4681 USE(next); | 4729 USE(next); |
4682 USE(token); | 4730 USE(token); |
4683 ASSERT(next == token); | 4731 ASSERT(next == token); |
4684 } | 4732 } |
4685 | 4733 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4737 | 4785 |
4738 | 4786 |
4739 Literal* Parser::GetLiteralTheHole() { | 4787 Literal* Parser::GetLiteralTheHole() { |
4740 return factory()->NewLiteral(isolate()->factory()->the_hole_value()); | 4788 return factory()->NewLiteral(isolate()->factory()->the_hole_value()); |
4741 } | 4789 } |
4742 | 4790 |
4743 | 4791 |
4744 // Parses an identifier that is valid for the current scope, in particular it | 4792 // Parses an identifier that is valid for the current scope, in particular it |
4745 // fails on strict mode future reserved keywords in a strict scope. | 4793 // fails on strict mode future reserved keywords in a strict scope. |
4746 Handle<String> Parser::ParseIdentifier(bool* ok) { | 4794 Handle<String> Parser::ParseIdentifier(bool* ok) { |
4747 if (!top_scope_->is_classic_mode()) { | 4795 Token::Value next = Next(); |
4748 Expect(Token::IDENTIFIER, ok); | 4796 if (next == Token::IDENTIFIER || |
4749 } else if (!Check(Token::IDENTIFIER)) { | 4797 (top_scope_->is_classic_mode() && |
4750 Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); | 4798 (next == Token::FUTURE_STRICT_RESERVED_WORD || |
| 4799 (next == Token::YIELD && !is_generator())))) { |
| 4800 return GetSymbol(ok); |
| 4801 } else { |
| 4802 ReportUnexpectedToken(next); |
| 4803 *ok = false; |
| 4804 return Handle<String>(); |
4751 } | 4805 } |
4752 if (!*ok) return Handle<String>(); | |
4753 return GetSymbol(ok); | |
4754 } | 4806 } |
4755 | 4807 |
4756 | 4808 |
4757 // Parses and identifier or a strict mode future reserved word, and indicate | 4809 // Parses and identifier or a strict mode future reserved word, and indicate |
4758 // whether it is strict mode future reserved. | 4810 // whether it is strict mode future reserved. |
4759 Handle<String> Parser::ParseIdentifierOrStrictReservedWord( | 4811 Handle<String> Parser::ParseIdentifierOrStrictReservedWord( |
4760 bool* is_strict_reserved, bool* ok) { | 4812 bool* is_strict_reserved, bool* ok) { |
4761 *is_strict_reserved = false; | 4813 Token::Value next = Next(); |
4762 if (!Check(Token::IDENTIFIER)) { | 4814 if (next == Token::IDENTIFIER) { |
4763 Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); | 4815 *is_strict_reserved = false; |
| 4816 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || |
| 4817 (next == Token::YIELD && !is_generator())) { |
4764 *is_strict_reserved = true; | 4818 *is_strict_reserved = true; |
| 4819 } else { |
| 4820 ReportUnexpectedToken(next); |
| 4821 *ok = false; |
| 4822 return Handle<String>(); |
4765 } | 4823 } |
4766 if (!*ok) return Handle<String>(); | |
4767 return GetSymbol(ok); | 4824 return GetSymbol(ok); |
4768 } | 4825 } |
4769 | 4826 |
4770 | 4827 |
4771 Handle<String> Parser::ParseIdentifierName(bool* ok) { | 4828 Handle<String> Parser::ParseIdentifierName(bool* ok) { |
4772 Token::Value next = Next(); | 4829 Token::Value next = Next(); |
4773 if (next != Token::IDENTIFIER && | 4830 if (next != Token::IDENTIFIER && |
4774 next != Token::FUTURE_RESERVED_WORD && | 4831 next != Token::FUTURE_RESERVED_WORD && |
4775 next != Token::FUTURE_STRICT_RESERVED_WORD && | 4832 next != Token::FUTURE_STRICT_RESERVED_WORD && |
4776 !Token::IsKeyword(next)) { | 4833 !Token::IsKeyword(next)) { |
(...skipping 1091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5868 } | 5925 } |
5869 | 5926 |
5870 | 5927 |
5871 ScriptDataImpl* ParserApi::PreParse(Utf16CharacterStream* source, | 5928 ScriptDataImpl* ParserApi::PreParse(Utf16CharacterStream* source, |
5872 v8::Extension* extension, | 5929 v8::Extension* extension, |
5873 int flags) { | 5930 int flags) { |
5874 Handle<Script> no_script; | 5931 Handle<Script> no_script; |
5875 if (FLAG_lazy && (extension == NULL)) { | 5932 if (FLAG_lazy && (extension == NULL)) { |
5876 flags |= kAllowLazy; | 5933 flags |= kAllowLazy; |
5877 } | 5934 } |
| 5935 if (FLAG_harmony_generators) { |
| 5936 flags |= kAllowGenerators; |
| 5937 } |
5878 CompleteParserRecorder recorder; | 5938 CompleteParserRecorder recorder; |
5879 return DoPreParse(source, flags, &recorder); | 5939 return DoPreParse(source, flags, &recorder); |
5880 } | 5940 } |
5881 | 5941 |
5882 | 5942 |
5883 bool RegExpParser::ParseRegExp(FlatStringReader* input, | 5943 bool RegExpParser::ParseRegExp(FlatStringReader* input, |
5884 bool multiline, | 5944 bool multiline, |
5885 RegExpCompileData* result, | 5945 RegExpCompileData* result, |
5886 Zone* zone) { | 5946 Zone* zone) { |
5887 ASSERT(result != NULL); | 5947 ASSERT(result != NULL); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5942 ASSERT(info->isolate()->has_pending_exception()); | 6002 ASSERT(info->isolate()->has_pending_exception()); |
5943 } else { | 6003 } else { |
5944 result = parser.ParseProgram(); | 6004 result = parser.ParseProgram(); |
5945 } | 6005 } |
5946 } | 6006 } |
5947 info->SetFunction(result); | 6007 info->SetFunction(result); |
5948 return (result != NULL); | 6008 return (result != NULL); |
5949 } | 6009 } |
5950 | 6010 |
5951 } } // namespace v8::internal | 6011 } } // namespace v8::internal |
OLD | NEW |