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
187 HINT_MANY_WRITES_EXPECTED = 1,
188 NO_NULL_TERMINATION = 2,
189 PRESERVE_ONE_BYTE_NULL = 4,
193 REPLACE_INVALID_UTF8 = 8
197 int Write(
Isolate* isolate, uint16_t* buffer,
int start = 0,
int length = -1,
198 int options = NO_OPTIONS)
const;
201 int length = -1,
int options = NO_OPTIONS)
const;
204 int* nchars_ref =
nullptr,
int options = NO_OPTIONS)
const;
277 friend class internal::ExternalString;
279 friend class internal::StringForwardingTable;
280 friend class internal::ScopedExternalStringLock;
301 virtual const uint16_t*
data()
const = 0;
314 CheckCachedDataInvariants();
328 void CheckCachedDataInvariants()
const;
330 const uint16_t* cached_data_ =
nullptr;
356 virtual const char*
data()
const = 0;
367 CheckCachedDataInvariants();
375 void UpdateDataCache();
381 void CheckCachedDataInvariants()
const;
383 const char* cached_data_ =
nullptr;
409#ifdef V8_ENABLE_CHECKS
412 return static_cast<String*
>(data);
426 Isolate* isolate,
const char (&literal)[N],
428 static_assert(N <= kMaxLength,
"String is too long");
429 return NewFromUtf8Literal(isolate, literal, type, N - 1);
435 Isolate* isolate,
const char* data,
436 NewStringType type = NewStringType::kNormal,
int length = -1);
441 Isolate* isolate,
const uint8_t* data,
442 NewStringType type = NewStringType::kNormal,
int length = -1);
447 Isolate* isolate,
const uint16_t* data,
448 NewStringType type = NewStringType::kNormal,
int length = -1);
554 "Prefer using String::ValueView if you can, or string->Write to a "
555 "buffer if you cannot.")
558 uint16_t* operator*() {
return str_; }
605 void CheckOneByte(
bool is_one_byte)
const;
615 alignas(internal::Internals::
616 kDisallowGarbageCollectionAlign)
char no_gc_debug_scope_
617 [internal::Internals::kDisallowGarbageCollectionSize];
621 void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
622 Encoding encoding)
const;
623 void VerifyExternalStringResource(ExternalStringResource* val)
const;
624 ExternalStringResource* GetExternalStringResourceSlow()
const;
625 ExternalStringResourceBase* GetExternalStringResourceBaseSlow(
632 static void CheckCast(
v8::Data* that);
699#ifdef V8_ENABLE_CHECKS
702 return static_cast<Symbol*
>(data);
707 static void CheckCast(
Data* that);
717 static void CheckCast(
v8::Data* that);
728#ifdef V8_ENABLE_CHECKS
731 return static_cast<Number*
>(data);
736 static void CheckCast(
v8::Data* that);
748#ifdef V8_ENABLE_CHECKS
751 return static_cast<Integer*
>(data);
756 static void CheckCast(
v8::Data* that);
766#ifdef V8_ENABLE_CHECKS
769 return static_cast<Int32*
>(data);
774 static void CheckCast(
v8::Data* that);
784#ifdef V8_ENABLE_CHECKS
787 return static_cast<Uint32*
>(data);
792 static void CheckCast(
v8::Data* that);
810 int word_count,
const uint64_t* words);
841 void ToWordsArray(
int* sign_bit,
int* word_count, uint64_t* words)
const;
844#ifdef V8_ENABLE_CHECKS
847 return static_cast<BigInt*
>(data);
852 static void CheckCast(
v8::Data* that);
858 I::CheckInitialized(isolate);
859 S* slot = I::GetRootSlot(isolate, I::kEmptyStringRootIndex);
869 if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
870 Isolate* isolate = I::GetIsolateForSandbox(obj);
871 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
872 isolate, obj, I::kStringResourceOffset);
875 result = GetExternalStringResourceSlow();
877#ifdef V8_ENABLE_CHECKS
878 VerifyExternalStringResource(result);
888 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
889 *encoding_out =
static_cast<Encoding>(type & I::kStringEncodingMask);
891 if (type == I::kExternalOneByteRepresentationTag ||
892 type == I::kExternalTwoByteRepresentationTag) {
893 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
894 isolate, obj, I::kStringResourceOffset);
897 resource = GetExternalStringResourceBaseSlow(encoding_out);
899#ifdef V8_ENABLE_CHECKS
900 VerifyExternalStringResourceBase(resource, *encoding_out);
910 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
911 *encoding_out =
static_cast<Encoding>(type & I::kStringEncodingMask);
913 if (type == I::kExternalOneByteRepresentationTag ||
914 type == I::kExternalTwoByteRepresentationTag) {
915 Isolate* isolate = I::GetIsolateForSandbox(obj);
916 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
917 isolate, obj, I::kStringResourceOffset);
920 resource = GetExternalStringResourceBaseSlow(encoding_out);
922#ifdef V8_ENABLE_CHECKS
923 VerifyExternalStringResourceBase(resource, *encoding_out);
933 I::CheckInitialized(isolate);
934 S* slot = I::GetRootSlot(isolate, I::kUndefinedValueRootIndex);
941 I::CheckInitialized(isolate);
942 S* slot = I::GetRootSlot(isolate, I::kNullValueRootIndex);
949 I::CheckInitialized(isolate);
950 S* slot = I::GetRootSlot(isolate, I::kTrueValueRootIndex);
957 I::CheckInitialized(isolate);
958 S* slot = I::GetRootSlot(isolate, I::kFalseValueRootIndex);
963 return value ?
True(isolate) :
False(isolate);
Definition: v8-primitive.h:798
uint64_t Uint64Value(bool *lossless=nullptr) const
static BigInt * Cast(v8::Data *data)
Definition: v8-primitive.h:843
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:962
static Boolean * Cast(v8::Data *data)
Definition: v8-primitive.h:38
Definition: v8-primitive.h:646
virtual ~ExternalResourceVisitor()=default
virtual void VisitExternalString(Local< String > string)
Definition: v8-primitive.h:649
Definition: v8-primitive.h:762
static Int32 * Cast(v8::Data *data)
Definition: v8-primitive.h:765
Definition: v8-primitive.h:742
static Integer * Cast(v8::Data *data)
Definition: v8-primitive.h:747
static Local< Integer > New(Isolate *isolate, int32_t value)
static Local< Integer > NewFromUnsigned(Isolate *isolate, uint32_t value)
Definition: v8-isolate.h:211
Definition: v8-local-handle.h:256
Definition: v8-local-handle.h:614
Definition: v8-primitive.h:79
static Name * Cast(Data *data)
Definition: v8-primitive.h:90
Definition: v8-primitive.h:723
static Local< Number > New(Isolate *isolate, double value)
static Number * Cast(v8::Data *data)
Definition: v8-primitive.h:727
Definition: v8-primitive.h:714
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:344
const char * cached_data() const
Definition: v8-primitive.h:366
ExternalOneByteStringResource()=default
~ExternalOneByteStringResource() override=default
virtual size_t length() const =0
virtual const char * data() const =0
Definition: v8-primitive.h:232
void operator=(const ExternalStringResourceBase &)=delete
ExternalStringResourceBase(const ExternalStringResourceBase &)=delete
virtual ~ExternalStringResourceBase()=default
virtual void Unlock() const
Definition: v8-primitive.h:274
virtual bool IsCacheable() const
Definition: v8-primitive.h:241
ExternalStringResourceBase()=default
virtual void Lock() const
Definition: v8-primitive.h:269
virtual void Dispose()
Definition: v8-primitive.h:256
Definition: v8-primitive.h:289
virtual const uint16_t * data() const =0
ExternalStringResource()=default
const uint16_t * cached_data() const
Definition: v8-primitive.h:313
virtual size_t length() const =0
~ExternalStringResource() override=default
Definition: v8-primitive.h:523
char * operator*()
Definition: v8-primitive.h:528
Utf8Value(Isolate *isolate, Local< v8::Value > obj, WriteOptions options=REPLACE_INVALID_UTF8)
Utf8Value(const Utf8Value &)=delete
const char * operator*() const
Definition: v8-primitive.h:529
void operator=(const Utf8Value &)=delete
int length() const
Definition: v8-primitive.h:530
Definition: v8-primitive.h:581
bool is_one_byte() const
Definition: v8-primitive.h:598
int length() const
Definition: v8-primitive.h:597
const uint16_t * data16_
Definition: v8-primitive.h:610
void operator=(const ValueView &)=delete
const uint8_t * data8() const
Definition: v8-primitive.h:585
ValueView(const ValueView &)=delete
const uint16_t * data16() const
Definition: v8-primitive.h:591
ValueView(Isolate *isolate, Local< v8::String > str)
const uint8_t * data8_
Definition: v8-primitive.h:609
Definition: v8-primitive.h:551
const uint16_t * operator*() const
Definition: v8-primitive.h:559
Value(const Value &)=delete
void operator=(const Value &)=delete
int length() const
Definition: v8-primitive.h:560
Definition: v8-primitive.h:124
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:883
Encoding
Definition: v8-primitive.h:129
static MaybeLocal< String > NewExternalOneByte(Isolate *isolate, ExternalOneByteStringResource *resource)
Local< String > InternalizeString(Isolate *isolate)
bool StringEquals(Local< String > str) const
bool MakeExternal(ExternalStringResource *resource)
bool MakeExternal(ExternalOneByteStringResource *resource)
int WriteOneByte(Isolate *isolate, uint8_t *buffer, int start=0, int length=-1, int options=NO_OPTIONS) const
static MaybeLocal< String > NewFromUtf8(Isolate *isolate, const char *data, NewStringType type=NewStringType::kNormal, int length=-1)
int Write(Isolate *isolate, uint16_t *buffer, int start=0, int length=-1, int options=NO_OPTIONS) const
int WriteUtf8(Isolate *isolate, char *buffer, int length=-1, int *nchars_ref=nullptr, int options=NO_OPTIONS) const
const ExternalOneByteStringResource * GetExternalOneByteStringResource() 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:408
WriteOptions
Definition: v8-primitive.h:185
static Local< String > Empty(Isolate *isolate)
Definition: v8-primitive.h:855
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:425
ExternalStringResource * GetExternalStringResource() const
Definition: v8-primitive.h:863
bool CanMakeExternal(Encoding encoding) const
int Utf8Length(Isolate *isolate) const
Definition: v8-primitive.h:655
static Local< Symbol > GetMatch(Isolate *isolate)
static Local< Symbol > GetIterator(Isolate *isolate)
static Symbol * Cast(Data *data)
Definition: v8-primitive.h:698
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 > 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:780
static Uint32 * Cast(v8::Data *data)
Definition: v8-primitive.h:783
Definition: v8-value.h:32
Definition: v8-internal.h:840
static Address ValueAsAddress(const T *value)
Definition: v8-internal.h:1595
uintptr_t Address
Definition: v8-internal.h:33
Definition: libplatform.h:15
Local< Primitive > Null(Isolate *isolate)
Definition: v8-primitive.h:938
Local< Primitive > Undefined(Isolate *isolate)
Definition: v8-primitive.h:930
Local< Boolean > False(Isolate *isolate)
Definition: v8-primitive.h:954
Local< Boolean > True(Isolate *isolate)
Definition: v8-primitive.h:946
NewStringType
Definition: v8-primitive.h:107
#define V8_EXPORT
Definition: v8config.h:779
#define V8_INLINE
Definition: v8config.h:493
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:597
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:654