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 #include "src/code-stub-assembler.h" | 4 #include "src/code-stub-assembler.h" |
5 #include "src/code-factory.h" | 5 #include "src/code-factory.h" |
6 #include "src/frames-inl.h" | 6 #include "src/frames-inl.h" |
7 #include "src/frames.h" | 7 #include "src/frames.h" |
8 #include "src/ic/handler-configuration.h" | 8 #include "src/ic/handler-configuration.h" |
9 #include "src/ic/stub-cache.h" | 9 #include "src/ic/stub-cache.h" |
10 | 10 |
(...skipping 2227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2238 // If size of the allocation for the new capacity doesn't fit in a page | 2238 // If size of the allocation for the new capacity doesn't fit in a page |
2239 // that we can bump-pointer allocate from, fall back to the runtime. | 2239 // that we can bump-pointer allocate from, fall back to the runtime. |
2240 int max_size = FixedArrayBase::GetMaxLengthForNewSpaceAllocation(to_kind); | 2240 int max_size = FixedArrayBase::GetMaxLengthForNewSpaceAllocation(to_kind); |
2241 GotoIf(UintPtrGreaterThanOrEqual(new_capacity, | 2241 GotoIf(UintPtrGreaterThanOrEqual(new_capacity, |
2242 IntPtrOrSmiConstant(max_size, mode)), | 2242 IntPtrOrSmiConstant(max_size, mode)), |
2243 bailout); | 2243 bailout); |
2244 | 2244 |
2245 // Allocate the new backing store. | 2245 // Allocate the new backing store. |
2246 Node* new_elements = AllocateFixedArray(to_kind, new_capacity, mode); | 2246 Node* new_elements = AllocateFixedArray(to_kind, new_capacity, mode); |
2247 | 2247 |
2248 // Fill in the added capacity in the new store with holes. | |
2249 FillFixedArrayWithValue(to_kind, new_elements, capacity, new_capacity, | |
2250 Heap::kTheHoleValueRootIndex, mode); | |
2251 | |
2252 // Copy the elements from the old elements store to the new. | 2248 // Copy the elements from the old elements store to the new. |
2253 // The size-check above guarantees that the |new_elements| is allocated | 2249 // The size-check above guarantees that the |new_elements| is allocated |
2254 // in new space so we can skip the write barrier. | 2250 // in new space so we can skip the write barrier. |
2255 CopyFixedArrayElements(from_kind, elements, to_kind, new_elements, capacity, | 2251 CopyFixedArrayElements(from_kind, elements, to_kind, new_elements, capacity, |
2256 new_capacity, SKIP_WRITE_BARRIER, mode); | 2252 new_capacity, SKIP_WRITE_BARRIER, mode); |
2257 | 2253 |
2258 StoreObjectField(object, JSObject::kElementsOffset, new_elements); | 2254 StoreObjectField(object, JSObject::kElementsOffset, new_elements); |
2259 Comment("] GrowElementsCapacity"); | 2255 Comment("] GrowElementsCapacity"); |
2260 return new_elements; | 2256 return new_elements; |
2261 } | 2257 } |
(...skipping 3009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5271 Bind(&done); | 5267 Bind(&done); |
5272 return var_intptr_key.value(); | 5268 return var_intptr_key.value(); |
5273 } | 5269 } |
5274 | 5270 |
5275 void CodeStubAssembler::EmitFastElementsBoundsCheck(Node* object, | 5271 void CodeStubAssembler::EmitFastElementsBoundsCheck(Node* object, |
5276 Node* elements, | 5272 Node* elements, |
5277 Node* intptr_index, | 5273 Node* intptr_index, |
5278 Node* is_jsarray_condition, | 5274 Node* is_jsarray_condition, |
5279 Label* miss) { | 5275 Label* miss) { |
5280 Variable var_length(this, MachineType::PointerRepresentation()); | 5276 Variable var_length(this, MachineType::PointerRepresentation()); |
| 5277 Comment("Fast elements bounds check"); |
5281 Label if_array(this), length_loaded(this, &var_length); | 5278 Label if_array(this), length_loaded(this, &var_length); |
5282 GotoIf(is_jsarray_condition, &if_array); | 5279 GotoIf(is_jsarray_condition, &if_array); |
5283 { | 5280 { |
5284 var_length.Bind(SmiUntag(LoadFixedArrayBaseLength(elements))); | 5281 var_length.Bind(SmiUntag(LoadFixedArrayBaseLength(elements))); |
5285 Goto(&length_loaded); | 5282 Goto(&length_loaded); |
5286 } | 5283 } |
5287 Bind(&if_array); | 5284 Bind(&if_array); |
5288 { | 5285 { |
5289 var_length.Bind(SmiUntag(LoadJSArrayLength(object))); | 5286 var_length.Bind(SmiUntag(LoadJSArrayLength(object))); |
5290 Goto(&length_loaded); | 5287 Goto(&length_loaded); |
5291 } | 5288 } |
5292 Bind(&length_loaded); | 5289 Bind(&length_loaded); |
5293 GotoUnless(UintPtrLessThan(intptr_index, var_length.value()), miss); | 5290 GotoUnless(UintPtrLessThan(intptr_index, var_length.value()), miss); |
5294 } | 5291 } |
5295 | 5292 |
5296 void CodeStubAssembler::EmitElementLoad(Node* object, Node* elements, | 5293 void CodeStubAssembler::EmitElementLoad(Node* object, Node* elements, |
5297 Node* elements_kind, Node* intptr_index, | 5294 Node* elements_kind, Node* intptr_index, |
5298 Node* is_jsarray_condition, | 5295 Node* is_jsarray_condition, |
5299 Label* if_hole, Label* rebox_double, | 5296 Label* if_hole, Label* rebox_double, |
5300 Variable* var_double_value, | 5297 Variable* var_double_value, |
5301 Label* unimplemented_elements_kind, | 5298 Label* unimplemented_elements_kind, |
5302 Label* out_of_bounds, Label* miss) { | 5299 Label* out_of_bounds, Label* miss) { |
5303 Label if_typed_array(this), if_fast_packed(this), if_fast_holey(this), | 5300 Label if_typed_array(this), if_fast_packed(this), if_fast_holey(this), |
5304 if_fast_double(this), if_fast_holey_double(this), if_nonfast(this), | 5301 if_fast_double(this), if_fast_holey_double(this), if_nonfast(this), |
5305 if_dictionary(this), unreachable(this); | 5302 if_dictionary(this); |
5306 GotoIf( | 5303 GotoIf( |
5307 IntPtrGreaterThan(elements_kind, IntPtrConstant(LAST_FAST_ELEMENTS_KIND)), | 5304 IntPtrGreaterThan(elements_kind, IntPtrConstant(LAST_FAST_ELEMENTS_KIND)), |
5308 &if_nonfast); | 5305 &if_nonfast); |
5309 | 5306 |
5310 EmitFastElementsBoundsCheck(object, elements, intptr_index, | 5307 EmitFastElementsBoundsCheck(object, elements, intptr_index, |
5311 is_jsarray_condition, out_of_bounds); | 5308 is_jsarray_condition, out_of_bounds); |
5312 int32_t kinds[] = {// Handled by if_fast_packed. | 5309 int32_t kinds[] = {// Handled by if_fast_packed. |
5313 FAST_SMI_ELEMENTS, FAST_ELEMENTS, | 5310 FAST_SMI_ELEMENTS, FAST_ELEMENTS, |
5314 // Handled by if_fast_holey. | 5311 // Handled by if_fast_holey. |
5315 FAST_HOLEY_SMI_ELEMENTS, FAST_HOLEY_ELEMENTS, | 5312 FAST_HOLEY_SMI_ELEMENTS, FAST_HOLEY_ELEMENTS, |
(...skipping 3597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8913 } | 8910 } |
8914 | 8911 |
8915 void CodeStubArguments::PopAndReturn(compiler::Node* value) { | 8912 void CodeStubArguments::PopAndReturn(compiler::Node* value) { |
8916 assembler_->PopAndReturn( | 8913 assembler_->PopAndReturn( |
8917 assembler_->IntPtrAddFoldConstants(argc_, assembler_->IntPtrConstant(1)), | 8914 assembler_->IntPtrAddFoldConstants(argc_, assembler_->IntPtrConstant(1)), |
8918 value); | 8915 value); |
8919 } | 8916 } |
8920 | 8917 |
8921 } // namespace internal | 8918 } // namespace internal |
8922 } // namespace v8 | 8919 } // namespace v8 |
OLD | NEW |