| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 TemporaryScope* temp_scope_; | 147 TemporaryScope* temp_scope_; |
| 148 Mode mode_; | 148 Mode mode_; |
| 149 | 149 |
| 150 Target* target_stack_; // for break, continue statements | 150 Target* target_stack_; // for break, continue statements |
| 151 bool allow_natives_syntax_; | 151 bool allow_natives_syntax_; |
| 152 v8::Extension* extension_; | 152 v8::Extension* extension_; |
| 153 ParserFactory* factory_; | 153 ParserFactory* factory_; |
| 154 ParserLog* log_; | 154 ParserLog* log_; |
| 155 bool is_pre_parsing_; | 155 bool is_pre_parsing_; |
| 156 ScriptDataImpl* pre_data_; | 156 ScriptDataImpl* pre_data_; |
| 157 bool seen_loop_stmt_; // Used for inner loop detection. | |
| 158 FuncNameInferrer* fni_; | 157 FuncNameInferrer* fni_; |
| 159 | 158 |
| 160 bool inside_with() const { return with_nesting_level_ > 0; } | 159 bool inside_with() const { return with_nesting_level_ > 0; } |
| 161 ParserFactory* factory() const { return factory_; } | 160 ParserFactory* factory() const { return factory_; } |
| 162 ParserLog* log() const { return log_; } | 161 ParserLog* log() const { return log_; } |
| 163 Scanner& scanner() { return scanner_; } | 162 Scanner& scanner() { return scanner_; } |
| 164 Mode mode() const { return mode_; } | 163 Mode mode() const { return mode_; } |
| 165 ScriptDataImpl* pre_data() const { return pre_data_; } | 164 ScriptDataImpl* pre_data() const { return pre_data_; } |
| 166 | 165 |
| 167 // All ParseXXX functions take as the last argument an *ok parameter | 166 // All ParseXXX functions take as the last argument an *ok parameter |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 Expression* ParseMemberExpression(bool* ok); | 207 Expression* ParseMemberExpression(bool* ok); |
| 209 Expression* ParseNewPrefix(PositionStack* stack, bool* ok); | 208 Expression* ParseNewPrefix(PositionStack* stack, bool* ok); |
| 210 Expression* ParseMemberWithNewPrefixesExpression(PositionStack* stack, | 209 Expression* ParseMemberWithNewPrefixesExpression(PositionStack* stack, |
| 211 bool* ok); | 210 bool* ok); |
| 212 Expression* ParsePrimaryExpression(bool* ok); | 211 Expression* ParsePrimaryExpression(bool* ok); |
| 213 Expression* ParseArrayLiteral(bool* ok); | 212 Expression* ParseArrayLiteral(bool* ok); |
| 214 Expression* ParseObjectLiteral(bool* ok); | 213 Expression* ParseObjectLiteral(bool* ok); |
| 215 ObjectLiteral::Property* ParseObjectLiteralGetSet(bool is_getter, bool* ok); | 214 ObjectLiteral::Property* ParseObjectLiteralGetSet(bool is_getter, bool* ok); |
| 216 Expression* ParseRegExpLiteral(bool seen_equal, bool* ok); | 215 Expression* ParseRegExpLiteral(bool seen_equal, bool* ok); |
| 217 | 216 |
| 217 Expression* NewCompareNode(Token::Value op, Expression* x, Expression* y); |
| 218 |
| 218 // Populate the constant properties fixed array for a materialized object | 219 // Populate the constant properties fixed array for a materialized object |
| 219 // literal. | 220 // literal. |
| 220 void BuildObjectLiteralConstantProperties( | 221 void BuildObjectLiteralConstantProperties( |
| 221 ZoneList<ObjectLiteral::Property*>* properties, | 222 ZoneList<ObjectLiteral::Property*>* properties, |
| 222 Handle<FixedArray> constants, | 223 Handle<FixedArray> constants, |
| 223 bool* is_simple, | 224 bool* is_simple, |
| 224 bool* fast_elements, | 225 bool* fast_elements, |
| 225 int* depth); | 226 int* depth); |
| 226 | 227 |
| 227 // Populate the literals fixed array for a materialized array literal. | 228 // Populate the literals fixed array for a materialized array literal. |
| (...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1209 top_scope_(NULL), | 1210 top_scope_(NULL), |
| 1210 with_nesting_level_(0), | 1211 with_nesting_level_(0), |
| 1211 temp_scope_(NULL), | 1212 temp_scope_(NULL), |
| 1212 target_stack_(NULL), | 1213 target_stack_(NULL), |
| 1213 allow_natives_syntax_(allow_natives_syntax), | 1214 allow_natives_syntax_(allow_natives_syntax), |
| 1214 extension_(extension), | 1215 extension_(extension), |
| 1215 factory_(factory), | 1216 factory_(factory), |
| 1216 log_(log), | 1217 log_(log), |
| 1217 is_pre_parsing_(is_pre_parsing == PREPARSE), | 1218 is_pre_parsing_(is_pre_parsing == PREPARSE), |
| 1218 pre_data_(pre_data), | 1219 pre_data_(pre_data), |
| 1219 seen_loop_stmt_(false), | |
| 1220 fni_(NULL) { | 1220 fni_(NULL) { |
| 1221 } | 1221 } |
| 1222 | 1222 |
| 1223 | 1223 |
| 1224 bool Parser::PreParseProgram(Handle<String> source, | 1224 bool Parser::PreParseProgram(Handle<String> source, |
| 1225 unibrow::CharacterStream* stream) { | 1225 unibrow::CharacterStream* stream) { |
| 1226 HistogramTimerScope timer(&Counters::pre_parse); | 1226 HistogramTimerScope timer(&Counters::pre_parse); |
| 1227 AssertNoZoneAllocation assert_no_zone_allocation; | 1227 AssertNoZoneAllocation assert_no_zone_allocation; |
| 1228 AssertNoAllocation assert_no_allocation; | 1228 AssertNoAllocation assert_no_allocation; |
| 1229 NoHandleAllocation no_handle_allocation; | 1229 NoHandleAllocation no_handle_allocation; |
| (...skipping 1440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2670 if (cond != NULL) cond->set_is_loop_condition(true); | 2670 if (cond != NULL) cond->set_is_loop_condition(true); |
| 2671 Expect(Token::RPAREN, CHECK_OK); | 2671 Expect(Token::RPAREN, CHECK_OK); |
| 2672 | 2672 |
| 2673 // Allow do-statements to be terminated with and without | 2673 // Allow do-statements to be terminated with and without |
| 2674 // semi-colons. This allows code such as 'do;while(0)return' to | 2674 // semi-colons. This allows code such as 'do;while(0)return' to |
| 2675 // parse, which would not be the case if we had used the | 2675 // parse, which would not be the case if we had used the |
| 2676 // ExpectSemicolon() functionality here. | 2676 // ExpectSemicolon() functionality here. |
| 2677 if (peek() == Token::SEMICOLON) Consume(Token::SEMICOLON); | 2677 if (peek() == Token::SEMICOLON) Consume(Token::SEMICOLON); |
| 2678 | 2678 |
| 2679 if (loop != NULL) loop->Initialize(cond, body); | 2679 if (loop != NULL) loop->Initialize(cond, body); |
| 2680 | |
| 2681 seen_loop_stmt_ = true; | |
| 2682 | |
| 2683 return loop; | 2680 return loop; |
| 2684 } | 2681 } |
| 2685 | 2682 |
| 2686 | 2683 |
| 2687 WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) { | 2684 WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) { |
| 2688 // WhileStatement :: | 2685 // WhileStatement :: |
| 2689 // 'while' '(' Expression ')' Statement | 2686 // 'while' '(' Expression ')' Statement |
| 2690 | 2687 |
| 2691 WhileStatement* loop = NEW(WhileStatement(labels)); | 2688 WhileStatement* loop = NEW(WhileStatement(labels)); |
| 2692 Target target(this, loop); | 2689 Target target(this, loop); |
| 2693 | 2690 |
| 2694 Expect(Token::WHILE, CHECK_OK); | 2691 Expect(Token::WHILE, CHECK_OK); |
| 2695 Expect(Token::LPAREN, CHECK_OK); | 2692 Expect(Token::LPAREN, CHECK_OK); |
| 2696 Expression* cond = ParseExpression(true, CHECK_OK); | 2693 Expression* cond = ParseExpression(true, CHECK_OK); |
| 2697 if (cond != NULL) cond->set_is_loop_condition(true); | 2694 if (cond != NULL) cond->set_is_loop_condition(true); |
| 2698 Expect(Token::RPAREN, CHECK_OK); | 2695 Expect(Token::RPAREN, CHECK_OK); |
| 2699 Statement* body = ParseStatement(NULL, CHECK_OK); | 2696 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2700 | 2697 |
| 2701 if (loop != NULL) loop->Initialize(cond, body); | 2698 if (loop != NULL) loop->Initialize(cond, body); |
| 2702 | |
| 2703 seen_loop_stmt_ = true; | |
| 2704 | |
| 2705 return loop; | 2699 return loop; |
| 2706 } | 2700 } |
| 2707 | 2701 |
| 2708 | 2702 |
| 2709 Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { | 2703 Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
| 2710 // ForStatement :: | 2704 // ForStatement :: |
| 2711 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement | 2705 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement |
| 2712 | 2706 |
| 2713 Statement* init = NULL; | 2707 Statement* init = NULL; |
| 2714 | 2708 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2728 Expect(Token::RPAREN, CHECK_OK); | 2722 Expect(Token::RPAREN, CHECK_OK); |
| 2729 | 2723 |
| 2730 Statement* body = ParseStatement(NULL, CHECK_OK); | 2724 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2731 if (is_pre_parsing_) { | 2725 if (is_pre_parsing_) { |
| 2732 return NULL; | 2726 return NULL; |
| 2733 } else { | 2727 } else { |
| 2734 loop->Initialize(each, enumerable, body); | 2728 loop->Initialize(each, enumerable, body); |
| 2735 Block* result = NEW(Block(NULL, 2, false)); | 2729 Block* result = NEW(Block(NULL, 2, false)); |
| 2736 result->AddStatement(variable_statement); | 2730 result->AddStatement(variable_statement); |
| 2737 result->AddStatement(loop); | 2731 result->AddStatement(loop); |
| 2738 | |
| 2739 seen_loop_stmt_ = true; | |
| 2740 | |
| 2741 // Parsed for-in loop w/ variable/const declaration. | 2732 // Parsed for-in loop w/ variable/const declaration. |
| 2742 return result; | 2733 return result; |
| 2743 } | 2734 } |
| 2744 | 2735 |
| 2745 } else { | 2736 } else { |
| 2746 init = variable_statement; | 2737 init = variable_statement; |
| 2747 } | 2738 } |
| 2748 | 2739 |
| 2749 } else { | 2740 } else { |
| 2750 Expression* expression = ParseExpression(false, CHECK_OK); | 2741 Expression* expression = ParseExpression(false, CHECK_OK); |
| 2751 if (peek() == Token::IN) { | 2742 if (peek() == Token::IN) { |
| 2752 // Signal a reference error if the expression is an invalid | 2743 // Signal a reference error if the expression is an invalid |
| 2753 // left-hand side expression. We could report this as a syntax | 2744 // left-hand side expression. We could report this as a syntax |
| 2754 // error here but for compatibility with JSC we choose to report | 2745 // error here but for compatibility with JSC we choose to report |
| 2755 // the error at runtime. | 2746 // the error at runtime. |
| 2756 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2747 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 2757 Handle<String> type = Factory::invalid_lhs_in_for_in_symbol(); | 2748 Handle<String> type = Factory::invalid_lhs_in_for_in_symbol(); |
| 2758 expression = NewThrowReferenceError(type); | 2749 expression = NewThrowReferenceError(type); |
| 2759 } | 2750 } |
| 2760 ForInStatement* loop = NEW(ForInStatement(labels)); | 2751 ForInStatement* loop = NEW(ForInStatement(labels)); |
| 2761 Target target(this, loop); | 2752 Target target(this, loop); |
| 2762 | 2753 |
| 2763 Expect(Token::IN, CHECK_OK); | 2754 Expect(Token::IN, CHECK_OK); |
| 2764 Expression* enumerable = ParseExpression(true, CHECK_OK); | 2755 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2765 Expect(Token::RPAREN, CHECK_OK); | 2756 Expect(Token::RPAREN, CHECK_OK); |
| 2766 | 2757 |
| 2767 Statement* body = ParseStatement(NULL, CHECK_OK); | 2758 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2768 if (loop) loop->Initialize(expression, enumerable, body); | 2759 if (loop) loop->Initialize(expression, enumerable, body); |
| 2769 | |
| 2770 seen_loop_stmt_ = true; | |
| 2771 | |
| 2772 // Parsed for-in loop. | 2760 // Parsed for-in loop. |
| 2773 return loop; | 2761 return loop; |
| 2774 | 2762 |
| 2775 } else { | 2763 } else { |
| 2776 init = NEW(ExpressionStatement(expression)); | 2764 init = NEW(ExpressionStatement(expression)); |
| 2777 } | 2765 } |
| 2778 } | 2766 } |
| 2779 } | 2767 } |
| 2780 | 2768 |
| 2781 // Standard 'for' loop | 2769 // Standard 'for' loop |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2792 } | 2780 } |
| 2793 Expect(Token::SEMICOLON, CHECK_OK); | 2781 Expect(Token::SEMICOLON, CHECK_OK); |
| 2794 | 2782 |
| 2795 Statement* next = NULL; | 2783 Statement* next = NULL; |
| 2796 if (peek() != Token::RPAREN) { | 2784 if (peek() != Token::RPAREN) { |
| 2797 Expression* exp = ParseExpression(true, CHECK_OK); | 2785 Expression* exp = ParseExpression(true, CHECK_OK); |
| 2798 next = NEW(ExpressionStatement(exp)); | 2786 next = NEW(ExpressionStatement(exp)); |
| 2799 } | 2787 } |
| 2800 Expect(Token::RPAREN, CHECK_OK); | 2788 Expect(Token::RPAREN, CHECK_OK); |
| 2801 | 2789 |
| 2802 seen_loop_stmt_ = false; | |
| 2803 | |
| 2804 Statement* body = ParseStatement(NULL, CHECK_OK); | 2790 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2805 | |
| 2806 // Mark this loop if it is an inner loop. | |
| 2807 if (loop && !seen_loop_stmt_) loop->set_peel_this_loop(true); | |
| 2808 | |
| 2809 if (loop) loop->Initialize(init, cond, next, body); | 2791 if (loop) loop->Initialize(init, cond, next, body); |
| 2810 | |
| 2811 seen_loop_stmt_ = true; | |
| 2812 | |
| 2813 return loop; | 2792 return loop; |
| 2814 } | 2793 } |
| 2815 | 2794 |
| 2816 | 2795 |
| 2817 // Precedence = 1 | 2796 // Precedence = 1 |
| 2818 Expression* Parser::ParseExpression(bool accept_IN, bool* ok) { | 2797 Expression* Parser::ParseExpression(bool accept_IN, bool* ok) { |
| 2819 // Expression :: | 2798 // Expression :: |
| 2820 // AssignmentExpression | 2799 // AssignmentExpression |
| 2821 // Expression ',' AssignmentExpression | 2800 // Expression ',' AssignmentExpression |
| 2822 | 2801 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2994 if (static_cast<double>(y_int) == y_val && | 2973 if (static_cast<double>(y_int) == y_val && |
| 2995 (IsPowerOf2(y_int) || IsPowerOf2(-y_int)) && | 2974 (IsPowerOf2(y_int) || IsPowerOf2(-y_int)) && |
| 2996 (y_int > 2 || y_int < -2)) { | 2975 (y_int > 2 || y_int < -2)) { |
| 2997 y = NewNumberLiteral(1 / y_val); | 2976 y = NewNumberLiteral(1 / y_val); |
| 2998 op = Token::MUL; | 2977 op = Token::MUL; |
| 2999 } | 2978 } |
| 3000 } | 2979 } |
| 3001 | 2980 |
| 3002 // For now we distinguish between comparisons and other binary | 2981 // For now we distinguish between comparisons and other binary |
| 3003 // operations. (We could combine the two and get rid of this | 2982 // operations. (We could combine the two and get rid of this |
| 3004 // code an AST node eventually.) | 2983 // code and AST node eventually.) |
| 3005 if (Token::IsCompareOp(op)) { | 2984 if (Token::IsCompareOp(op)) { |
| 3006 // We have a comparison. | 2985 // We have a comparison. |
| 3007 Token::Value cmp = op; | 2986 Token::Value cmp = op; |
| 3008 switch (op) { | 2987 switch (op) { |
| 3009 case Token::NE: cmp = Token::EQ; break; | 2988 case Token::NE: cmp = Token::EQ; break; |
| 3010 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break; | 2989 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break; |
| 3011 default: break; | 2990 default: break; |
| 3012 } | 2991 } |
| 3013 x = NEW(CompareOperation(cmp, x, y)); | 2992 x = NewCompareNode(cmp, x, y); |
| 3014 if (cmp != op) { | 2993 if (cmp != op) { |
| 3015 // The comparison was negated - add a NOT. | 2994 // The comparison was negated - add a NOT. |
| 3016 x = NEW(UnaryOperation(Token::NOT, x)); | 2995 x = NEW(UnaryOperation(Token::NOT, x)); |
| 3017 } | 2996 } |
| 3018 | 2997 |
| 3019 } else { | 2998 } else { |
| 3020 // We have a "normal" binary operation. | 2999 // We have a "normal" binary operation. |
| 3021 x = NEW(BinaryOperation(op, x, y)); | 3000 x = NEW(BinaryOperation(op, x, y)); |
| 3022 } | 3001 } |
| 3023 } | 3002 } |
| 3024 } | 3003 } |
| 3025 return x; | 3004 return x; |
| 3026 } | 3005 } |
| 3027 | 3006 |
| 3028 | 3007 |
| 3008 Expression* Parser::NewCompareNode(Token::Value op, |
| 3009 Expression* x, |
| 3010 Expression* y) { |
| 3011 ASSERT(op != Token::NE && op != Token::NE_STRICT); |
| 3012 if (!is_pre_parsing_ && (op == Token::EQ || op == Token::EQ_STRICT)) { |
| 3013 bool is_strict = (op == Token::EQ_STRICT); |
| 3014 Literal* x_literal = x->AsLiteral(); |
| 3015 if (x_literal != NULL && x_literal->IsNull()) { |
| 3016 return NEW(CompareToNull(is_strict, y)); |
| 3017 } |
| 3018 |
| 3019 Literal* y_literal = y->AsLiteral(); |
| 3020 if (y_literal != NULL && y_literal->IsNull()) { |
| 3021 return NEW(CompareToNull(is_strict, x)); |
| 3022 } |
| 3023 } |
| 3024 return NEW(CompareOperation(op, x, y)); |
| 3025 } |
| 3026 |
| 3027 |
| 3029 Expression* Parser::ParseUnaryExpression(bool* ok) { | 3028 Expression* Parser::ParseUnaryExpression(bool* ok) { |
| 3030 // UnaryExpression :: | 3029 // UnaryExpression :: |
| 3031 // PostfixExpression | 3030 // PostfixExpression |
| 3032 // 'delete' UnaryExpression | 3031 // 'delete' UnaryExpression |
| 3033 // 'void' UnaryExpression | 3032 // 'void' UnaryExpression |
| 3034 // 'typeof' UnaryExpression | 3033 // 'typeof' UnaryExpression |
| 3035 // '++' UnaryExpression | 3034 // '++' UnaryExpression |
| 3036 // '--' UnaryExpression | 3035 // '--' UnaryExpression |
| 3037 // '+' UnaryExpression | 3036 // '+' UnaryExpression |
| 3038 // '-' UnaryExpression | 3037 // '-' UnaryExpression |
| (...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3836 return result.elements(); | 3835 return result.elements(); |
| 3837 } | 3836 } |
| 3838 | 3837 |
| 3839 | 3838 |
| 3840 FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, | 3839 FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
| 3841 int function_token_position, | 3840 int function_token_position, |
| 3842 FunctionLiteralType type, | 3841 FunctionLiteralType type, |
| 3843 bool* ok) { | 3842 bool* ok) { |
| 3844 // Function :: | 3843 // Function :: |
| 3845 // '(' FormalParameterList? ')' '{' FunctionBody '}' | 3844 // '(' FormalParameterList? ')' '{' FunctionBody '}' |
| 3846 | |
| 3847 // Reset flag used for inner loop detection. | |
| 3848 seen_loop_stmt_ = false; | |
| 3849 | |
| 3850 bool is_named = !var_name.is_null(); | 3845 bool is_named = !var_name.is_null(); |
| 3851 | 3846 |
| 3852 // The name associated with this function. If it's a function expression, | 3847 // The name associated with this function. If it's a function expression, |
| 3853 // this is the actual function name, otherwise this is the name of the | 3848 // this is the actual function name, otherwise this is the name of the |
| 3854 // variable declared and initialized with the function (expression). In | 3849 // variable declared and initialized with the function (expression). In |
| 3855 // that case, we don't have a function name (it's empty). | 3850 // that case, we don't have a function name (it's empty). |
| 3856 Handle<String> name = is_named ? var_name : factory()->EmptySymbol(); | 3851 Handle<String> name = is_named ? var_name : factory()->EmptySymbol(); |
| 3857 // The function name, if any. | 3852 // The function name, if any. |
| 3858 Handle<String> function_name = factory()->EmptySymbol(); | 3853 Handle<String> function_name = factory()->EmptySymbol(); |
| 3859 if (is_named && (type == EXPRESSION || type == NESTED)) { | 3854 if (is_named && (type == EXPRESSION || type == NESTED)) { |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3958 only_simple_this_property_assignments, | 3953 only_simple_this_property_assignments, |
| 3959 this_property_assignments, | 3954 this_property_assignments, |
| 3960 num_parameters, | 3955 num_parameters, |
| 3961 start_pos, | 3956 start_pos, |
| 3962 end_pos, | 3957 end_pos, |
| 3963 function_name->length() > 0)); | 3958 function_name->length() > 0)); |
| 3964 if (!is_pre_parsing_) { | 3959 if (!is_pre_parsing_) { |
| 3965 function_literal->set_function_token_position(function_token_position); | 3960 function_literal->set_function_token_position(function_token_position); |
| 3966 } | 3961 } |
| 3967 | 3962 |
| 3968 // Set flag for inner loop detection. We treat loops that contain a function | |
| 3969 // literal not as inner loops because we avoid duplicating function literals | |
| 3970 // when peeling or unrolling such a loop. | |
| 3971 seen_loop_stmt_ = true; | |
| 3972 | |
| 3973 if (fni_ != NULL && !is_named) fni_->AddFunction(function_literal); | 3963 if (fni_ != NULL && !is_named) fni_->AddFunction(function_literal); |
| 3974 return function_literal; | 3964 return function_literal; |
| 3975 } | 3965 } |
| 3976 } | 3966 } |
| 3977 | 3967 |
| 3978 | 3968 |
| 3979 Expression* Parser::ParseV8Intrinsic(bool* ok) { | 3969 Expression* Parser::ParseV8Intrinsic(bool* ok) { |
| 3980 // CallRuntime :: | 3970 // CallRuntime :: |
| 3981 // '%' Identifier Arguments | 3971 // '%' Identifier Arguments |
| 3982 | 3972 |
| (...skipping 1323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5306 parser.ParseLazy(script_source, name, | 5296 parser.ParseLazy(script_source, name, |
| 5307 start_position, end_position, is_expression); | 5297 start_position, end_position, is_expression); |
| 5308 return result; | 5298 return result; |
| 5309 } | 5299 } |
| 5310 | 5300 |
| 5311 | 5301 |
| 5312 #undef NEW | 5302 #undef NEW |
| 5313 | 5303 |
| 5314 | 5304 |
| 5315 } } // namespace v8::internal | 5305 } } // namespace v8::internal |
| OLD | NEW |