5#ifndef INCLUDE_V8_PRIMITIVE_H_
6#define INCLUDE_V8_PRIMITIVE_H_
25class ExternalStringResourceWrapper;
26class ScopedExternalStringLock;
27class StringForwardingTable;
43#ifdef V8_ENABLE_CHECKS
46 return static_cast<Boolean*
>(data);
52 static void CheckCast(
v8::Data* that);
70#ifdef V8_ENABLE_CHECKS
77 static void CheckCast(
Data* obj);
95#ifdef V8_ENABLE_CHECKS
98 return static_cast<Name*
>(data);
102 static void CheckCast(
Data* that);
130#ifndef V8_LOWER_LIMITS_MODE
131 static constexpr int kMaxLength =
132 internal::kApiSystemPointerSize == 4 ? (1 << 28) - 16 : (1 << 29) - 24;
134 static constexpr int kMaxLength = 1 << 20;
138 UNKNOWN_ENCODING = 0x1,
139 TWO_BYTE_ENCODING = 0x0,
140 ONE_BYTE_ENCODING = 0x8
153 size_t Utf8LengthV2(
Isolate* isolate)
const {
return Utf8Length(isolate); }
180 kReplaceInvalidUtf8 = 2
197 uint16_t* buffer,
int flags = WriteFlags::kNone)
const;
199 uint8_t* buffer,
int flags = WriteFlags::kNone)
const;
202 void WriteV2(
Isolate* isolate, uint32_t offset, uint32_t length,
203 uint16_t* buffer,
int flags =
WriteFlags::kNone)
const {
204 Write(isolate, offset, length, buffer, flags);
208 void WriteOneByteV2(
Isolate* isolate, uint32_t offset, uint32_t length,
209 uint8_t* buffer,
int flags =
WriteFlags::kNone)
const {
210 WriteOneByte(isolate, offset, length, buffer, flags);
233 int flags = WriteFlags::kNone,
234 size_t* processed_characters_return =
nullptr)
const;
237 size_t WriteUtf8V2(
Isolate* isolate,
char* buffer,
size_t capacity,
239 size_t* processed_characters_return =
nullptr)
const {
240 return WriteUtf8(isolate, buffer, capacity, flags,
241 processed_characters_return);
306 return kDefaultMemoryEstimate;
308 static constexpr size_t kDefaultMemoryEstimate =
static_cast<size_t>(-1);
364 friend class internal::ExternalString;
365 friend class internal::ExternalStringResourceWrapper;
367 friend class internal::StringForwardingTable;
368 friend class internal::ScopedExternalStringLock;
389 virtual const uint16_t*
data()
const = 0;
402 CheckCachedDataInvariants();
416 void CheckCachedDataInvariants()
const;
418 const uint16_t* cached_data_ =
nullptr;
444 virtual const char*
data()
const = 0;
455 CheckCachedDataInvariants();
469 void CheckCachedDataInvariants()
const;
471 const char* cached_data_ =
nullptr;
482 Encoding* encoding_out)
const;
489 V8_INLINE ExternalStringResource* GetExternalStringResource()
const;
495 V8_INLINE const ExternalOneByteStringResource*
496 GetExternalOneByteStringResource()
const;
499#ifdef V8_ENABLE_CHECKS
502 return static_cast<String*
>(data);
516 Isolate* isolate,
const char (&literal)[N],
518 static_assert(N <= kMaxLength,
"String is too long");
519 return NewFromUtf8Literal(isolate, literal, type, N - 1);
525 Isolate* isolate,
const char* data,
526 NewStringType type = NewStringType::kNormal,
int length = -1);
531 Isolate* isolate,
const uint8_t* data,
532 NewStringType type = NewStringType::kNormal,
int length = -1);
537 Isolate* isolate,
const uint16_t* data,
538 NewStringType type = NewStringType::kNormal,
int length = -1);
642 size_t length()
const {
return length_; }
643 std::string_view
as_view()
const {
return std::string_view(str_, length_); }
665 "Prefer using String::ValueView if you can, or string->Write to a "
669 "Prefer using String::ValueView if you can, or string->Write to a "
670 "buffer if you cannot.")
673 uint16_t* operator*() {
return str_; }
675 uint32_t
length()
const {
return length_; }
712 uint32_t
length()
const {
return length_; }
720 void CheckOneByte(
bool is_one_byte)
const;
730 alignas(internal::Internals::
731 kDisallowGarbageCollectionAlign)
char no_gc_debug_scope_
732 [internal::Internals::kDisallowGarbageCollectionSize];
736 void VerifyExternalStringResourceBase(
const ExternalStringResourceBase* v,
737 Encoding encoding)
const;
740 V8_INLINE static ExternalStringResourceBase* ReadExternalStringResource(
742 ExternalStringResource* GetExternalStringResourceSlow()
const;
743 const ExternalOneByteStringResource* GetExternalOneByteStringResourceSlow()
745 ExternalStringResourceBase* GetExternalStringResourceBaseSlow(
752 static void CheckCast(
v8::Data* that);
821#ifdef V8_ENABLE_CHECKS
824 return static_cast<Symbol*
>(data);
829 static void CheckCast(
Data* that);
839 static void CheckCast(
v8::Data* that);
849 template <
typename Int>
850 requires(std::is_integral<Int>::value && !std::is_same<Int, bool>::value &&
851 std::is_signed_v<Int> &&
sizeof(Int) <=
sizeof(int32_t))
853 return NewFromInt32(isolate, value);
855 template <
typename UInt>
856 requires(std::is_integral<UInt>::value &&
857 !std::is_same<UInt, bool>::value && std::is_unsigned_v<UInt> &&
858 sizeof(UInt) <=
sizeof(uint32_t))
860 return NewFromUint32(isolate, value);
863#ifdef V8_ENABLE_CHECKS
866 return static_cast<Number*
>(data);
873 static void CheckCast(
v8::Data* that);
885#ifdef V8_ENABLE_CHECKS
888 return static_cast<Integer*
>(data);
893 static void CheckCast(
v8::Data* that);
903#ifdef V8_ENABLE_CHECKS
906 return static_cast<Int32*
>(data);
911 static void CheckCast(
v8::Data* that);
921#ifdef V8_ENABLE_CHECKS
924 return static_cast<Uint32*
>(data);
929 static void CheckCast(
v8::Data* that);
947 int word_count,
const uint64_t* words);
978 void ToWordsArray(
int* sign_bit,
int* word_count, uint64_t* words)
const;
981#ifdef V8_ENABLE_CHECKS
984 return static_cast<BigInt*
>(data);
989 static void CheckCast(
v8::Data* that);
995 I::CheckInitialized(isolate);
996 S* slot = I::GetRootSlot(isolate, I::kEmptyStringRootIndex);
1008 A wrapper =
reinterpret_cast<A
>(internal::ReadCppHeapPointerField<void>(
1009 isolate, obj, I::kStringResourceOffset,
1011 if (wrapper == internal::kNullAddress)
return nullptr;
1012 return *
reinterpret_cast<ExternalStringResourceBase* const*
>(
1013 wrapper + I::kExternalStringResourceWrapperResourceOffset);
1022 if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
1023 Isolate* isolate = I::GetCurrentIsolate();
1025 ReadExternalStringResource(isolate, obj));
1027 result = GetExternalStringResourceSlow();
1029#ifdef V8_ENABLE_CHECKS
1041 if (I::IsExternalOneByteString(I::GetInstanceType(obj))) {
1042 Isolate* isolate = I::GetCurrentIsolate();
1044 ReadExternalStringResource(isolate, obj));
1046 result = GetExternalOneByteStringResourceSlow();
1048#ifdef V8_ENABLE_CHECKS
1059 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
1060 *encoding_out =
static_cast<Encoding>(type & I::kStringEncodingMask);
1062 if (type == I::kExternalOneByteRepresentationTag ||
1063 type == I::kExternalTwoByteRepresentationTag) {
1064 resource = ReadExternalStringResource(isolate, obj);
1066 resource = GetExternalStringResourceBaseSlow(encoding_out);
1068#ifdef V8_ENABLE_CHECKS
1069 VerifyExternalStringResourceBase(resource, *encoding_out);
1085 I::CheckInitialized(isolate);
1086 S* slot = I::GetRootSlot(isolate, I::kUndefinedValueRootIndex);
1093 I::CheckInitialized(isolate);
1094 S* slot = I::GetRootSlot(isolate, I::kNullValueRootIndex);
1101 I::CheckInitialized(isolate);
1102 S* slot = I::GetRootSlot(isolate, I::kTrueValueRootIndex);
1109 I::CheckInitialized(isolate);
1110 S* slot = I::GetRootSlot(isolate, I::kFalseValueRootIndex);
1115 return value ?
True(isolate) :
False(isolate);
Definition: v8-primitive.h:935
uint64_t Uint64Value(bool *lossless=nullptr) const
static BigInt * Cast(v8::Data *data)
Definition: v8-primitive.h:980
static Local< BigInt > New(Isolate *isolate, int64_t value)
int64_t Int64Value(bool *lossless=nullptr) const
static MaybeLocal< BigInt > NewFromWords(Local< Context > context, int sign_bit, int word_count, const uint64_t *words)
static Local< BigInt > NewFromUnsigned(Isolate *isolate, uint64_t value)
void ToWordsArray(int *sign_bit, int *word_count, uint64_t *words) const
Definition: v8-primitive.h:39
static Local< Boolean > New(Isolate *isolate, bool value)
Definition: v8-primitive.h:1114
static Boolean * Cast(v8::Data *data)
Definition: v8-primitive.h:42
Definition: v8-primitive.h:766
virtual ~ExternalResourceVisitor()=default
virtual void VisitExternalString(Local< String > string)
Definition: v8-primitive.h:769
Definition: v8-primitive.h:899
static Int32 * Cast(v8::Data *data)
Definition: v8-primitive.h:902
Definition: v8-primitive.h:879
static Integer * Cast(v8::Data *data)
Definition: v8-primitive.h:884
static Local< Integer > New(Isolate *isolate, int32_t value)
static Local< Integer > NewFromUnsigned(Isolate *isolate, uint32_t value)
Definition: v8-isolate.h:305
Definition: v8-local-handle.h:359
Definition: v8-local-handle.h:730
Definition: v8-primitive.h:83
static Name * Cast(Data *data)
Definition: v8-primitive.h:94
Definition: v8-primitive.h:845
static Local< Number > New(Isolate *isolate, double value)
static Local< Number > New(Isolate *isolate, Int value)
Definition: v8-primitive.h:852
static Local< Number > New(Isolate *isolate, UInt value)
Definition: v8-primitive.h:859
static Number * Cast(v8::Data *data)
Definition: v8-primitive.h:862
Definition: v8-primitive.h:836
Definition: v8-primitive.h:62
static Local< PrimitiveArray > New(Isolate *isolate, int length)
Local< Primitive > Get(Isolate *isolate, int index)
static PrimitiveArray * Cast(Data *data)
Definition: v8-primitive.h:69
void Set(Isolate *isolate, int index, Local< Primitive > item)
Definition: v8-primitive.h:33
Definition: v8-primitive.h:432
const char * cached_data() const
Definition: v8-primitive.h:454
ExternalOneByteStringResource()=default
~ExternalOneByteStringResource() override=default
virtual size_t length() const =0
virtual const char * data() const =0
Definition: v8-primitive.h:310
virtual void RecordSharedMemoryUsage(const void *location, size_t size)=0
Definition: v8-primitive.h:275
void operator=(const ExternalStringResourceBase &)=delete
virtual void Unaccount(Isolate *isolate)
Definition: v8-primitive.h:294
ExternalStringResourceBase(const ExternalStringResourceBase &)=delete
virtual ~ExternalStringResourceBase()=default
virtual void Unlock() const
Definition: v8-primitive.h:361
virtual void EstimateSharedMemoryUsage(SharedMemoryUsageRecorder *recorder) const
Definition: v8-primitive.h:324
virtual bool IsCacheable() const
Definition: v8-primitive.h:284
ExternalStringResourceBase()=default
virtual void Lock() const
Definition: v8-primitive.h:356
virtual size_t EstimateMemoryUsage() const
Definition: v8-primitive.h:305
virtual void Dispose()
Definition: v8-primitive.h:343
Definition: v8-primitive.h:377
virtual const uint16_t * data() const =0
ExternalStringResource()=default
const uint16_t * cached_data() const
Definition: v8-primitive.h:401
virtual size_t length() const =0
~ExternalStringResource() override=default
Definition: v8-primitive.h:636
char * operator*()
Definition: v8-primitive.h:640
Utf8Value(Isolate *isolate, Local< v8::Value > obj)
Utf8Value(const Utf8Value &)=delete
const char * operator*() const
Definition: v8-primitive.h:641
void operator=(const Utf8Value &)=delete
std::string_view as_view() const
Definition: v8-primitive.h:643
size_t length() const
Definition: v8-primitive.h:642
Definition: v8-primitive.h:696
bool is_one_byte() const
Definition: v8-primitive.h:713
const uint16_t * data16_
Definition: v8-primitive.h:725
void operator=(const ValueView &)=delete
const uint8_t * data8() const
Definition: v8-primitive.h:700
uint32_t length() const
Definition: v8-primitive.h:712
ValueView(const ValueView &)=delete
const uint16_t * data16() const
Definition: v8-primitive.h:706
ValueView(Isolate *isolate, Local< v8::String > str)
const uint8_t * data8_
Definition: v8-primitive.h:724
Definition: v8-primitive.h:666
const uint16_t * operator*() const
Definition: v8-primitive.h:674
uint32_t length() const
Definition: v8-primitive.h:675
Value(const Value &)=delete
void operator=(const Value &)=delete
Definition: v8-primitive.h:128
bool IsInStringTable(Isolate *isolate) const
bool IsExternalTwoByte() const
static Local< String > Concat(Isolate *isolate, Local< String > left, Local< String > right)
bool IsExternalOneByte() const
bool ContainsOnlyOneByte() const
ExternalStringResourceBase * GetExternalStringResourceBase(v8::Isolate *isolate, Encoding *encoding_out) const
Definition: v8-primitive.h:1054
Encoding
Definition: v8-primitive.h:137
@ ONE_BYTE_ENCODING
Definition: v8-primitive.h:140
@ TWO_BYTE_ENCODING
Definition: v8-primitive.h:139
void WriteOneByte(Isolate *isolate, uint32_t offset, uint32_t length, uint8_t *buffer, int flags=WriteFlags::kNone) const
Local< String > InternalizeString(Isolate *isolate)
static MaybeLocal< String > NewFromUtf8(Isolate *isolate, const char *data, NewStringType type=NewStringType::kNormal, int length=-1)
static MaybeLocal< String > NewExternalTwoByte(Isolate *isolate, ExternalStringResource *resource)
static MaybeLocal< String > NewFromOneByte(Isolate *isolate, const uint8_t *data, NewStringType type=NewStringType::kNormal, int length=-1)
static String * Cast(v8::Data *data)
Definition: v8-primitive.h:498
size_t Utf8Length(Isolate *isolate) const
static Local< String > Empty(Isolate *isolate)
Definition: v8-primitive.h:992
static MaybeLocal< String > NewFromTwoByte(Isolate *isolate, const uint16_t *data, NewStringType type=NewStringType::kNormal, int length=-1)
static Local< String > NewFromUtf8Literal(Isolate *isolate, const char(&literal)[N], NewStringType type=NewStringType::kNormal)
Definition: v8-primitive.h:515
ExternalStringResource * GetExternalStringResource() const
Definition: v8-primitive.h:1016
size_t WriteUtf8(Isolate *isolate, char *buffer, size_t capacity, int flags=WriteFlags::kNone, size_t *processed_characters_return=nullptr) const
const ExternalOneByteStringResource * GetExternalOneByteStringResource() const
Definition: v8-primitive.h:1036
void Write(Isolate *isolate, uint32_t offset, uint32_t length, uint16_t *buffer, int flags=WriteFlags::kNone) const
Definition: v8-primitive.h:775
static Local< Symbol > GetDispose(Isolate *isolate)
static Local< Symbol > GetMatch(Isolate *isolate)
static Local< Symbol > GetIterator(Isolate *isolate)
static Symbol * Cast(Data *data)
Definition: v8-primitive.h:820
static Local< Symbol > ForApi(Isolate *isolate, Local< String > description)
static Local< Symbol > GetSearch(Isolate *isolate)
static Local< Symbol > GetToPrimitive(Isolate *isolate)
static Local< Symbol > GetAsyncIterator(Isolate *isolate)
static Local< Symbol > GetIsConcatSpreadable(Isolate *isolate)
static Local< Symbol > New(Isolate *isolate, Local< String > description=Local< String >())
static Local< Symbol > GetReplace(Isolate *isolate)
static Local< Symbol > GetAsyncDispose(Isolate *isolate)
static Local< Symbol > GetToStringTag(Isolate *isolate)
static Local< Symbol > GetSplit(Isolate *isolate)
static Local< Symbol > GetUnscopables(Isolate *isolate)
static Local< Symbol > For(Isolate *isolate, Local< String > description)
Local< Value > Description(Isolate *isolate) const
static Local< Symbol > GetHasInstance(Isolate *isolate)
Definition: v8-primitive.h:917
static Uint32 * Cast(v8::Data *data)
Definition: v8-primitive.h:920
Definition: v8-value.h:32
Definition: v8-internal.h:969
static v8::Isolate * GetCurrentIsolate()
static Address ValueAsAddress(const T *value)
Definition: v8-internal.h:1838
uintptr_t Address
Definition: v8-internal.h:38
Definition: libplatform.h:15
Local< Primitive > Null(Isolate *isolate)
Definition: v8-primitive.h:1090
Local< Primitive > Undefined(Isolate *isolate)
Definition: v8-primitive.h:1082
Local< Boolean > False(Isolate *isolate)
Definition: v8-primitive.h:1106
@ kExternalStringResourceTag
Local< Boolean > True(Isolate *isolate)
Definition: v8-primitive.h:1098
NewStringType
Definition: v8-primitive.h:111
Definition: v8-primitive.h:170
#define V8_EXPORT
Definition: v8config.h:875
#define V8_INLINE
Definition: v8config.h:519
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:632
#define V8_DEPRECATED(message)
Definition: v8config.h:624
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:689