19template <
typename Char,
typename Base>
55 "native function externalizeString();"
56 "native function createExternalizableString();"
57 "native function createExternalizableTwoByteString();"
58 "native function isOneByteString();"
59 "let kExternalStringMinOneByteLength = %d;"
60 "let kExternalStringMinTwoByteLength = %d;"
61 "let kExternalStringMinOneByteCachedLength = %d;"
62 "let kExternalStringMinTwoByteCachedLength = %d;",
74 "createExternalizableString") == 0) {
78 "createExternalizableTwoByteString") == 0) {
92 if (!string->IsShared())
return false;
93 uint32_t raw_hash =
string->raw_hash_field(
kAcquireLoad);
102 if (info.Length() < 1 || !info[0]->IsString()) {
103 info.GetIsolate()->ThrowError(
104 "First parameter to externalizeString() must be a string.");
110 const bool externalize_as_one_byte =
string->IsOneByteRepresentation();
111 if (!string->SupportsExternalization(
120 info.GetIsolate()->ThrowError(
"string does not support externalization.");
124 if (externalize_as_one_byte) {
125 uint8_t* data =
new uint8_t[
string->length()];
128 reinterpret_cast<char*
>(data), string->length());
129 result = Utils::ToLocal(
string)->MakeExternal(info.GetIsolate(), resource);
130 if (!
result)
delete resource;
135 data, string->length());
136 result = Utils::ToLocal(
string)->MakeExternal(info.GetIsolate(), resource);
137 if (!
result)
delete resource;
144 if (!
result && !HasExternalForwardingIndex(
string)) {
145 info.GetIsolate()->ThrowError(
"externalizeString() failed.");
158 first->IsOneByteRepresentation() &&
second->IsOneByteRepresentation()) {
159 isolate->Throw(*isolate->factory()->NewStringFromAsciiChecked(
160 "Cannot create externalizable two-byte string from one-byte "
161 "ConsString. Create at least one part of the ConsString with "
162 "createExternalizableTwoByteString()"));
168MaybeDirectHandle<String> CreateExternalizableString(
171 Isolate* i_isolate =
reinterpret_cast<Isolate*
>(
isolate);
173 string->IsOneByteRepresentation());
174 if (string->SupportsExternalization(encoding)) {
178 if (StringShape(*string).IsExternal()) {
186 isolate->ThrowError(
"Read-only strings cannot be externalized.");
189#ifdef V8_COMPRESS_POINTERS
191 if (string->Size() <
static_cast<int>(
sizeof(UncachedExternalString))) {
192 isolate->ThrowError(
"String is too short to be externalized.");
203 if (
IsConsString(*
string, i_isolate) && !string->IsFlat() &&
205 DirectHandle<String>
result;
216 MaybeDirectHandle<SeqOneByteString> maybe_result =
217 i_isolate->factory()->NewRawOneByteString(string->length(),
219 DirectHandle<SeqOneByteString>
result;
220 if (maybe_result.ToHandle(&
result)) {
228 MaybeDirectHandle<SeqTwoByteString> maybe_result =
229 i_isolate->factory()->NewRawTwoByteString(string->length(),
231 DirectHandle<SeqTwoByteString>
result;
232 if (maybe_result.ToHandle(&
result)) {
240 isolate->ThrowError(
"Unable to create string");
249 if (info.Length() < 1 || !info[0]->IsString()) {
250 info.GetIsolate()->ThrowError(
251 "First parameter to createExternalizableString() must be a string.");
261 i::CreateExternalizableString(isolate,
string, encoding);
264 DCHECK(!isolate->HasPendingException());
265 info.GetReturnValue().Set(Utils::ToLocal(
result));
267 DCHECK(isolate->HasPendingException());
274 if (info.Length() < 1 || !info[0]->IsString()) {
275 info.GetIsolate()->ThrowError(
276 "First parameter to createExternalizableString() must be a string.");
286 DCHECK(!isolate->HasPendingException());
287 info.GetReturnValue().Set(Utils::ToLocal(
result));
289 DCHECK(isolate->HasPendingException());
296 if (info.Length() != 1 || !info[0]->IsString()) {
297 info.GetIsolate()->ThrowError(
298 "isOneByteString() requires a single string argument.");
302 ->IsOneByteRepresentation();
303 info.GetReturnValue().Set(is_one_byte);
static Local< FunctionTemplate > New(Isolate *isolate, FunctionCallback callback=nullptr, Local< Value > data=Local< Value >(), Local< Signature > signature=Local< Signature >(), int length=0, ConstructorBehavior behavior=ConstructorBehavior::kAllow, SideEffectType side_effect_type=SideEffectType::kHasSideEffect, const CFunction *c_function=nullptr, uint16_t instance_type=0, uint16_t allowed_receiver_instance_type_range_start=0, uint16_t allowed_receiver_instance_type_range_end=0)
static v8::internal::DirectHandle< To > OpenDirectHandle(v8::Local< From > handle)
v8::Local< v8::FunctionTemplate > GetNativeFunctionTemplate(v8::Isolate *isolate, v8::Local< v8::String > name) override
static void Externalize(const v8::FunctionCallbackInfo< v8::Value > &info)
static const char * BuildSource(char *buf, size_t size)
static void IsOneByte(const v8::FunctionCallbackInfo< v8::Value > &info)
static void CreateExternalizableTwoByteString(const v8::FunctionCallbackInfo< v8::Value > &info)
static void CreateExternalizableString(const v8::FunctionCallbackInfo< v8::Value > &info)
static V8_INLINE bool InReadOnlySpace(Tagged< HeapObject > object)
V8_WARN_UNUSED_RESULT V8_INLINE bool ToHandle(DirectHandle< S > *out) const
static bool IsExternalForwardingIndex(uint32_t raw_hash_field)
size_t length() const override
~SimpleStringResource() override
SimpleStringResource(Char *data, size_t length)
const Char * data() const override
V8_INLINE bool IsExternal() const
static void WriteToFlat(Tagged< String > source, SinkCharT *sink, uint32_t start, uint32_t length)
ZoneVector< RpoNumber > & result
int SNPrintF(Vector< char > str, const char *format,...)
constexpr Vector< T > VectorOf(T *start, size_t size)
V8_INLINE constexpr bool IsConsString(InstanceType instance_type)
static constexpr int kMinTwoByteLength
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr NullMaybeHandleType kNullMaybeHandle
constexpr int kTaggedSize
PerThreadAssertScopeDebugOnly< false, SAFEPOINTS_ASSERT, HEAP_ALLOCATION_ASSERT > DisallowGarbageCollection
SimpleStringResource< char, v8::String::ExternalOneByteStringResource > SimpleOneByteStringResource
SimpleStringResource< base::uc16, v8::String::ExternalStringResource > SimpleTwoByteStringResource
bool V8_EXPORT ValidateCallbackInfo(const FunctionCallbackInfo< void > &info)
static constexpr int kMinOneByteCachedLength
constexpr int kExternalPointerSlotSize
static constexpr int kMinOneByteLength
static constexpr int kMinTwoByteCachedLength
template const char * string
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr AcquireLoadTag kAcquireLoad
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)