| 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 6054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6065 LookupDescriptor(*map, *name_); | 6065 LookupDescriptor(*map, *name_); |
| 6066 if (IsFound()) return LoadResult(map); | 6066 if (IsFound()) return LoadResult(map); |
| 6067 } | 6067 } |
| 6068 NotFound(); | 6068 NotFound(); |
| 6069 return true; | 6069 return true; |
| 6070 } | 6070 } |
| 6071 | 6071 |
| 6072 | 6072 |
| 6073 bool HOptimizedGraphBuilder::PropertyAccessInfo::IsIntegerIndexedExotic() { | 6073 bool HOptimizedGraphBuilder::PropertyAccessInfo::IsIntegerIndexedExotic() { |
| 6074 InstanceType instance_type = map_->instance_type(); | 6074 InstanceType instance_type = map_->instance_type(); |
| 6075 return instance_type == JS_TYPED_ARRAY_TYPE && | 6075 return (instance_type == JS_TYPED_ARRAY_TYPE || |
| 6076 instance_type == JS_SHARED_TYPED_ARRAY_TYPE) && |
| 6076 IsSpecialIndex(isolate()->unicode_cache(), *name_); | 6077 IsSpecialIndex(isolate()->unicode_cache(), *name_); |
| 6077 } | 6078 } |
| 6078 | 6079 |
| 6079 | 6080 |
| 6080 bool HOptimizedGraphBuilder::PropertyAccessInfo::CanAccessMonomorphic() { | 6081 bool HOptimizedGraphBuilder::PropertyAccessInfo::CanAccessMonomorphic() { |
| 6081 if (!CanInlinePropertyAccess(map_)) return false; | 6082 if (!CanInlinePropertyAccess(map_)) return false; |
| 6082 if (IsJSObjectFieldAccessor()) return IsLoad(); | 6083 if (IsJSObjectFieldAccessor()) return IsLoad(); |
| 6083 if (map_->function_with_prototype() && !map_->has_non_instance_prototype() && | 6084 if (map_->function_with_prototype() && !map_->has_non_instance_prototype() && |
| 6084 name_.is_identical_to(isolate()->factory()->prototype_string())) { | 6085 name_.is_identical_to(isolate()->factory()->prototype_string())) { |
| 6085 return IsLoad(); | 6086 return IsLoad(); |
| (...skipping 3628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9714 | 9715 |
| 9715 void HOptimizedGraphBuilder::GenerateTypedArrayInitialize( | 9716 void HOptimizedGraphBuilder::GenerateTypedArrayInitialize( |
| 9716 CallRuntime* expr) { | 9717 CallRuntime* expr) { |
| 9717 ZoneList<Expression*>* arguments = expr->arguments(); | 9718 ZoneList<Expression*>* arguments = expr->arguments(); |
| 9718 | 9719 |
| 9719 static const int kObjectArg = 0; | 9720 static const int kObjectArg = 0; |
| 9720 static const int kArrayIdArg = 1; | 9721 static const int kArrayIdArg = 1; |
| 9721 static const int kBufferArg = 2; | 9722 static const int kBufferArg = 2; |
| 9722 static const int kByteOffsetArg = 3; | 9723 static const int kByteOffsetArg = 3; |
| 9723 static const int kByteLengthArg = 4; | 9724 static const int kByteLengthArg = 4; |
| 9724 static const int kArgsLength = 5; | 9725 static const int kIsSharedArg = 5; |
| 9726 static const int kArgsLength = 6; |
| 9725 DCHECK(arguments->length() == kArgsLength); | 9727 DCHECK(arguments->length() == kArgsLength); |
| 9726 | 9728 |
| 9727 | 9729 |
| 9728 CHECK_ALIVE(VisitForValue(arguments->at(kObjectArg))); | 9730 CHECK_ALIVE(VisitForValue(arguments->at(kObjectArg))); |
| 9729 HValue* obj = Pop(); | 9731 HValue* obj = Pop(); |
| 9730 | 9732 |
| 9731 if (arguments->at(kArrayIdArg)->IsLiteral()) { | 9733 if (arguments->at(kArrayIdArg)->IsLiteral()) { |
| 9732 // This should never happen in real use, but can happen when fuzzing. | 9734 // This should never happen in real use, but can happen when fuzzing. |
| 9733 // Just bail out. | 9735 // Just bail out. |
| 9734 Bailout(kNeedSmiLiteral); | 9736 Bailout(kNeedSmiLiteral); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 9763 } else { | 9765 } else { |
| 9764 CHECK_ALIVE(VisitForValue(arguments->at(kByteOffsetArg))); | 9766 CHECK_ALIVE(VisitForValue(arguments->at(kByteOffsetArg))); |
| 9765 byte_offset = Pop(); | 9767 byte_offset = Pop(); |
| 9766 is_zero_byte_offset = false; | 9768 is_zero_byte_offset = false; |
| 9767 DCHECK(buffer != NULL); | 9769 DCHECK(buffer != NULL); |
| 9768 } | 9770 } |
| 9769 | 9771 |
| 9770 CHECK_ALIVE(VisitForValue(arguments->at(kByteLengthArg))); | 9772 CHECK_ALIVE(VisitForValue(arguments->at(kByteLengthArg))); |
| 9771 HValue* byte_length = Pop(); | 9773 HValue* byte_length = Pop(); |
| 9772 | 9774 |
| 9775 CHECK_ALIVE(VisitForValue(arguments->at(kIsSharedArg))); |
| 9776 HValue* is_shared = Pop(); |
| 9777 |
| 9773 NoObservableSideEffectsScope scope(this); | 9778 NoObservableSideEffectsScope scope(this); |
| 9774 IfBuilder byte_offset_smi(this); | 9779 IfBuilder byte_offset_smi(this); |
| 9775 | 9780 |
| 9776 if (!is_zero_byte_offset) { | 9781 if (!is_zero_byte_offset) { |
| 9777 byte_offset_smi.If<HIsSmiAndBranch>(byte_offset); | 9782 byte_offset_smi.If<HIsSmiAndBranch>(byte_offset); |
| 9778 byte_offset_smi.Then(); | 9783 byte_offset_smi.Then(); |
| 9779 } | 9784 } |
| 9780 | 9785 |
| 9781 ExternalArrayType array_type = | 9786 ExternalArrayType array_type = |
| 9782 kExternalInt8Array; // Bogus initialization. | 9787 kExternalInt8Array; // Bogus initialization. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 9797 obj, buffer, byte_offset, byte_length); | 9802 obj, buffer, byte_offset, byte_length); |
| 9798 | 9803 |
| 9799 | 9804 |
| 9800 HInstruction* length = AddUncasted<HDiv>(byte_length, | 9805 HInstruction* length = AddUncasted<HDiv>(byte_length, |
| 9801 Add<HConstant>(static_cast<int32_t>(element_size))); | 9806 Add<HConstant>(static_cast<int32_t>(element_size))); |
| 9802 | 9807 |
| 9803 Add<HStoreNamedField>(obj, | 9808 Add<HStoreNamedField>(obj, |
| 9804 HObjectAccess::ForJSTypedArrayLength(), | 9809 HObjectAccess::ForJSTypedArrayLength(), |
| 9805 length); | 9810 length); |
| 9806 | 9811 |
| 9812 Add<HStoreNamedField>(obj, HObjectAccess::ForJSTypedArrayIsShared(), |
| 9813 is_shared); |
| 9814 |
| 9807 HValue* elements; | 9815 HValue* elements; |
| 9808 if (buffer != NULL) { | 9816 if (buffer != NULL) { |
| 9809 elements = BuildAllocateExternalElements( | 9817 elements = BuildAllocateExternalElements( |
| 9810 array_type, is_zero_byte_offset, buffer, byte_offset, length); | 9818 array_type, is_zero_byte_offset, buffer, byte_offset, length); |
| 9811 Handle<Map> obj_map = TypedArrayMap( | 9819 Handle<Map> obj_map = TypedArrayMap( |
| 9812 isolate(), array_type, external_elements_kind); | 9820 isolate(), array_type, external_elements_kind); |
| 9813 AddStoreMapConstant(obj, obj_map); | 9821 AddStoreMapConstant(obj, obj_map); |
| 9814 } else { | 9822 } else { |
| 9815 DCHECK(is_zero_byte_offset); | 9823 DCHECK(is_zero_byte_offset); |
| 9816 elements = BuildAllocateFixedTypedArray( | 9824 elements = BuildAllocateFixedTypedArray( |
| (...skipping 3105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12922 if (ShouldProduceTraceOutput()) { | 12930 if (ShouldProduceTraceOutput()) { |
| 12923 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 12931 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 12924 } | 12932 } |
| 12925 | 12933 |
| 12926 #ifdef DEBUG | 12934 #ifdef DEBUG |
| 12927 graph_->Verify(false); // No full verify. | 12935 graph_->Verify(false); // No full verify. |
| 12928 #endif | 12936 #endif |
| 12929 } | 12937 } |
| 12930 | 12938 |
| 12931 } } // namespace v8::internal | 12939 } } // namespace v8::internal |
| OLD | NEW |