5#ifndef INCLUDE_V8_PRIMITIVE_H_
6#define INCLUDE_V8_PRIMITIVE_H_
22class ScopedExternalStringLock;
23class StringForwardingTable;
39#ifdef V8_ENABLE_CHECKS
42 return static_cast<Boolean*
>(data);
48 static void CheckCast(
v8::Data* that);
66#ifdef V8_ENABLE_CHECKS
73 static void CheckCast(
Data* obj);
91#ifdef V8_ENABLE_CHECKS
94 return static_cast<Name*
>(data);
98 static void CheckCast(
Data* that);
126 static constexpr int kMaxLength =
127 internal::kApiSystemPointerSize == 4 ? (1 << 28) - 16 : (1 << 29) - 24;
130 UNKNOWN_ENCODING = 0x1,
131 TWO_BYTE_ENCODING = 0x0,
132 ONE_BYTE_ENCODING = 0x8
157 bool IsOneByte() const;
164 bool ContainsOnlyOneByte() const;
193 HINT_MANY_WRITES_EXPECTED = 1,
194 NO_NULL_TERMINATION = 2,
195 PRESERVE_ONE_BYTE_NULL = 4,
199 REPLACE_INVALID_UTF8 = 8
204 int Write(
Isolate* isolate, uint16_t* buffer,
int start = 0,
int length = -1,
205 int options = NO_OPTIONS) const;
208 int WriteOneByte(
Isolate* isolate, uint8_t* buffer,
int start = 0,
209 int length = -1,
int options = NO_OPTIONS) const;
212 int WriteUtf8(
Isolate* isolate,
char* buffer,
int length = -1,
213 int* nchars_ref =
nullptr,
int options = NO_OPTIONS) const;
225 kReplaceInvalidUtf8 = 2
242 uint16_t* buffer,
int flags = WriteFlags::kNone)
const;
244 uint8_t* buffer,
int flags = WriteFlags::kNone)
const;
266 int flags = WriteFlags::kNone,
267 size_t* processed_characters_return =
nullptr)
const;
323 return kDefaultMemoryEstimate;
325 static constexpr size_t kDefaultMemoryEstimate =
static_cast<size_t>(-1);
378 friend class internal::ExternalString;
380 friend class internal::StringForwardingTable;
381 friend class internal::ScopedExternalStringLock;
402 virtual const uint16_t*
data()
const = 0;
415 CheckCachedDataInvariants();
429 void CheckCachedDataInvariants()
const;
431 const uint16_t* cached_data_ =
nullptr;
457 virtual const char*
data()
const = 0;
468 CheckCachedDataInvariants();
482 void CheckCachedDataInvariants()
const;
484 const char* cached_data_ =
nullptr;
492 V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase(
493 v8::Isolate* isolate, Encoding* encoding_out)
const;
494 V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase(
495 Encoding* encoding_out)
const;
501 V8_INLINE ExternalStringResource* GetExternalStringResource()
const;
510#ifdef V8_ENABLE_CHECKS
513 return static_cast<String*
>(data);
527 Isolate* isolate,
const char (&literal)[N],
529 static_assert(N <= kMaxLength,
"String is too long");
530 return NewFromUtf8Literal(isolate, literal, type, N - 1);
536 Isolate* isolate,
const char* data,
537 NewStringType type = NewStringType::kNormal,
int length = -1);
542 Isolate* isolate,
const uint8_t* data,
543 NewStringType type = NewStringType::kNormal,
int length = -1);
548 Isolate* isolate,
const uint16_t* data,
549 NewStringType type = NewStringType::kNormal,
int length = -1);
653 size_t length()
const {
return length_; }
677 "Prefer using String::ValueView if you can, or string->Write to a "
678 "buffer if you cannot.")
681 uint16_t* operator*() {
return str_; }
683 uint32_t
length()
const {
return length_; }
720 uint32_t
length()
const {
return length_; }
728 void CheckOneByte(
bool is_one_byte)
const;
738 alignas(internal::Internals::
739 kDisallowGarbageCollectionAlign)
char no_gc_debug_scope_
740 [internal::Internals::kDisallowGarbageCollectionSize];
744 void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
745 Encoding encoding)
const;
746 void VerifyExternalStringResource(ExternalStringResource* val)
const;
747 ExternalStringResource* GetExternalStringResourceSlow()
const;
748 ExternalStringResourceBase* GetExternalStringResourceBaseSlow(
755 static void CheckCast(
v8::Data* that);
824#ifdef V8_ENABLE_CHECKS
827 return static_cast<Symbol*
>(data);
832 static void CheckCast(
Data* that);
842 static void CheckCast(
v8::Data* that);
852 template <
typename Int>
853 requires(std::is_integral<Int>::value && !std::is_same<Int, bool>::value &&
854 std::is_signed_v<Int> &&
sizeof(Int) <=
sizeof(int32_t))
856 return NewFromInt32(isolate, value);
858 template <
typename UInt>
859 requires(std::is_integral<UInt>::value &&
860 !std::is_same<UInt, bool>::value && std::is_unsigned_v<UInt> &&
861 sizeof(UInt) <=
sizeof(uint32_t))
863 return NewFromUint32(isolate, value);
866#ifdef V8_ENABLE_CHECKS
869 return static_cast<Number*
>(data);
876 static void CheckCast(
v8::Data* that);
888#ifdef V8_ENABLE_CHECKS
891 return static_cast<Integer*
>(data);
896 static void CheckCast(
v8::Data* that);
906#ifdef V8_ENABLE_CHECKS
909 return static_cast<Int32*
>(data);
914 static void CheckCast(
v8::Data* that);
924#ifdef V8_ENABLE_CHECKS
927 return static_cast<Uint32*
>(data);
932 static void CheckCast(
v8::Data* that);
950 int word_count,
const uint64_t* words);
981 void ToWordsArray(
int* sign_bit,
int* word_count, uint64_t* words)
const;
984#ifdef V8_ENABLE_CHECKS
987 return static_cast<BigInt*
>(data);
992 static void CheckCast(
v8::Data* that);
998 I::CheckInitialized(isolate);
999 S* slot = I::GetRootSlot(isolate, I::kEmptyStringRootIndex);
1009 if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
1010 Isolate* isolate = I::GetCurrentIsolateForSandbox();
1011 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1012 isolate, obj, I::kStringResourceOffset);
1015 result = GetExternalStringResourceSlow();
1017#ifdef V8_ENABLE_CHECKS
1018 VerifyExternalStringResource(result);
1028 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
1029 *encoding_out =
static_cast<Encoding>(type & I::kStringEncodingMask);
1031 if (type == I::kExternalOneByteRepresentationTag ||
1032 type == I::kExternalTwoByteRepresentationTag) {
1033 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1034 isolate, obj, I::kStringResourceOffset);
1037 resource = GetExternalStringResourceBaseSlow(encoding_out);
1039#ifdef V8_ENABLE_CHECKS
1040 VerifyExternalStringResourceBase(resource, *encoding_out);
1050 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
1051 *encoding_out =
static_cast<Encoding>(type & I::kStringEncodingMask);
1053 if (type == I::kExternalOneByteRepresentationTag ||
1054 type == I::kExternalTwoByteRepresentationTag) {
1055 Isolate* isolate = I::GetCurrentIsolateForSandbox();
1056 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1057 isolate, obj, I::kStringResourceOffset);
1060 resource = GetExternalStringResourceBaseSlow(encoding_out);
1062#ifdef V8_ENABLE_CHECKS
1063 VerifyExternalStringResourceBase(resource, *encoding_out);
1073 I::CheckInitialized(isolate);
1074 S* slot = I::GetRootSlot(isolate, I::kUndefinedValueRootIndex);
1081 I::CheckInitialized(isolate);
1082 S* slot = I::GetRootSlot(isolate, I::kNullValueRootIndex);
1089 I::CheckInitialized(isolate);
1090 S* slot = I::GetRootSlot(isolate, I::kTrueValueRootIndex);
1097 I::CheckInitialized(isolate);
1098 S* slot = I::GetRootSlot(isolate, I::kFalseValueRootIndex);
1103 return value ?
True(isolate) :
False(isolate);
Definition: v8-primitive.h:938
uint64_t Uint64Value(bool *lossless=nullptr) const
static BigInt * Cast(v8::Data *data)
Definition: v8-primitive.h:983
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:35
static Local< Boolean > New(Isolate *isolate, bool value)
Definition: v8-primitive.h:1102
static Boolean * Cast(v8::Data *data)
Definition: v8-primitive.h:38
Definition: v8-primitive.h:769
virtual ~ExternalResourceVisitor()=default
virtual void VisitExternalString(Local< String > string)
Definition: v8-primitive.h:772
Definition: v8-primitive.h:902
static Int32 * Cast(v8::Data *data)
Definition: v8-primitive.h:905
Definition: v8-primitive.h:882
static Integer * Cast(v8::Data *data)
Definition: v8-primitive.h:887
static Local< Integer > New(Isolate *isolate, int32_t value)
static Local< Integer > NewFromUnsigned(Isolate *isolate, uint32_t value)
Definition: v8-isolate.h:290
Definition: v8-local-handle.h:364
Definition: v8-local-handle.h:732
Definition: v8-primitive.h:79
static Name * Cast(Data *data)
Definition: v8-primitive.h:90
Definition: v8-primitive.h:848
static Local< Number > New(Isolate *isolate, double value)
static Local< Number > New(Isolate *isolate, Int value)
Definition: v8-primitive.h:855
static Local< Number > New(Isolate *isolate, UInt value)
Definition: v8-primitive.h:862
static Number * Cast(v8::Data *data)
Definition: v8-primitive.h:865
Definition: v8-primitive.h:839
Definition: v8-primitive.h:58
static Local< PrimitiveArray > New(Isolate *isolate, int length)
Local< Primitive > Get(Isolate *isolate, int index)
static PrimitiveArray * Cast(Data *data)
Definition: v8-primitive.h:65
void Set(Isolate *isolate, int index, Local< Primitive > item)
Definition: v8-primitive.h:29
Definition: v8-primitive.h:445
const char * cached_data() const
Definition: v8-primitive.h:467
ExternalOneByteStringResource()=default
~ExternalOneByteStringResource() override=default
virtual size_t length() const =0
virtual const char * data() const =0
Definition: v8-primitive.h:327
virtual void RecordSharedMemoryUsage(const void *location, size_t size)=0
Definition: v8-primitive.h:295
void operator=(const ExternalStringResourceBase &)=delete
virtual void Unaccount(Isolate *isolate)
Definition: v8-primitive.h:311
ExternalStringResourceBase(const ExternalStringResourceBase &)=delete
virtual ~ExternalStringResourceBase()=default
virtual void Unlock() const
Definition: v8-primitive.h:375
virtual void EstimateSharedMemoryUsage(SharedMemoryUsageRecorder *recorder) const
Definition: v8-primitive.h:341
virtual bool IsCacheable() const
Definition: v8-primitive.h:304
ExternalStringResourceBase()=default
virtual void Lock() const
Definition: v8-primitive.h:370
virtual size_t EstimateMemoryUsage() const
Definition: v8-primitive.h:322
virtual void Dispose()
Definition: v8-primitive.h:357
Definition: v8-primitive.h:390
virtual const uint16_t * data() const =0
ExternalStringResource()=default
const uint16_t * cached_data() const
Definition: v8-primitive.h:414
virtual size_t length() const =0
~ExternalStringResource() override=default
Definition: v8-primitive.h:647
char * operator*()
Definition: v8-primitive.h:651
Utf8Value(Isolate *isolate, Local< v8::Value > obj)
Utf8Value(const Utf8Value &)=delete
const char * operator*() const
Definition: v8-primitive.h:652
void operator=(const Utf8Value &)=delete
size_t length() const
Definition: v8-primitive.h:653
Definition: v8-primitive.h:704
bool is_one_byte() const
Definition: v8-primitive.h:721
const uint16_t * data16_
Definition: v8-primitive.h:733
void operator=(const ValueView &)=delete
const uint8_t * data8() const
Definition: v8-primitive.h:708
uint32_t length() const
Definition: v8-primitive.h:720
ValueView(const ValueView &)=delete
const uint16_t * data16() const
Definition: v8-primitive.h:714
ValueView(Isolate *isolate, Local< v8::String > str)
const uint8_t * data8_
Definition: v8-primitive.h:732
Definition: v8-primitive.h:674
const uint16_t * operator*() const
Definition: v8-primitive.h:682
uint32_t length() const
Definition: v8-primitive.h:683
Value(const Value &)=delete
void operator=(const Value &)=delete
Definition: v8-primitive.h:124
bool IsExternalTwoByte() const
static Local< String > Concat(Isolate *isolate, Local< String > left, Local< String > right)
bool IsExternalOneByte() const
ExternalStringResourceBase * GetExternalStringResourceBase(v8::Isolate *isolate, Encoding *encoding_out) const
Definition: v8-primitive.h:1023
Encoding
Definition: v8-primitive.h:129
void WriteOneByteV2(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)
void WriteV2(Isolate *isolate, uint32_t offset, uint32_t length, uint16_t *buffer, int flags=WriteFlags::kNone) const
const ExternalOneByteStringResource * GetExternalOneByteStringResource() const
size_t WriteUtf8V2(Isolate *isolate, char *buffer, size_t capacity, int flags=WriteFlags::kNone, size_t *processed_characters_return=nullptr) const
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:509
WriteOptions
Definition: v8-primitive.h:191
static Local< String > Empty(Isolate *isolate)
Definition: v8-primitive.h:995
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:526
ExternalStringResource * GetExternalStringResource() const
Definition: v8-primitive.h:1003
Definition: v8-primitive.h:778
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:823
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:920
static Uint32 * Cast(v8::Data *data)
Definition: v8-primitive.h:923
Definition: v8-value.h:32
Definition: v8-internal.h:874
static Address ValueAsAddress(const T *value)
Definition: v8-internal.h:1748
uintptr_t Address
Definition: v8-internal.h:52
Definition: libplatform.h:15
Local< Primitive > Null(Isolate *isolate)
Definition: v8-primitive.h:1078
Local< Primitive > Undefined(Isolate *isolate)
Definition: v8-primitive.h:1070
Local< Boolean > False(Isolate *isolate)
Definition: v8-primitive.h:1094
Local< Boolean > True(Isolate *isolate)
Definition: v8-primitive.h:1086
NewStringType
Definition: v8-primitive.h:107
Definition: v8-primitive.h:215
#define V8_EXPORT
Definition: v8config.h:849
#define V8_INLINE
Definition: v8config.h:513
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:627
#define V8_DEPRECATED(message)
Definition: v8config.h:619
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:684