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/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 2907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2918 Variable* iterator = scope_->DeclarationScope()->NewTemporary( | 2918 Variable* iterator = scope_->DeclarationScope()->NewTemporary( |
2919 ast_value_factory()->dot_iterator_string()); | 2919 ast_value_factory()->dot_iterator_string()); |
2920 Variable* result = scope_->DeclarationScope()->NewTemporary( | 2920 Variable* result = scope_->DeclarationScope()->NewTemporary( |
2921 ast_value_factory()->dot_result_string()); | 2921 ast_value_factory()->dot_result_string()); |
2922 | 2922 |
2923 Expression* assign_iterator; | 2923 Expression* assign_iterator; |
2924 Expression* next_result; | 2924 Expression* next_result; |
2925 Expression* result_done; | 2925 Expression* result_done; |
2926 Expression* assign_each; | 2926 Expression* assign_each; |
2927 | 2927 |
2928 // iterator = subject[Symbol.iterator]() | 2928 // var iterator = subject[Symbol.iterator](); |
2929 assign_iterator = factory()->NewAssignment( | 2929 assign_iterator = factory()->NewAssignment( |
2930 Token::ASSIGN, factory()->NewVariableProxy(iterator), | 2930 Token::ASSIGN, factory()->NewVariableProxy(iterator), |
2931 GetIterator(subject, factory()), subject->position()); | 2931 GetIterator(subject, factory()), subject->position()); |
2932 | 2932 |
2933 // !%_IsSpecObject(result = iterator.next()) && | 2933 // var result = iterator.next(); |
2934 // %ThrowIteratorResultNotAnObject(result) | |
2935 { | 2934 { |
2936 // result = iterator.next() | |
2937 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); | 2935 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
2938 Expression* next_literal = factory()->NewStringLiteral( | 2936 Expression* next_literal = factory()->NewStringLiteral( |
2939 ast_value_factory()->next_string(), RelocInfo::kNoPosition); | 2937 ast_value_factory()->next_string(), RelocInfo::kNoPosition); |
2940 Expression* next_property = factory()->NewProperty( | 2938 Expression* next_property = factory()->NewProperty( |
2941 iterator_proxy, next_literal, RelocInfo::kNoPosition); | 2939 iterator_proxy, next_literal, RelocInfo::kNoPosition); |
2942 ZoneList<Expression*>* next_arguments = | 2940 ZoneList<Expression*>* next_arguments = |
2943 new (zone()) ZoneList<Expression*>(0, zone()); | 2941 new(zone()) ZoneList<Expression*>(0, zone()); |
2944 Expression* next_call = factory()->NewCall(next_property, next_arguments, | 2942 Expression* next_call = factory()->NewCall(next_property, next_arguments, |
2945 subject->position()); | 2943 subject->position()); |
2946 Expression* result_proxy = factory()->NewVariableProxy(result); | 2944 Expression* result_proxy = factory()->NewVariableProxy(result); |
2947 next_result = factory()->NewAssignment(Token::ASSIGN, result_proxy, | 2945 next_result = factory()->NewAssignment(Token::ASSIGN, result_proxy, |
2948 next_call, subject->position()); | 2946 next_call, subject->position()); |
2949 | |
2950 // %_IsSpecObject(...) | |
2951 ZoneList<Expression*>* is_spec_object_args = | |
2952 new (zone()) ZoneList<Expression*>(1, zone()); | |
2953 is_spec_object_args->Add(next_result, zone()); | |
2954 Expression* is_spec_object_call = factory()->NewCallRuntime( | |
2955 ast_value_factory()->is_spec_object_string(), | |
2956 Runtime::FunctionForId(Runtime::kInlineIsSpecObject), | |
2957 is_spec_object_args, subject->position()); | |
2958 | |
2959 // %ThrowIteratorResultNotAnObject(result) | |
2960 Expression* result_proxy_again = factory()->NewVariableProxy(result); | |
2961 ZoneList<Expression*>* throw_arguments = | |
2962 new (zone()) ZoneList<Expression*>(1, zone()); | |
2963 throw_arguments->Add(result_proxy_again, zone()); | |
2964 Expression* throw_call = factory()->NewCallRuntime( | |
2965 ast_value_factory()->throw_iterator_result_not_an_object_string(), | |
2966 Runtime::FunctionForId(Runtime::kThrowIteratorResultNotAnObject), | |
2967 throw_arguments, subject->position()); | |
2968 | |
2969 next_result = factory()->NewBinaryOperation( | |
2970 Token::AND, factory()->NewUnaryOperation( | |
2971 Token::NOT, is_spec_object_call, subject->position()), | |
2972 throw_call, subject->position()); | |
2973 } | 2947 } |
2974 | 2948 |
2975 // result.done | 2949 // result.done |
2976 { | 2950 { |
2977 Expression* done_literal = factory()->NewStringLiteral( | 2951 Expression* done_literal = factory()->NewStringLiteral( |
2978 ast_value_factory()->done_string(), RelocInfo::kNoPosition); | 2952 ast_value_factory()->done_string(), RelocInfo::kNoPosition); |
2979 Expression* result_proxy = factory()->NewVariableProxy(result); | 2953 Expression* result_proxy = factory()->NewVariableProxy(result); |
2980 result_done = factory()->NewProperty( | 2954 result_done = factory()->NewProperty( |
2981 result_proxy, done_literal, RelocInfo::kNoPosition); | 2955 result_proxy, done_literal, RelocInfo::kNoPosition); |
2982 } | 2956 } |
(...skipping 2506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5489 } else { | 5463 } else { |
5490 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); | 5464 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); |
5491 running_hash = StringHasher::ComputeRunningHash(running_hash, data, | 5465 running_hash = StringHasher::ComputeRunningHash(running_hash, data, |
5492 raw_string->length()); | 5466 raw_string->length()); |
5493 } | 5467 } |
5494 } | 5468 } |
5495 | 5469 |
5496 return running_hash; | 5470 return running_hash; |
5497 } | 5471 } |
5498 } } // namespace v8::internal | 5472 } } // namespace v8::internal |
OLD | NEW |