5 #include "src/builtins/growable-fixed-array-gen.h" 7 #include "src/compiler/code-assembler.h" 12 void GrowableFixedArray::Push(TNode<Object>
const value) {
13 TNode<IntPtrT>
const length = var_length_.value();
14 TNode<IntPtrT>
const capacity = var_capacity_.value();
16 Label grow(
this), store(
this);
17 Branch(IntPtrEqual(capacity, length), &grow, &store);
21 var_capacity_ = NewCapacity(capacity);
22 var_array_ = ResizeFixedArray(length, var_capacity_.value());
29 TNode<FixedArray>
const array = var_array_.value();
30 StoreFixedArrayElement(array, length, value);
32 var_length_ = IntPtrAdd(length, IntPtrConstant(1));
36 TNode<JSArray> GrowableFixedArray::ToJSArray(TNode<Context>
const context) {
37 const ElementsKind kind = PACKED_ELEMENTS;
39 TNode<Context>
const native_context = LoadNativeContext(context);
40 TNode<Map>
const array_map = LoadJSArrayElementsMap(kind, native_context);
46 TNode<IntPtrT>
const length = var_length_.value();
47 TNode<IntPtrT>
const capacity = var_capacity_.value();
49 GotoIf(WordEqual(length, capacity), &next);
51 var_array_ = ResizeFixedArray(length, length);
52 var_capacity_ = length;
58 TNode<Smi>
const result_length = SmiTag(length());
59 TNode<JSArray>
const result = AllocateUninitializedJSArrayWithoutElements(
60 array_map, result_length,
nullptr);
62 StoreObjectField(result, JSObject::kElementsOffset, var_array_.value());
67 TNode<IntPtrT> GrowableFixedArray::NewCapacity(
68 TNode<IntPtrT> current_capacity) {
70 IntPtrGreaterThanOrEqual(current_capacity, IntPtrConstant(0)));
75 TNode<IntPtrT>
const new_capacity =
76 IntPtrAdd(IntPtrAdd(current_capacity, WordShr(current_capacity, 1)),
82 TNode<FixedArray> GrowableFixedArray::ResizeFixedArray(
83 TNode<IntPtrT>
const element_count, TNode<IntPtrT>
const new_capacity) {
84 CSA_ASSERT(
this, IntPtrGreaterThanOrEqual(element_count, IntPtrConstant(0)));
85 CSA_ASSERT(
this, IntPtrGreaterThanOrEqual(new_capacity, IntPtrConstant(0)));
86 CSA_ASSERT(
this, IntPtrGreaterThanOrEqual(new_capacity, element_count));
88 TNode<FixedArray>
const from_array = var_array_.value();
90 CodeStubAssembler::ExtractFixedArrayFlags flags;
91 flags |= CodeStubAssembler::ExtractFixedArrayFlag::kFixedArrays;
92 TNode<FixedArray> to_array = CAST(ExtractFixedArray(
93 from_array,
nullptr, element_count, new_capacity, flags));