OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/hydrogen.h" | 5 #include "src/hydrogen.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 5248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5259 HOptimizedGraphBuilder::LookupGlobalProperty(Variable* var, LookupIterator* it, | 5259 HOptimizedGraphBuilder::LookupGlobalProperty(Variable* var, LookupIterator* it, |
5260 PropertyAccessType access_type) { | 5260 PropertyAccessType access_type) { |
5261 if (var->is_this() || !current_info()->has_global_object()) { | 5261 if (var->is_this() || !current_info()->has_global_object()) { |
5262 return kUseGeneric; | 5262 return kUseGeneric; |
5263 } | 5263 } |
5264 | 5264 |
5265 switch (it->state()) { | 5265 switch (it->state()) { |
5266 case LookupIterator::ACCESSOR: | 5266 case LookupIterator::ACCESSOR: |
5267 case LookupIterator::ACCESS_CHECK: | 5267 case LookupIterator::ACCESS_CHECK: |
5268 case LookupIterator::INTERCEPTOR: | 5268 case LookupIterator::INTERCEPTOR: |
| 5269 case LookupIterator::INTEGER_INDEXED_EXOTIC: |
5269 case LookupIterator::NOT_FOUND: | 5270 case LookupIterator::NOT_FOUND: |
5270 return kUseGeneric; | 5271 return kUseGeneric; |
5271 case LookupIterator::DATA: | 5272 case LookupIterator::DATA: |
5272 if (access_type == STORE && it->IsReadOnly()) return kUseGeneric; | 5273 if (access_type == STORE && it->IsReadOnly()) return kUseGeneric; |
5273 return kUseCell; | 5274 return kUseCell; |
5274 case LookupIterator::JSPROXY: | 5275 case LookupIterator::JSPROXY: |
5275 case LookupIterator::TRANSITION: | 5276 case LookupIterator::TRANSITION: |
5276 UNREACHABLE(); | 5277 UNREACHABLE(); |
5277 } | 5278 } |
5278 UNREACHABLE(); | 5279 UNREACHABLE(); |
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6064 return false; | 6065 return false; |
6065 } | 6066 } |
6066 LookupDescriptor(*map, *name_); | 6067 LookupDescriptor(*map, *name_); |
6067 if (IsFound()) return LoadResult(map); | 6068 if (IsFound()) return LoadResult(map); |
6068 } | 6069 } |
6069 NotFound(); | 6070 NotFound(); |
6070 return true; | 6071 return true; |
6071 } | 6072 } |
6072 | 6073 |
6073 | 6074 |
| 6075 bool HOptimizedGraphBuilder::PropertyAccessInfo::IsIntegerIndexedExotic() { |
| 6076 InstanceType instance_type = map_->instance_type(); |
| 6077 return instance_type == JS_TYPED_ARRAY_TYPE && IsNonArrayIndexInteger(*name_); |
| 6078 } |
| 6079 |
| 6080 |
6074 bool HOptimizedGraphBuilder::PropertyAccessInfo::CanAccessMonomorphic() { | 6081 bool HOptimizedGraphBuilder::PropertyAccessInfo::CanAccessMonomorphic() { |
6075 if (!CanInlinePropertyAccess(map_)) return false; | 6082 if (!CanInlinePropertyAccess(map_)) return false; |
6076 if (IsJSObjectFieldAccessor()) return IsLoad(); | 6083 if (IsJSObjectFieldAccessor()) return IsLoad(); |
6077 if (map_->function_with_prototype() && !map_->has_non_instance_prototype() && | 6084 if (map_->function_with_prototype() && !map_->has_non_instance_prototype() && |
6078 name_.is_identical_to(isolate()->factory()->prototype_string())) { | 6085 name_.is_identical_to(isolate()->factory()->prototype_string())) { |
6079 return IsLoad(); | 6086 return IsLoad(); |
6080 } | 6087 } |
6081 if (!LookupDescriptor()) return false; | 6088 if (!LookupDescriptor()) return false; |
6082 if (IsFound()) return IsLoad() || !IsReadOnly(); | 6089 if (IsFound()) return IsLoad() || !IsReadOnly(); |
| 6090 if (IsIntegerIndexedExotic()) return false; |
6083 if (!LookupInPrototypes()) return false; | 6091 if (!LookupInPrototypes()) return false; |
6084 if (IsLoad()) return true; | 6092 if (IsLoad()) return true; |
6085 | 6093 |
6086 if (IsAccessorConstant()) return true; | 6094 if (IsAccessorConstant()) return true; |
6087 LookupTransition(*map_, *name_, NONE); | 6095 LookupTransition(*map_, *name_, NONE); |
6088 if (IsTransitionToData() && map_->unused_property_fields() > 0) { | 6096 if (IsTransitionToData() && map_->unused_property_fields() > 0) { |
6089 // Construct the object field access. | 6097 // Construct the object field access. |
6090 int descriptor = transition()->LastAdded(); | 6098 int descriptor = transition()->LastAdded(); |
6091 int index = | 6099 int index = |
6092 transition()->instance_descriptors()->GetFieldIndex(descriptor) - | 6100 transition()->instance_descriptors()->GetFieldIndex(descriptor) - |
(...skipping 7343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13436 if (ShouldProduceTraceOutput()) { | 13444 if (ShouldProduceTraceOutput()) { |
13437 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13445 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13438 } | 13446 } |
13439 | 13447 |
13440 #ifdef DEBUG | 13448 #ifdef DEBUG |
13441 graph_->Verify(false); // No full verify. | 13449 graph_->Verify(false); // No full verify. |
13442 #endif | 13450 #endif |
13443 } | 13451 } |
13444 | 13452 |
13445 } } // namespace v8::internal | 13453 } } // namespace v8::internal |
OLD | NEW |