14template <
typename sink
char>
20 for (
int i = 0;
i < array_length;
i++) {
27 if (encoded_slice > 0) {
42 int element_length =
string->length();
63 for (
int i = 0;
i < array_length;
i++) {
80 if (
i >= array_length)
return -1;
82 if (!
IsSmi(next_smi))
return -1;
84 if (
pos < 0)
return -1;
88 if (
pos > special_length || len > special_length -
pos)
return -1;
90 }
else if (IsString(elt)) {
92 int element_length = element->length();
94 if (*one_byte && !element->IsOneByteRepresentation()) {
109 :
array_(isolate->factory()->NewFixedArrayWithHoles(initial_capacity)),
111 has_non_smi_elements_(false) {
118 :
array_(backing_store),
length_(0), has_non_smi_elements_(false) {
125 :
array_(isolate->factory()->empty_fixed_array()),
127 has_non_smi_elements_(false) {}
135 int length =
array_->length();
136 int required_length =
length_ + elements;
137 return (length >= required_length);
141 int length =
array_->length();
142 int required_length =
length_ + elements;
143 if (length < required_length) {
145 constexpr int kInitialCapacityForLazy = 16;
146 array_ = isolate->factory()->NewFixedArrayWithHoles(
147 std::max(kInitialCapacityForLazy, elements));
156 isolate->factory()->NewFixedArrayWithHoles(
new_length);
179 int estimated_part_count)
181 array_builder_(
Isolate::FromHeap(
heap), estimated_part_count),
184 is_one_byte_(subject->IsOneByteRepresentation()) {
195 uint32_t length =
string->length();
197 if (!string->IsOneByteRepresentation()) {
206 return isolate->factory()->empty_string();
217 uint8_t* char_buffer = seq->GetChars(no_gc);
229 base::uc16* char_buffer = seq->GetChars(no_gc);
234 return joined_string;
246 encoding_(
String::ONE_BYTE_ENCODING),
248 part_length_(kInitialPartLength),
269 new_accumulator =
factory()->empty_string();
304 if (
isolate()->serializer_enabled()) {
316 const bool representation_ok =
333 0, string->length());
339 0, string->length());
static constexpr T decode(U value)
static V8_INLINE DirectHandle< T > New(Tagged< T > object, Isolate *isolate)
V8_WARN_UNUSED_RESULT HandleType< String >::MaybeType NewConsString(HandleType< String > left, HandleType< String > right, AllocationType allocation=AllocationType::kYoung)
V8_WARN_UNUSED_RESULT MaybeHandle< SeqOneByteString > NewRawOneByteString(int length, AllocationType allocation=AllocationType::kYoung)
V8_WARN_UNUSED_RESULT MaybeHandle< SeqTwoByteString > NewRawTwoByteString(int length, AllocationType allocation=AllocationType::kYoung)
Handle< String > InternalizeString(base::Vector< const char > str, bool convert_encoding=false)
void Add(Tagged< Object > value)
void EnsureCapacity(Isolate *isolate, int elements)
FixedArrayBuilder(Isolate *isolate, int initial_capacity)
DirectHandle< FixedArray > array()
DirectHandle< FixedArray > array_
static FixedArrayBuilder Lazy(Isolate *isolate)
bool HasCapacity(int elements)
bool has_non_smi_elements_
void CopyElements(Isolate *isolate, int dst_index, Tagged< FixedArray > src, int src_index, int len, WriteBarrierMode mode)
bool HasValidCurrentIndex() const
void Accumulate(DirectHandle< String > new_part)
String::Encoding encoding_
DirectHandle< String > current_part_
bool CanAppendByCopy(DirectHandle< String > string)
V8_INLINE DirectHandle< String > accumulator()
DirectHandle< String > accumulator_
V8_INLINE Factory * factory()
static const int kMaxPartLength
V8_INLINE DirectHandle< String > current_part()
static const int kPartLengthGrowthFactor
V8_INLINE void set_current_part(DirectHandle< String > string)
static const int kInitialPartLength
void AppendStringByCopy(DirectHandle< String > string)
MaybeDirectHandle< String > Finish()
V8_INLINE void ShrinkCurrentPart()
V8_INLINE void AppendString(std::string_view str)
IncrementalStringBuilder(Isolate *isolate)
V8_INLINE void set_accumulator(DirectHandle< String > string)
V8_INLINE bool CurrentPartCanFit(int length)
static Isolate * FromHeap(const Heap *heap)
ReplacementStringBuilder(Heap *heap, DirectHandle< String > subject, int estimated_part_count)
void EnsureCapacity(int elements)
MaybeDirectHandle< String > ToString()
uint32_t character_count_
void AddString(DirectHandle< String > string)
void AddElement(DirectHandle< Object > element)
FixedArrayBuilder array_builder_
DirectHandle< String > subject_
void IncrementCharacterCount(uint32_t by)
static constexpr int ToInt(const Tagged< Object > object)
static void WriteToFlat(Tagged< String > source, SinkCharT *sink, uint32_t start, uint32_t length)
static const uint32_t kMaxLength
static bool IsOneByteRepresentationUnderneath(Tagged< String > string)
#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call)
#define THROW_NEW_ERROR(isolate, call)
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
V8_INLINE IndirectHandle< T > indirect_handle(DirectHandle< T > handle)
void StringBuilderConcatHelper(Tagged< String > special, sinkchar *sink, Tagged< FixedArray > fixed_array, int array_length)
int StringBuilderConcatLength(int special_length, Tagged< FixedArray > fixed_array, int array_length, bool *one_byte)
template void StringBuilderConcatHelper< uint8_t >(Tagged< String > special, uint8_t *sink, Tagged< FixedArray > fixed_array, int array_length)
template void StringBuilderConcatHelper< base::uc16 >(Tagged< String > special, base::uc16 *sink, Tagged< FixedArray > fixed_array, int array_length)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
DirectHandle< String > subject_
base::Vector< const DirectHandle< Object > > array_
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)