| 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/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/char-predicates-inl.h" | 10 #include "src/char-predicates-inl.h" |
| (...skipping 2760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2771 | 2771 |
| 2772 | 2772 |
| 2773 void Parser::InitializeForEachStatement(ForEachStatement* stmt, | 2773 void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
| 2774 Expression* each, | 2774 Expression* each, |
| 2775 Expression* subject, | 2775 Expression* subject, |
| 2776 Statement* body) { | 2776 Statement* body) { |
| 2777 ForOfStatement* for_of = stmt->AsForOfStatement(); | 2777 ForOfStatement* for_of = stmt->AsForOfStatement(); |
| 2778 | 2778 |
| 2779 if (for_of != NULL) { | 2779 if (for_of != NULL) { |
| 2780 Factory* heap_factory = isolate()->factory(); | 2780 Factory* heap_factory = isolate()->factory(); |
| 2781 Variable* iterable = scope_->DeclarationScope()->NewTemporary( |
| 2782 heap_factory->dot_iterable_string()); |
| 2781 Variable* iterator = scope_->DeclarationScope()->NewTemporary( | 2783 Variable* iterator = scope_->DeclarationScope()->NewTemporary( |
| 2782 heap_factory->dot_iterator_string()); | 2784 heap_factory->dot_iterator_string()); |
| 2783 Variable* result = scope_->DeclarationScope()->NewTemporary( | 2785 Variable* result = scope_->DeclarationScope()->NewTemporary( |
| 2784 heap_factory->dot_result_string()); | 2786 heap_factory->dot_result_string()); |
| 2785 | 2787 |
| 2788 Expression* assign_iterable; |
| 2786 Expression* assign_iterator; | 2789 Expression* assign_iterator; |
| 2787 Expression* next_result; | 2790 Expression* next_result; |
| 2788 Expression* result_done; | 2791 Expression* result_done; |
| 2789 Expression* assign_each; | 2792 Expression* assign_each; |
| 2790 | 2793 |
| 2791 // var iterator = iterable; | 2794 // var iterable = subject; |
| 2792 { | 2795 { |
| 2796 Expression* iterable_proxy = factory()->NewVariableProxy(iterable); |
| 2797 assign_iterable = factory()->NewAssignment( |
| 2798 Token::ASSIGN, iterable_proxy, subject, subject->position()); |
| 2799 } |
| 2800 |
| 2801 // var iterator = iterable[Symbol.iterator](); |
| 2802 { |
| 2803 Expression* iterable_proxy = factory()->NewVariableProxy(iterable); |
| 2804 Handle<Symbol> iterator_symbol( |
| 2805 isolate()->native_context()->iterator_symbol(), isolate()); |
| 2806 Expression* iterator_symbol_literal = factory()->NewLiteral( |
| 2807 iterator_symbol, RelocInfo::kNoPosition); |
| 2808 // FIXME(wingo): Unhappily, it will be a common error that the RHS of a |
| 2809 // for-of doesn't have a Symbol.iterator property. We should do better |
| 2810 // than informing the user that "undefined is not a function". |
| 2811 int pos = subject->position(); |
| 2812 Expression* iterator_property = factory()->NewProperty( |
| 2813 iterable_proxy, iterator_symbol_literal, pos); |
| 2814 ZoneList<Expression*>* iterator_arguments = |
| 2815 new(zone()) ZoneList<Expression*>(0, zone()); |
| 2816 Expression* iterator_call = factory()->NewCall( |
| 2817 iterator_property, iterator_arguments, pos); |
| 2793 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); | 2818 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 2794 assign_iterator = factory()->NewAssignment( | 2819 assign_iterator = factory()->NewAssignment( |
| 2795 Token::ASSIGN, iterator_proxy, subject, RelocInfo::kNoPosition); | 2820 Token::ASSIGN, iterator_proxy, iterator_call, RelocInfo::kNoPosition); |
| 2796 } | 2821 } |
| 2797 | 2822 |
| 2798 // var result = iterator.next(); | 2823 // var result = iterator.next(); |
| 2799 { | 2824 { |
| 2800 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); | 2825 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 2801 Expression* next_literal = factory()->NewLiteral( | 2826 Expression* next_literal = factory()->NewLiteral( |
| 2802 heap_factory->next_string(), RelocInfo::kNoPosition); | 2827 heap_factory->next_string(), RelocInfo::kNoPosition); |
| 2803 Expression* next_property = factory()->NewProperty( | 2828 Expression* next_property = factory()->NewProperty( |
| 2804 iterator_proxy, next_literal, RelocInfo::kNoPosition); | 2829 iterator_proxy, next_literal, RelocInfo::kNoPosition); |
| 2805 ZoneList<Expression*>* next_arguments = | 2830 ZoneList<Expression*>* next_arguments = |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2825 Expression* value_literal = factory()->NewLiteral( | 2850 Expression* value_literal = factory()->NewLiteral( |
| 2826 heap_factory->value_string(), RelocInfo::kNoPosition); | 2851 heap_factory->value_string(), RelocInfo::kNoPosition); |
| 2827 Expression* result_proxy = factory()->NewVariableProxy(result); | 2852 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2828 Expression* result_value = factory()->NewProperty( | 2853 Expression* result_value = factory()->NewProperty( |
| 2829 result_proxy, value_literal, RelocInfo::kNoPosition); | 2854 result_proxy, value_literal, RelocInfo::kNoPosition); |
| 2830 assign_each = factory()->NewAssignment( | 2855 assign_each = factory()->NewAssignment( |
| 2831 Token::ASSIGN, each, result_value, RelocInfo::kNoPosition); | 2856 Token::ASSIGN, each, result_value, RelocInfo::kNoPosition); |
| 2832 } | 2857 } |
| 2833 | 2858 |
| 2834 for_of->Initialize(each, subject, body, | 2859 for_of->Initialize(each, subject, body, |
| 2835 assign_iterator, next_result, result_done, assign_each); | 2860 assign_iterable, |
| 2861 assign_iterator, |
| 2862 next_result, |
| 2863 result_done, |
| 2864 assign_each); |
| 2836 } else { | 2865 } else { |
| 2837 stmt->Initialize(each, subject, body); | 2866 stmt->Initialize(each, subject, body); |
| 2838 } | 2867 } |
| 2839 } | 2868 } |
| 2840 | 2869 |
| 2841 | 2870 |
| 2842 Statement* Parser::DesugarLetBindingsInForStatement( | 2871 Statement* Parser::DesugarLetBindingsInForStatement( |
| 2843 Scope* inner_scope, ZoneStringList* names, ForStatement* loop, | 2872 Scope* inner_scope, ZoneStringList* names, ForStatement* loop, |
| 2844 Statement* init, Expression* cond, Statement* next, Statement* body, | 2873 Statement* init, Expression* cond, Statement* next, Statement* body, |
| 2845 bool* ok) { | 2874 bool* ok) { |
| (...skipping 1937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4783 ASSERT(info()->isolate()->has_pending_exception()); | 4812 ASSERT(info()->isolate()->has_pending_exception()); |
| 4784 } else { | 4813 } else { |
| 4785 result = ParseProgram(); | 4814 result = ParseProgram(); |
| 4786 } | 4815 } |
| 4787 } | 4816 } |
| 4788 info()->SetFunction(result); | 4817 info()->SetFunction(result); |
| 4789 return (result != NULL); | 4818 return (result != NULL); |
| 4790 } | 4819 } |
| 4791 | 4820 |
| 4792 } } // namespace v8::internal | 4821 } } // namespace v8::internal |
| OLD | NEW |