| 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 3149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3160 HValue* HGraphBuilder::BuildArrayBufferViewFieldAccessor(HValue* object, | 3160 HValue* HGraphBuilder::BuildArrayBufferViewFieldAccessor(HValue* object, |
| 3161 HValue* checked_object, | 3161 HValue* checked_object, |
| 3162 FieldIndex index) { | 3162 FieldIndex index) { |
| 3163 NoObservableSideEffectsScope scope(this); | 3163 NoObservableSideEffectsScope scope(this); |
| 3164 HObjectAccess access = HObjectAccess::ForObservableJSObjectOffset( | 3164 HObjectAccess access = HObjectAccess::ForObservableJSObjectOffset( |
| 3165 index.offset(), Representation::Tagged()); | 3165 index.offset(), Representation::Tagged()); |
| 3166 HInstruction* buffer = Add<HLoadNamedField>( | 3166 HInstruction* buffer = Add<HLoadNamedField>( |
| 3167 object, checked_object, HObjectAccess::ForJSArrayBufferViewBuffer()); | 3167 object, checked_object, HObjectAccess::ForJSArrayBufferViewBuffer()); |
| 3168 HInstruction* field = Add<HLoadNamedField>(object, checked_object, access); | 3168 HInstruction* field = Add<HLoadNamedField>(object, checked_object, access); |
| 3169 | 3169 |
| 3170 IfBuilder if_has_buffer(this); | 3170 HInstruction* flags = Add<HLoadNamedField>( |
| 3171 HValue* has_buffer = if_has_buffer.IfNot<HIsSmiAndBranch>(buffer); | 3171 buffer, nullptr, HObjectAccess::ForJSArrayBufferBitField()); |
| 3172 if_has_buffer.Then(); | 3172 HValue* was_neutered_mask = |
| 3173 { | 3173 Add<HConstant>(1 << JSArrayBuffer::WasNeutered::kShift); |
| 3174 HInstruction* flags = Add<HLoadNamedField>( | 3174 HValue* was_neutered_test = |
| 3175 buffer, has_buffer, HObjectAccess::ForJSArrayBufferBitField()); | 3175 AddUncasted<HBitwise>(Token::BIT_AND, flags, was_neutered_mask); |
| 3176 HValue* was_neutered_mask = | |
| 3177 Add<HConstant>(1 << JSArrayBuffer::WasNeutered::kShift); | |
| 3178 HValue* was_neutered_test = | |
| 3179 AddUncasted<HBitwise>(Token::BIT_AND, flags, was_neutered_mask); | |
| 3180 | 3176 |
| 3181 IfBuilder if_was_neutered(this); | 3177 IfBuilder if_was_neutered(this); |
| 3182 if_was_neutered.If<HCompareNumericAndBranch>( | 3178 if_was_neutered.If<HCompareNumericAndBranch>( |
| 3183 was_neutered_test, graph()->GetConstant0(), Token::NE); | 3179 was_neutered_test, graph()->GetConstant0(), Token::NE); |
| 3184 if_was_neutered.Then(); | 3180 if_was_neutered.Then(); |
| 3185 Push(graph()->GetConstant0()); | 3181 Push(graph()->GetConstant0()); |
| 3186 if_was_neutered.Else(); | 3182 if_was_neutered.Else(); |
| 3187 Push(field); | |
| 3188 if_was_neutered.End(); | |
| 3189 } | |
| 3190 if_has_buffer.Else(); | |
| 3191 Push(field); | 3183 Push(field); |
| 3192 if_has_buffer.End(); | 3184 if_was_neutered.End(); |
| 3193 | 3185 |
| 3194 return Pop(); | 3186 return Pop(); |
| 3195 } | 3187 } |
| 3196 | 3188 |
| 3197 | 3189 |
| 3198 HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder, | 3190 HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder, |
| 3199 ElementsKind kind, | 3191 ElementsKind kind, |
| 3200 HValue* allocation_site_payload, | 3192 HValue* allocation_site_payload, |
| 3201 HValue* constructor_function, | 3193 HValue* constructor_function, |
| 3202 AllocationSiteOverrideMode override_mode) : | 3194 AllocationSiteOverrideMode override_mode) : |
| (...skipping 6492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9695 // argument to the construct call. | 9687 // argument to the construct call. |
| 9696 if (TryHandleArrayCallNew(expr, function)) return; | 9688 if (TryHandleArrayCallNew(expr, function)) return; |
| 9697 | 9689 |
| 9698 HInstruction* call = | 9690 HInstruction* call = |
| 9699 PreProcessCall(New<HCallNew>(function, argument_count)); | 9691 PreProcessCall(New<HCallNew>(function, argument_count)); |
| 9700 return ast_context()->ReturnInstruction(call, expr->id()); | 9692 return ast_context()->ReturnInstruction(call, expr->id()); |
| 9701 } | 9693 } |
| 9702 } | 9694 } |
| 9703 | 9695 |
| 9704 | 9696 |
| 9697 HValue* HGraphBuilder::BuildAllocateEmptyArrayBuffer(HValue* byte_length) { |
| 9698 HAllocate* result = |
| 9699 BuildAllocate(Add<HConstant>(JSArrayBuffer::kSizeWithInternalFields), |
| 9700 HType::JSObject(), JS_ARRAY_BUFFER_TYPE, HAllocationMode()); |
| 9701 |
| 9702 HValue* global_object = Add<HLoadNamedField>( |
| 9703 context(), nullptr, |
| 9704 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); |
| 9705 HValue* native_context = Add<HLoadNamedField>( |
| 9706 global_object, nullptr, HObjectAccess::ForGlobalObjectNativeContext()); |
| 9707 Add<HStoreNamedField>( |
| 9708 result, HObjectAccess::ForMap(), |
| 9709 Add<HLoadNamedField>( |
| 9710 native_context, nullptr, |
| 9711 HObjectAccess::ForContextSlot(Context::ARRAY_BUFFER_MAP_INDEX))); |
| 9712 |
| 9713 Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferBackingStore(), |
| 9714 Add<HConstant>(ExternalReference())); |
| 9715 Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferByteLength(), |
| 9716 byte_length); |
| 9717 Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferBitFieldSlot(), |
| 9718 graph()->GetConstant0()); |
| 9719 Add<HStoreNamedField>( |
| 9720 result, HObjectAccess::ForJSArrayBufferBitField(), |
| 9721 Add<HConstant>((1 << JSArrayBuffer::IsExternal::kShift) | |
| 9722 (1 << JSArrayBuffer::IsNeuterable::kShift))); |
| 9723 |
| 9724 for (int field = 0; field < v8::ArrayBuffer::kInternalFieldCount; ++field) { |
| 9725 Add<HStoreNamedField>( |
| 9726 result, |
| 9727 HObjectAccess::ForObservableJSObjectOffset( |
| 9728 JSArrayBuffer::kSize + field * kPointerSize, Representation::Smi()), |
| 9729 graph()->GetConstant0()); |
| 9730 } |
| 9731 |
| 9732 return result; |
| 9733 } |
| 9734 |
| 9735 |
| 9705 template <class ViewClass> | 9736 template <class ViewClass> |
| 9706 void HGraphBuilder::BuildArrayBufferViewInitialization( | 9737 void HGraphBuilder::BuildArrayBufferViewInitialization( |
| 9707 HValue* obj, | 9738 HValue* obj, |
| 9708 HValue* buffer, | 9739 HValue* buffer, |
| 9709 HValue* byte_offset, | 9740 HValue* byte_offset, |
| 9710 HValue* byte_length) { | 9741 HValue* byte_length) { |
| 9711 | 9742 |
| 9712 for (int offset = ViewClass::kSize; | 9743 for (int offset = ViewClass::kSize; |
| 9713 offset < ViewClass::kSizeWithInternalFields; | 9744 offset < ViewClass::kSizeWithInternalFields; |
| 9714 offset += kPointerSize) { | 9745 offset += kPointerSize) { |
| 9715 Add<HStoreNamedField>(obj, | 9746 Add<HStoreNamedField>(obj, |
| 9716 HObjectAccess::ForObservableJSObjectOffset(offset), | 9747 HObjectAccess::ForObservableJSObjectOffset(offset), |
| 9717 graph()->GetConstant0()); | 9748 graph()->GetConstant0()); |
| 9718 } | 9749 } |
| 9719 | 9750 |
| 9720 Add<HStoreNamedField>( | 9751 Add<HStoreNamedField>( |
| 9721 obj, | 9752 obj, |
| 9722 HObjectAccess::ForJSArrayBufferViewByteOffset(), | 9753 HObjectAccess::ForJSArrayBufferViewByteOffset(), |
| 9723 byte_offset); | 9754 byte_offset); |
| 9724 Add<HStoreNamedField>( | 9755 Add<HStoreNamedField>( |
| 9725 obj, | 9756 obj, |
| 9726 HObjectAccess::ForJSArrayBufferViewByteLength(), | 9757 HObjectAccess::ForJSArrayBufferViewByteLength(), |
| 9727 byte_length); | 9758 byte_length); |
| 9728 | 9759 Add<HStoreNamedField>(obj, HObjectAccess::ForJSArrayBufferViewBuffer(), |
| 9729 if (buffer != NULL) { | 9760 buffer); |
| 9730 Add<HStoreNamedField>( | |
| 9731 obj, | |
| 9732 HObjectAccess::ForJSArrayBufferViewBuffer(), buffer); | |
| 9733 } else { | |
| 9734 Add<HStoreNamedField>( | |
| 9735 obj, | |
| 9736 HObjectAccess::ForJSArrayBufferViewBuffer(), | |
| 9737 Add<HConstant>(static_cast<int32_t>(0))); | |
| 9738 } | |
| 9739 } | 9761 } |
| 9740 | 9762 |
| 9741 | 9763 |
| 9742 void HOptimizedGraphBuilder::GenerateDataViewInitialize( | 9764 void HOptimizedGraphBuilder::GenerateDataViewInitialize( |
| 9743 CallRuntime* expr) { | 9765 CallRuntime* expr) { |
| 9744 ZoneList<Expression*>* arguments = expr->arguments(); | 9766 ZoneList<Expression*>* arguments = expr->arguments(); |
| 9745 | 9767 |
| 9746 DCHECK(arguments->length()== 4); | 9768 DCHECK(arguments->length()== 4); |
| 9747 CHECK_ALIVE(VisitForValue(arguments->at(0))); | 9769 CHECK_ALIVE(VisitForValue(arguments->at(0))); |
| 9748 HValue* obj = Pop(); | 9770 HValue* obj = Pop(); |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9950 ElementsKind fixed_elements_kind = // Bogus initialization. | 9972 ElementsKind fixed_elements_kind = // Bogus initialization. |
| 9951 INT8_ELEMENTS; | 9973 INT8_ELEMENTS; |
| 9952 Runtime::ArrayIdToTypeAndSize(array_id, | 9974 Runtime::ArrayIdToTypeAndSize(array_id, |
| 9953 &array_type, | 9975 &array_type, |
| 9954 &external_elements_kind, | 9976 &external_elements_kind, |
| 9955 &fixed_elements_kind, | 9977 &fixed_elements_kind, |
| 9956 &element_size); | 9978 &element_size); |
| 9957 | 9979 |
| 9958 | 9980 |
| 9959 { // byte_offset is Smi. | 9981 { // byte_offset is Smi. |
| 9960 BuildArrayBufferViewInitialization<JSTypedArray>( | 9982 HValue* allocated_buffer = buffer; |
| 9961 obj, buffer, byte_offset, byte_length); | 9983 if (buffer == NULL) { |
| 9984 allocated_buffer = BuildAllocateEmptyArrayBuffer(byte_length); |
| 9985 } |
| 9986 BuildArrayBufferViewInitialization<JSTypedArray>(obj, allocated_buffer, |
| 9987 byte_offset, byte_length); |
| 9962 | 9988 |
| 9963 | 9989 |
| 9964 HInstruction* length = AddUncasted<HDiv>(byte_length, | 9990 HInstruction* length = AddUncasted<HDiv>(byte_length, |
| 9965 Add<HConstant>(static_cast<int32_t>(element_size))); | 9991 Add<HConstant>(static_cast<int32_t>(element_size))); |
| 9966 | 9992 |
| 9967 Add<HStoreNamedField>(obj, | 9993 Add<HStoreNamedField>(obj, |
| 9968 HObjectAccess::ForJSTypedArrayLength(), | 9994 HObjectAccess::ForJSTypedArrayLength(), |
| 9969 length); | 9995 length); |
| 9970 | 9996 |
| 9971 HValue* elements; | 9997 HValue* elements; |
| (...skipping 3138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13110 if (ShouldProduceTraceOutput()) { | 13136 if (ShouldProduceTraceOutput()) { |
| 13111 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13137 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13112 } | 13138 } |
| 13113 | 13139 |
| 13114 #ifdef DEBUG | 13140 #ifdef DEBUG |
| 13115 graph_->Verify(false); // No full verify. | 13141 graph_->Verify(false); // No full verify. |
| 13116 #endif | 13142 #endif |
| 13117 } | 13143 } |
| 13118 | 13144 |
| 13119 } } // namespace v8::internal | 13145 } } // namespace v8::internal |
| OLD | NEW |