v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
string-view.h
Go to the documentation of this file.
1// Copyright 2024 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_COMPILER_TURBOSHAFT_STRING_VIEW_H_
6#define V8_COMPILER_TURBOSHAFT_STRING_VIEW_H_
7
9
11
12// `StringView` implements the `ForeachIterable` concept for iterating the
13// characters of a string.
15 public:
18
19 StringView(const DisallowGarbageCollection& can_rely_on_no_gc,
20 V<String> string, String::Encoding encoding,
21 ConstOrV<WordPtr> start_index = 0,
22 ConstOrV<WordPtr> character_count = V<WordPtr>::Invalid())
23 : string_(string),
24 encoding_(encoding),
25 start_index_(start_index),
26 character_count_(character_count),
27 can_rely_on_no_gc_(&can_rely_on_no_gc) {}
28
30 ConstOrV<WordPtr> start_index = 0,
31 ConstOrV<WordPtr> character_count = V<WordPtr>::Invalid())
32 : string_(string),
33 encoding_(encoding),
34 start_index_(start_index),
35 character_count_(character_count),
36 can_rely_on_no_gc_(nullptr) {}
37
38 template <typename A>
39 iterator_type Begin(A& assembler) {
42 const size_t data_offset = OFFSET_OF_DATA_START(SeqOneByteString);
43 const int stride = (encoding_ == String::ONE_BYTE_ENCODING ? 1 : 2);
44 if (can_rely_on_no_gc_ == nullptr) {
45 // TODO(nicohartmann): If we cannot rely on no GC happening during
46 // iteration, we cannot operate on raw inner pointers but have to
47 // recompute the character address from the base on each dereferencing.
49 }
50 V<WordPtr> begin_offset = assembler.WordPtrAdd(
51 assembler.BitcastTaggedToWordPtr(string_),
52 assembler.WordPtrAdd(
53 data_offset - kHeapObjectTag,
54 assembler.WordPtrMul(assembler.resolve(start_index_), stride)));
57 count = assembler.resolve(character_count_);
58 } else if (character_count_.value().valid()) {
60 } else {
61 // TODO(nicohartmann): Load from string.
63 }
65 assembler.WordPtrAdd(begin_offset, assembler.WordPtrMul(count, stride));
66 return begin_offset;
67 }
68
69 template <typename A>
70 OptionalV<Word32> IsEnd(A& assembler, iterator_type current_iterator) const {
71 return assembler.UintPtrLessThanOrEqual(end_offset_, current_iterator);
72 }
73
74 template <typename A>
75 iterator_type Advance(A& assembler, iterator_type current_iterator) const {
76 const int stride = (encoding_ == String::ONE_BYTE_ENCODING ? 1 : 2);
77 return assembler.WordPtrAdd(current_iterator, stride);
78 }
79
80 template <typename A>
81 value_type Dereference(A& assembler, iterator_type current_iterator) const {
82 const auto loaded_rep = encoding_ == String::ONE_BYTE_ENCODING
85 return assembler.Load(current_iterator, LoadOp::Kind::RawAligned(),
86 loaded_rep);
87 }
88
89 private:
96};
97
98} // namespace v8::internal::compiler::turboshaft
99
100#endif // V8_COMPILER_TURBOSHAFT_STRING_VIEW_H_
static constexpr MemoryRepresentation Uint16()
static constexpr MemoryRepresentation Uint8()
value_type Dereference(A &assembler, iterator_type current_iterator) const
Definition string-view.h:81
StringView(const DisallowGarbageCollection &can_rely_on_no_gc, V< String > string, String::Encoding encoding, ConstOrV< WordPtr > start_index=0, ConstOrV< WordPtr > character_count=V< WordPtr >::Invalid())
Definition string-view.h:19
OptionalV< Word32 > IsEnd(A &assembler, iterator_type current_iterator) const
Definition string-view.h:70
iterator_type Advance(A &assembler, iterator_type current_iterator) const
Definition string-view.h:75
StringView(V< String > string, String::Encoding encoding, ConstOrV< WordPtr > start_index=0, ConstOrV< WordPtr > character_count=V< WordPtr >::Invalid())
Definition string-view.h:29
const DisallowGarbageCollection * can_rely_on_no_gc_
Definition string-view.h:95
uint32_t count
const int kHeapObjectTag
Definition v8-internal.h:72
constexpr int A
#define OFFSET_OF_DATA_START(Type)