| 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/crankshaft/hydrogen.h" |      5 #include "src/crankshaft/hydrogen.h" | 
|      6  |      6  | 
|      7 #include <sstream> |      7 #include <sstream> | 
|      8  |      8  | 
|      9 #include "src/allocation-site-scopes.h" |      9 #include "src/allocation-site-scopes.h" | 
|     10 #include "src/ast/ast-numbering.h" |     10 #include "src/ast/ast-numbering.h" | 
| (...skipping 6541 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   6552 bool HOptimizedGraphBuilder::PropertyAccessInfo::IsIntegerIndexedExotic() { |   6552 bool HOptimizedGraphBuilder::PropertyAccessInfo::IsIntegerIndexedExotic() { | 
|   6553   InstanceType instance_type = map_->instance_type(); |   6553   InstanceType instance_type = map_->instance_type(); | 
|   6554   return instance_type == JS_TYPED_ARRAY_TYPE && name_->IsString() && |   6554   return instance_type == JS_TYPED_ARRAY_TYPE && name_->IsString() && | 
|   6555          IsSpecialIndex(isolate()->unicode_cache(), String::cast(*name_)); |   6555          IsSpecialIndex(isolate()->unicode_cache(), String::cast(*name_)); | 
|   6556 } |   6556 } | 
|   6557  |   6557  | 
|   6558  |   6558  | 
|   6559 bool HOptimizedGraphBuilder::PropertyAccessInfo::CanAccessMonomorphic() { |   6559 bool HOptimizedGraphBuilder::PropertyAccessInfo::CanAccessMonomorphic() { | 
|   6560   if (!CanInlinePropertyAccess(map_)) return false; |   6560   if (!CanInlinePropertyAccess(map_)) return false; | 
|   6561   if (IsJSObjectFieldAccessor()) return IsLoad(); |   6561   if (IsJSObjectFieldAccessor()) return IsLoad(); | 
|   6562   if (IsJSArrayBufferViewFieldAccessor()) return IsLoad(); |  | 
|   6563   if (map_->IsJSFunctionMap() && map_->is_constructor() && |   6562   if (map_->IsJSFunctionMap() && map_->is_constructor() && | 
|   6564       !map_->has_non_instance_prototype() && |   6563       !map_->has_non_instance_prototype() && | 
|   6565       name_.is_identical_to(isolate()->factory()->prototype_string())) { |   6564       name_.is_identical_to(isolate()->factory()->prototype_string())) { | 
|   6566     return IsLoad(); |   6565     return IsLoad(); | 
|   6567   } |   6566   } | 
|   6568   if (!LookupDescriptor()) return false; |   6567   if (!LookupDescriptor()) return false; | 
|   6569   if (IsFound()) return IsLoad() || !IsReadOnly(); |   6568   if (IsFound()) return IsLoad() || !IsReadOnly(); | 
|   6570   if (IsIntegerIndexedExotic()) return false; |   6569   if (IsIntegerIndexedExotic()) return false; | 
|   6571   if (!LookupInPrototypes()) return false; |   6570   if (!LookupInPrototypes()) return false; | 
|   6572   if (IsLoad()) return true; |   6571   if (IsLoad()) return true; | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|   6600   HObjectAccess access = HObjectAccess::ForMap();  // bogus default |   6599   HObjectAccess access = HObjectAccess::ForMap();  // bogus default | 
|   6601   if (GetJSObjectFieldAccess(&access)) { |   6600   if (GetJSObjectFieldAccess(&access)) { | 
|   6602     for (int i = 1; i < maps->length(); ++i) { |   6601     for (int i = 1; i < maps->length(); ++i) { | 
|   6603       PropertyAccessInfo test_info(builder_, access_type_, maps->at(i), name_); |   6602       PropertyAccessInfo test_info(builder_, access_type_, maps->at(i), name_); | 
|   6604       HObjectAccess test_access = HObjectAccess::ForMap();  // bogus default |   6603       HObjectAccess test_access = HObjectAccess::ForMap();  // bogus default | 
|   6605       if (!test_info.GetJSObjectFieldAccess(&test_access)) return false; |   6604       if (!test_info.GetJSObjectFieldAccess(&test_access)) return false; | 
|   6606       if (!access.Equals(test_access)) return false; |   6605       if (!access.Equals(test_access)) return false; | 
|   6607     } |   6606     } | 
|   6608     return true; |   6607     return true; | 
|   6609   } |   6608   } | 
|   6610   if (GetJSArrayBufferViewFieldAccess(&access)) { |  | 
|   6611     for (int i = 1; i < maps->length(); ++i) { |  | 
|   6612       PropertyAccessInfo test_info(builder_, access_type_, maps->at(i), name_); |  | 
|   6613       HObjectAccess test_access = HObjectAccess::ForMap();  // bogus default |  | 
|   6614       if (!test_info.GetJSArrayBufferViewFieldAccess(&test_access)) { |  | 
|   6615         return false; |  | 
|   6616       } |  | 
|   6617       if (!access.Equals(test_access)) return false; |  | 
|   6618     } |  | 
|   6619     return true; |  | 
|   6620   } |  | 
|   6621  |   6609  | 
|   6622   // Currently only handle numbers as a polymorphic case. |   6610   // Currently only handle numbers as a polymorphic case. | 
|   6623   // TODO(verwaest): Support monomorphic handling of numbers with a HCheckNumber |   6611   // TODO(verwaest): Support monomorphic handling of numbers with a HCheckNumber | 
|   6624   // instruction. |   6612   // instruction. | 
|   6625   if (IsNumberType()) return false; |   6613   if (IsNumberType()) return false; | 
|   6626  |   6614  | 
|   6627   // Multiple maps cannot transition to the same target map. |   6615   // Multiple maps cannot transition to the same target map. | 
|   6628   DCHECK(!IsLoad() || !IsTransition()); |   6616   DCHECK(!IsLoad() || !IsTransition()); | 
|   6629   if (IsTransition() && maps->length() > 1) return false; |   6617   if (IsTransition() && maps->length() > 1) return false; | 
|   6630  |   6618  | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   6664 HValue* HOptimizedGraphBuilder::BuildMonomorphicAccess( |   6652 HValue* HOptimizedGraphBuilder::BuildMonomorphicAccess( | 
|   6665     PropertyAccessInfo* info, HValue* object, HValue* checked_object, |   6653     PropertyAccessInfo* info, HValue* object, HValue* checked_object, | 
|   6666     HValue* value, BailoutId ast_id, BailoutId return_id, |   6654     HValue* value, BailoutId ast_id, BailoutId return_id, | 
|   6667     bool can_inline_accessor) { |   6655     bool can_inline_accessor) { | 
|   6668   HObjectAccess access = HObjectAccess::ForMap();  // bogus default |   6656   HObjectAccess access = HObjectAccess::ForMap();  // bogus default | 
|   6669   if (info->GetJSObjectFieldAccess(&access)) { |   6657   if (info->GetJSObjectFieldAccess(&access)) { | 
|   6670     DCHECK(info->IsLoad()); |   6658     DCHECK(info->IsLoad()); | 
|   6671     return New<HLoadNamedField>(object, checked_object, access); |   6659     return New<HLoadNamedField>(object, checked_object, access); | 
|   6672   } |   6660   } | 
|   6673  |   6661  | 
|   6674   if (info->GetJSArrayBufferViewFieldAccess(&access)) { |  | 
|   6675     DCHECK(info->IsLoad()); |  | 
|   6676     checked_object = Add<HCheckArrayBufferNotNeutered>(checked_object); |  | 
|   6677     return New<HLoadNamedField>(object, checked_object, access); |  | 
|   6678   } |  | 
|   6679  |  | 
|   6680   if (info->name().is_identical_to(isolate()->factory()->prototype_string()) && |   6662   if (info->name().is_identical_to(isolate()->factory()->prototype_string()) && | 
|   6681       info->map()->IsJSFunctionMap() && info->map()->is_constructor()) { |   6663       info->map()->IsJSFunctionMap() && info->map()->is_constructor()) { | 
|   6682     DCHECK(!info->map()->has_non_instance_prototype()); |   6664     DCHECK(!info->map()->has_non_instance_prototype()); | 
|   6683     return New<HLoadFunctionPrototype>(checked_object); |   6665     return New<HLoadFunctionPrototype>(checked_object); | 
|   6684   } |   6666   } | 
|   6685  |   6667  | 
|   6686   HValue* checked_holder = checked_object; |   6668   HValue* checked_holder = checked_object; | 
|   6687   if (info->has_holder()) { |   6669   if (info->has_holder()) { | 
|   6688     Handle<JSObject> prototype(JSObject::cast(info->map()->prototype())); |   6670     Handle<JSObject> prototype(JSObject::cast(info->map()->prototype())); | 
|   6689     checked_holder = BuildCheckPrototypeMaps(prototype, info->holder()); |   6671     checked_holder = BuildCheckPrototypeMaps(prototype, info->holder()); | 
| (...skipping 7053 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  13743     isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |  13725     isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 
|  13744   } |  13726   } | 
|  13745  |  13727  | 
|  13746 #ifdef DEBUG |  13728 #ifdef DEBUG | 
|  13747   graph_->Verify(false);  // No full verify. |  13729   graph_->Verify(false);  // No full verify. | 
|  13748 #endif |  13730 #endif | 
|  13749 } |  13731 } | 
|  13750  |  13732  | 
|  13751 }  // namespace internal |  13733 }  // namespace internal | 
|  13752 }  // namespace v8 |  13734 }  // namespace v8 | 
| OLD | NEW |