| 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 2812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2823 return true; | 2823 return true; |
| 2824 } else if (FLAG_harmony_iteration && | 2824 } else if (FLAG_harmony_iteration && |
| 2825 CheckContextualKeyword(CStrVector("of"))) { | 2825 CheckContextualKeyword(CStrVector("of"))) { |
| 2826 *visit_mode = ForEachStatement::ITERATE; | 2826 *visit_mode = ForEachStatement::ITERATE; |
| 2827 return true; | 2827 return true; |
| 2828 } | 2828 } |
| 2829 return false; | 2829 return false; |
| 2830 } | 2830 } |
| 2831 | 2831 |
| 2832 | 2832 |
| 2833 void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
| 2834 Expression* each, |
| 2835 Expression* subject, |
| 2836 Statement* body) { |
| 2837 ForOfStatement* for_of = stmt->AsForOfStatement(); |
| 2838 |
| 2839 if (for_of != NULL) { |
| 2840 Factory* heap_factory = isolate()->factory(); |
| 2841 Handle<String> iterator_str = heap_factory->InternalizeOneByteString( |
| 2842 STATIC_ASCII_VECTOR(".iterator")); |
| 2843 Handle<String> result_str = heap_factory->InternalizeOneByteString( |
| 2844 STATIC_ASCII_VECTOR(".result")); |
| 2845 Variable* iterator = |
| 2846 top_scope_->DeclarationScope()->NewTemporary(iterator_str); |
| 2847 Variable* result = top_scope_->DeclarationScope()->NewTemporary(result_str); |
| 2848 |
| 2849 Expression* assign_iterator; |
| 2850 Expression* next_result; |
| 2851 Expression* result_done; |
| 2852 Expression* assign_each; |
| 2853 |
| 2854 // var iterator = iterable; |
| 2855 { |
| 2856 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 2857 assign_iterator = factory()->NewAssignment( |
| 2858 Token::ASSIGN, iterator_proxy, subject, RelocInfo::kNoPosition); |
| 2859 } |
| 2860 |
| 2861 // var result = iterator.next(); |
| 2862 { |
| 2863 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 2864 Expression* next_literal = |
| 2865 factory()->NewLiteral(heap_factory->next_string()); |
| 2866 Expression* next_property = factory()->NewProperty( |
| 2867 iterator_proxy, next_literal, RelocInfo::kNoPosition); |
| 2868 ZoneList<Expression*>* next_arguments = |
| 2869 new(zone()) ZoneList<Expression*>(0, zone()); |
| 2870 Expression* next_call = factory()->NewCall( |
| 2871 next_property, next_arguments, RelocInfo::kNoPosition); |
| 2872 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2873 next_result = factory()->NewAssignment( |
| 2874 Token::ASSIGN, result_proxy, next_call, RelocInfo::kNoPosition); |
| 2875 } |
| 2876 |
| 2877 // result.done |
| 2878 { |
| 2879 Expression* done_literal = |
| 2880 factory()->NewLiteral(heap_factory->done_string()); |
| 2881 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2882 result_done = factory()->NewProperty( |
| 2883 result_proxy, done_literal, RelocInfo::kNoPosition); |
| 2884 } |
| 2885 |
| 2886 // each = result.value |
| 2887 { |
| 2888 Expression* value_literal = |
| 2889 factory()->NewLiteral(heap_factory->value_string()); |
| 2890 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2891 Expression* result_value = factory()->NewProperty( |
| 2892 result_proxy, value_literal, RelocInfo::kNoPosition); |
| 2893 assign_each = factory()->NewAssignment( |
| 2894 Token::ASSIGN, each, result_value, RelocInfo::kNoPosition); |
| 2895 } |
| 2896 |
| 2897 for_of->Initialize(each, subject, body, |
| 2898 assign_iterator, next_result, result_done, assign_each); |
| 2899 } else { |
| 2900 stmt->Initialize(each, subject, body); |
| 2901 } |
| 2902 } |
| 2903 |
| 2904 |
| 2833 Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { | 2905 Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
| 2834 // ForStatement :: | 2906 // ForStatement :: |
| 2835 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement | 2907 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement |
| 2836 | 2908 |
| 2837 Statement* init = NULL; | 2909 Statement* init = NULL; |
| 2838 | 2910 |
| 2839 // Create an in-between scope for let-bound iteration variables. | 2911 // Create an in-between scope for let-bound iteration variables. |
| 2840 Scope* saved_scope = top_scope_; | 2912 Scope* saved_scope = top_scope_; |
| 2841 Scope* for_scope = NewScope(top_scope_, BLOCK_SCOPE); | 2913 Scope* for_scope = NewScope(top_scope_, BLOCK_SCOPE); |
| 2842 top_scope_ = for_scope; | 2914 top_scope_ = for_scope; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2857 is_const ? Interface::NewConst() : Interface::NewValue(); | 2929 is_const ? Interface::NewConst() : Interface::NewValue(); |
| 2858 ForEachStatement* loop = factory()->NewForEachStatement(mode, labels); | 2930 ForEachStatement* loop = factory()->NewForEachStatement(mode, labels); |
| 2859 Target target(&this->target_stack_, loop); | 2931 Target target(&this->target_stack_, loop); |
| 2860 | 2932 |
| 2861 Expression* enumerable = ParseExpression(true, CHECK_OK); | 2933 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2862 Expect(Token::RPAREN, CHECK_OK); | 2934 Expect(Token::RPAREN, CHECK_OK); |
| 2863 | 2935 |
| 2864 VariableProxy* each = | 2936 VariableProxy* each = |
| 2865 top_scope_->NewUnresolved(factory(), name, interface); | 2937 top_scope_->NewUnresolved(factory(), name, interface); |
| 2866 Statement* body = ParseStatement(NULL, CHECK_OK); | 2938 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2867 loop->Initialize(each, enumerable, body); | 2939 InitializeForEachStatement(loop, each, enumerable, body); |
| 2868 Block* result = factory()->NewBlock(NULL, 2, false); | 2940 Block* result = factory()->NewBlock(NULL, 2, false); |
| 2869 result->AddStatement(variable_statement, zone()); | 2941 result->AddStatement(variable_statement, zone()); |
| 2870 result->AddStatement(loop, zone()); | 2942 result->AddStatement(loop, zone()); |
| 2871 top_scope_ = saved_scope; | 2943 top_scope_ = saved_scope; |
| 2872 for_scope->set_end_position(scanner().location().end_pos); | 2944 for_scope->set_end_position(scanner().location().end_pos); |
| 2873 for_scope = for_scope->FinalizeBlockScope(); | 2945 for_scope = for_scope->FinalizeBlockScope(); |
| 2874 ASSERT(for_scope == NULL); | 2946 ASSERT(for_scope == NULL); |
| 2875 // Parsed for-in loop w/ variable/const declaration. | 2947 // Parsed for-in loop w/ variable/const declaration. |
| 2876 return result; | 2948 return result; |
| 2877 } else { | 2949 } else { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2921 top_scope_->NewUnresolved(factory(), name, Interface::NewValue()); | 2993 top_scope_->NewUnresolved(factory(), name, Interface::NewValue()); |
| 2922 Statement* body = ParseStatement(NULL, CHECK_OK); | 2994 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2923 Block* body_block = factory()->NewBlock(NULL, 3, false); | 2995 Block* body_block = factory()->NewBlock(NULL, 3, false); |
| 2924 Assignment* assignment = factory()->NewAssignment( | 2996 Assignment* assignment = factory()->NewAssignment( |
| 2925 Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition); | 2997 Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition); |
| 2926 Statement* assignment_statement = | 2998 Statement* assignment_statement = |
| 2927 factory()->NewExpressionStatement(assignment); | 2999 factory()->NewExpressionStatement(assignment); |
| 2928 body_block->AddStatement(variable_statement, zone()); | 3000 body_block->AddStatement(variable_statement, zone()); |
| 2929 body_block->AddStatement(assignment_statement, zone()); | 3001 body_block->AddStatement(assignment_statement, zone()); |
| 2930 body_block->AddStatement(body, zone()); | 3002 body_block->AddStatement(body, zone()); |
| 2931 loop->Initialize(temp_proxy, enumerable, body_block); | 3003 InitializeForEachStatement(loop, temp_proxy, enumerable, body_block); |
| 2932 top_scope_ = saved_scope; | 3004 top_scope_ = saved_scope; |
| 2933 for_scope->set_end_position(scanner().location().end_pos); | 3005 for_scope->set_end_position(scanner().location().end_pos); |
| 2934 for_scope = for_scope->FinalizeBlockScope(); | 3006 for_scope = for_scope->FinalizeBlockScope(); |
| 2935 body_block->set_scope(for_scope); | 3007 body_block->set_scope(for_scope); |
| 2936 // Parsed for-in loop w/ let declaration. | 3008 // Parsed for-in loop w/ let declaration. |
| 2937 return loop; | 3009 return loop; |
| 2938 | 3010 |
| 2939 } else { | 3011 } else { |
| 2940 init = variable_statement; | 3012 init = variable_statement; |
| 2941 } | 3013 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2953 isolate()->factory()->invalid_lhs_in_for_in_string(); | 3025 isolate()->factory()->invalid_lhs_in_for_in_string(); |
| 2954 expression = NewThrowReferenceError(type); | 3026 expression = NewThrowReferenceError(type); |
| 2955 } | 3027 } |
| 2956 ForEachStatement* loop = factory()->NewForEachStatement(mode, labels); | 3028 ForEachStatement* loop = factory()->NewForEachStatement(mode, labels); |
| 2957 Target target(&this->target_stack_, loop); | 3029 Target target(&this->target_stack_, loop); |
| 2958 | 3030 |
| 2959 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3031 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2960 Expect(Token::RPAREN, CHECK_OK); | 3032 Expect(Token::RPAREN, CHECK_OK); |
| 2961 | 3033 |
| 2962 Statement* body = ParseStatement(NULL, CHECK_OK); | 3034 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2963 loop->Initialize(expression, enumerable, body); | 3035 InitializeForEachStatement(loop, expression, enumerable, body); |
| 2964 top_scope_ = saved_scope; | 3036 top_scope_ = saved_scope; |
| 2965 for_scope->set_end_position(scanner().location().end_pos); | 3037 for_scope->set_end_position(scanner().location().end_pos); |
| 2966 for_scope = for_scope->FinalizeBlockScope(); | 3038 for_scope = for_scope->FinalizeBlockScope(); |
| 2967 ASSERT(for_scope == NULL); | 3039 ASSERT(for_scope == NULL); |
| 2968 // Parsed for-in loop. | 3040 // Parsed for-in loop. |
| 2969 return loop; | 3041 return loop; |
| 2970 | 3042 |
| 2971 } else { | 3043 } else { |
| 2972 init = factory()->NewExpressionStatement(expression); | 3044 init = factory()->NewExpressionStatement(expression); |
| 2973 } | 3045 } |
| (...skipping 3078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6052 ASSERT(info()->isolate()->has_pending_exception()); | 6124 ASSERT(info()->isolate()->has_pending_exception()); |
| 6053 } else { | 6125 } else { |
| 6054 result = ParseProgram(); | 6126 result = ParseProgram(); |
| 6055 } | 6127 } |
| 6056 } | 6128 } |
| 6057 info()->SetFunction(result); | 6129 info()->SetFunction(result); |
| 6058 return (result != NULL); | 6130 return (result != NULL); |
| 6059 } | 6131 } |
| 6060 | 6132 |
| 6061 } } // namespace v8::internal | 6133 } } // namespace v8::internal |
| OLD | NEW |