1 // Copyright 2018 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_BUILTINS_GROWABLE_FIXED_ARRAY_GEN_H_ 6 #define V8_BUILTINS_GROWABLE_FIXED_ARRAY_GEN_H_ 7 8 #include "src/codegen/code-stub-assembler.h" 9 10 namespace v8 { 11 namespace internal { 12 13 14 // Utility class implementing a growable fixed array through CSA. 15 class GrowableFixedArray : public CodeStubAssembler { 16 public: GrowableFixedArray(compiler::CodeAssemblerState * state)17 explicit GrowableFixedArray(compiler::CodeAssemblerState* state) 18 : CodeStubAssembler(state), 19 var_array_(this), 20 var_length_(this), 21 var_capacity_(this) { 22 var_array_ = EmptyFixedArrayConstant(); 23 var_capacity_ = IntPtrConstant(0); 24 var_length_ = IntPtrConstant(0); 25 } 26 length()27 TNode<IntPtrT> length() const { return var_length_.value(); } 28 var_array()29 TVariable<FixedArray>* var_array() { return &var_array_; } var_length()30 TVariable<IntPtrT>* var_length() { return &var_length_; } var_capacity()31 TVariable<IntPtrT>* var_capacity() { return &var_capacity_; } 32 33 void Push(const TNode<Object> value); 34 35 TNode<FixedArray> ToFixedArray(); 36 TNode<JSArray> ToJSArray(const TNode<Context> context); 37 38 private: 39 TNode<IntPtrT> NewCapacity(TNode<IntPtrT> current_capacity); 40 41 // Creates a new array with {new_capacity} and copies the first 42 // {element_count} elements from the current array. 43 TNode<FixedArray> ResizeFixedArray(const TNode<IntPtrT> element_count, 44 const TNode<IntPtrT> new_capacity); 45 46 private: 47 TVariable<FixedArray> var_array_; 48 TVariable<IntPtrT> var_length_; 49 TVariable<IntPtrT> var_capacity_; 50 }; 51 52 } // namespace internal 53 } // namespace v8 54 55 #endif // V8_BUILTINS_GROWABLE_FIXED_ARRAY_GEN_H_ 56