OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/code-stub-assembler.h" | 5 #include "src/code-stub-assembler.h" |
6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
7 #include "src/frames-inl.h" | 7 #include "src/frames-inl.h" |
8 #include "src/frames.h" | 8 #include "src/frames.h" |
9 #include "src/ic/stub-cache.h" | 9 #include "src/ic/stub-cache.h" |
10 | 10 |
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 return StoreNoWriteBarrier(rep, object, | 884 return StoreNoWriteBarrier(rep, object, |
885 IntPtrConstant(offset - kHeapObjectTag), value); | 885 IntPtrConstant(offset - kHeapObjectTag), value); |
886 } | 886 } |
887 | 887 |
888 Node* CodeStubAssembler::StoreMapNoWriteBarrier(Node* object, Node* map) { | 888 Node* CodeStubAssembler::StoreMapNoWriteBarrier(Node* object, Node* map) { |
889 return StoreNoWriteBarrier( | 889 return StoreNoWriteBarrier( |
890 MachineRepresentation::kTagged, object, | 890 MachineRepresentation::kTagged, object, |
891 IntPtrConstant(HeapNumber::kMapOffset - kHeapObjectTag), map); | 891 IntPtrConstant(HeapNumber::kMapOffset - kHeapObjectTag), map); |
892 } | 892 } |
893 | 893 |
| 894 Node* CodeStubAssembler::StoreObjectFieldRoot(Node* object, int offset, |
| 895 Heap::RootListIndex root_index) { |
| 896 if (Heap::RootIsImmortalImmovable(root_index)) { |
| 897 return StoreObjectFieldNoWriteBarrier(object, offset, LoadRoot(root_index)); |
| 898 } else { |
| 899 return StoreObjectField(object, offset, LoadRoot(root_index)); |
| 900 } |
| 901 } |
| 902 |
894 Node* CodeStubAssembler::StoreFixedArrayElement(Node* object, Node* index_node, | 903 Node* CodeStubAssembler::StoreFixedArrayElement(Node* object, Node* index_node, |
895 Node* value, | 904 Node* value, |
896 WriteBarrierMode barrier_mode, | 905 WriteBarrierMode barrier_mode, |
897 ParameterMode parameter_mode) { | 906 ParameterMode parameter_mode) { |
898 DCHECK(barrier_mode == SKIP_WRITE_BARRIER || | 907 DCHECK(barrier_mode == SKIP_WRITE_BARRIER || |
899 barrier_mode == UPDATE_WRITE_BARRIER); | 908 barrier_mode == UPDATE_WRITE_BARRIER); |
900 Node* offset = | 909 Node* offset = |
901 ElementOffsetFromIndex(index_node, FAST_HOLEY_ELEMENTS, parameter_mode, | 910 ElementOffsetFromIndex(index_node, FAST_HOLEY_ELEMENTS, parameter_mode, |
902 FixedArray::kHeaderSize - kHeapObjectTag); | 911 FixedArray::kHeaderSize - kHeapObjectTag); |
903 MachineRepresentation rep = MachineRepresentation::kTagged; | 912 MachineRepresentation rep = MachineRepresentation::kTagged; |
(...skipping 2343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3247 Bind(&next); | 3256 Bind(&next); |
3248 { | 3257 { |
3249 // For all objects but the receiver, check that the cache is empty. | 3258 // For all objects but the receiver, check that the cache is empty. |
3250 current_map.Bind(LoadMap(current_js_object.value())); | 3259 current_map.Bind(LoadMap(current_js_object.value())); |
3251 Node* enum_length = EnumLength(current_map.value()); | 3260 Node* enum_length = EnumLength(current_map.value()); |
3252 Node* zero_constant = SmiConstant(Smi::FromInt(0)); | 3261 Node* zero_constant = SmiConstant(Smi::FromInt(0)); |
3253 BranchIf(WordEqual(enum_length, zero_constant), &loop, use_runtime); | 3262 BranchIf(WordEqual(enum_length, zero_constant), &loop, use_runtime); |
3254 } | 3263 } |
3255 } | 3264 } |
3256 | 3265 |
| 3266 Node* CodeStubAssembler::CreateWeakCellInFeedbackVector(Node* feedback_vector, |
| 3267 Node* slot, |
| 3268 Node* value) { |
| 3269 Node* size = IntPtrConstant(WeakCell::kSize); |
| 3270 Node* cell = Allocate(size, compiler::CodeAssembler::kPretenured); |
| 3271 |
| 3272 // Initialize the WeakCell. |
| 3273 StoreObjectFieldRoot(cell, WeakCell::kMapOffset, Heap::kWeakCellMapRootIndex); |
| 3274 StoreObjectField(cell, WeakCell::kValueOffset, value); |
| 3275 StoreObjectFieldRoot(cell, WeakCell::kNextOffset, |
| 3276 Heap::kTheHoleValueRootIndex); |
| 3277 |
| 3278 // Store the WeakCell in the feedback vector. |
| 3279 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, |
| 3280 CodeStubAssembler::SMI_PARAMETERS); |
| 3281 return cell; |
| 3282 } |
| 3283 |
3257 } // namespace internal | 3284 } // namespace internal |
3258 } // namespace v8 | 3285 } // namespace v8 |
OLD | NEW |