5#ifndef INCLUDE_V8_PRIMITIVE_H_
6#define INCLUDE_V8_PRIMITIVE_H_
22class ScopedExternalStringLock;
23class StringForwardingTable;
39#ifdef V8_ENABLE_CHECKS
48 static void CheckCast(
v8::Data* that);
66#ifdef V8_ENABLE_CHECKS
73 static void CheckCast(
Data* obj);
88 int GetIdentityHash();
91#ifdef V8_ENABLE_CHECKS
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
144 int Utf8Length(
Isolate* isolate) const;
149 size_t Utf8LengthV2(
Isolate* isolate) const;
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
241 void WriteV2(
Isolate* isolate, uint32_t
offset, uint32_t length,
242 uint16_t* buffer,
int flags = WriteFlags::kNone)
const;
243 void WriteOneByteV2(
Isolate* isolate, uint32_t
offset, uint32_t length,
244 uint8_t* buffer,
int flags = WriteFlags::kNone)
const;
265 size_t WriteUtf8V2(
Isolate* isolate,
char* buffer,
size_t capacity,
266 int flags = WriteFlags::kNone,
267 size_t* processed_characters_return =
nullptr)
const;
277 bool IsExternal()
const;
282 bool IsExternalTwoByte()
const;
287 bool IsExternalOneByte()
const;
323 return kDefaultMemoryEstimate;
325 static constexpr size_t kDefaultMemoryEstimate =
static_cast<size_t>(-1);
402 virtual const uint16_t*
data()
const = 0;
415 CheckCachedDataInvariants();
423 void UpdateDataCache();
429 void CheckCachedDataInvariants()
const;
457 virtual const char*
data()
const = 0;
468 CheckCachedDataInvariants();
476 void UpdateDataCache();
482 void CheckCachedDataInvariants()
const;
510#ifdef V8_ENABLE_CHECKS
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);
567 Isolate* isolate, ExternalStringResource* resource);
579 bool MakeExternal(ExternalStringResource* resource);
590 bool MakeExternal(
Isolate* isolate, ExternalStringResource* resource);
601 Isolate* isolate, ExternalOneByteStringResource* resource);
613 bool MakeExternal(ExternalOneByteStringResource* resource);
624 bool MakeExternal(
Isolate* isolate, ExternalOneByteStringResource* resource);
630 bool CanMakeExternal(Encoding encoding) const;
679 "Prefer using String::ValueView if you can, or string->Write to a "
680 "buffer if you cannot.")
683 uint16_t* operator*() {
return str_; }
730 void CheckOneByte(
bool is_one_byte)
const;
740 alignas(internal::Internals::
741 kDisallowGarbageCollectionAlign)
char no_gc_debug_scope_
742 [internal::Internals::kDisallowGarbageCollectionSize];
757 static void CheckCast(
v8::Data* that);
826#ifdef V8_ENABLE_CHECKS
834 static void CheckCast(
Data* that);
844 static void CheckCast(
v8::Data* that);
852 double Value()
const;
855#ifdef V8_ENABLE_CHECKS
863 static void CheckCast(
v8::Data* that);
873 int64_t
Value()
const;
875#ifdef V8_ENABLE_CHECKS
883 static void CheckCast(
v8::Data* that);
891 int32_t
Value()
const;
893#ifdef V8_ENABLE_CHECKS
901 static void CheckCast(
v8::Data* that);
909 uint32_t
Value()
const;
911#ifdef V8_ENABLE_CHECKS
919 static void CheckCast(
v8::Data* that);
937 int word_count,
const uint64_t* words);
945 uint64_t Uint64Value(
bool* lossless =
nullptr)
const;
952 int64_t Int64Value(
bool* lossless =
nullptr)
const;
958 int WordCount()
const;
968 void ToWordsArray(
int* sign_bit,
int* word_count, uint64_t* words)
const;
971#ifdef V8_ENABLE_CHECKS
979 static void CheckCast(
v8::Data* that);
985 I::CheckInitialized(isolate);
986 S* slot = I::GetRootSlot(isolate, I::kEmptyStringRootIndex);
996 if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
997 Isolate* isolate = I::GetIsolateForSandbox(obj);
998 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
999 isolate, obj, I::kStringResourceOffset);
1004#ifdef V8_ENABLE_CHECKS
1015 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
1016 *encoding_out =
static_cast<Encoding>(type & I::kStringEncodingMask);
1018 if (type == I::kExternalOneByteRepresentationTag ||
1019 type == I::kExternalTwoByteRepresentationTag) {
1020 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1021 isolate, obj, I::kStringResourceOffset);
1026#ifdef V8_ENABLE_CHECKS
1037 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
1038 *encoding_out =
static_cast<Encoding>(type & I::kStringEncodingMask);
1040 if (type == I::kExternalOneByteRepresentationTag ||
1041 type == I::kExternalTwoByteRepresentationTag) {
1042 Isolate* isolate = I::GetIsolateForSandbox(obj);
1043 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1044 isolate, obj, I::kStringResourceOffset);
1049#ifdef V8_ENABLE_CHECKS
1060 I::CheckInitialized(isolate);
1061 S* slot = I::GetRootSlot(isolate, I::kUndefinedValueRootIndex);
1068 I::CheckInitialized(isolate);
1069 S* slot = I::GetRootSlot(isolate, I::kNullValueRootIndex);
1076 I::CheckInitialized(isolate);
1077 S* slot = I::GetRootSlot(isolate, I::kTrueValueRootIndex);
1084 I::CheckInitialized(isolate);
1085 S* slot = I::GetRootSlot(isolate, I::kFalseValueRootIndex);
1090 return value ?
True(isolate) :
False(isolate);
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static V8_INLINE BigInt * Cast(v8::Data *data)
static V8_INLINE Boolean * Cast(v8::Data *data)
static V8_INLINE Local< Boolean > New(Isolate *isolate, bool value)
virtual ~ExternalResourceVisitor()=default
virtual void VisitExternalString(Local< String > string)
static V8_INLINE Int32 * Cast(v8::Data *data)
static V8_INLINE Integer * Cast(v8::Data *data)
static V8_INLINE Local< T > FromSlot(internal::Address *slot)
static V8_INLINE Name * Cast(Data *data)
static V8_INLINE Number * Cast(v8::Data *data)
static V8_INLINE PrimitiveArray * Cast(Data *data)
const char * cached_data() const
ExternalOneByteStringResource()=default
~ExternalOneByteStringResource() override=default
virtual size_t length() const =0
virtual const char * data() const =0
virtual void RecordSharedMemoryUsage(const void *location, size_t size)=0
void operator=(const ExternalStringResourceBase &)=delete
virtual void Unaccount(Isolate *isolate)
ExternalStringResourceBase(const ExternalStringResourceBase &)=delete
virtual ~ExternalStringResourceBase()=default
virtual void Unlock() const
virtual void EstimateSharedMemoryUsage(SharedMemoryUsageRecorder *recorder) const
virtual bool IsCacheable() const
ExternalStringResourceBase()=default
virtual void Lock() const
virtual size_t EstimateMemoryUsage() const
virtual const uint16_t * data() const =0
ExternalStringResource()=default
const uint16_t * cached_data() const
virtual size_t length() const =0
~ExternalStringResource() override=default
Utf8Value(const Utf8Value &)=delete
const char * operator*() const
void operator=(const Utf8Value &)=delete
Local< v8::String > flat_str_
void operator=(const ValueView &)=delete
const uint8_t * data8() const
ValueView(const ValueView &)=delete
const uint16_t * data16() const
const uint16_t * operator*() const
V8_DEPRECATE_SOON("Prefer using String::ValueView if you can, or string->Write to a " "buffer if you cannot.") Value(Isolate *isolate
void operator=(const Value &)=delete
ExternalStringResource * GetExternalStringResourceSlow() const
static V8_INLINE String * Cast(v8::Data *data)
V8_INLINE ExternalStringResourceBase * GetExternalStringResourceBase(v8::Isolate *isolate, Encoding *encoding_out) const
static V8_WARN_UNUSED_RESULT Local< String > NewFromUtf8Literal(Isolate *isolate, const char(&literal)[N], NewStringType type=NewStringType::kNormal)
ExternalStringResourceBase * GetExternalStringResourceBaseSlow(String::Encoding *encoding_out) const
static V8_INLINE Local< String > Empty(Isolate *isolate)
V8_INLINE ExternalStringResource * GetExternalStringResource() const
void VerifyExternalStringResource(ExternalStringResource *val) const
void VerifyExternalStringResourceBase(ExternalStringResourceBase *v, Encoding encoding) const
static Local< Symbol > GetDispose(Isolate *isolate)
static Local< Symbol > GetMatch(Isolate *isolate)
static Local< Symbol > GetIterator(Isolate *isolate)
static V8_INLINE Symbol * Cast(Data *data)
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 > 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 > GetHasInstance(Isolate *isolate)
static V8_INLINE Uint32 * Cast(v8::Data *data)
static V8_INLINE Address ValueAsAddress(const T *value)
AlignedCachedData * cached_data_
ZoneVector< RpoNumber > & result
FunctionLiteral * literal
v8_inspector::String16 String
V8_INLINE Local< Primitive > Null(Isolate *isolate)
V8_INLINE Local< Boolean > True(Isolate *isolate)
V8_INLINE Local< Boolean > False(Isolate *isolate)
V8_INLINE Local< Primitive > Undefined(Isolate *isolate)
#define I(name, number_of_args, result_size)
#define V8_DEPRECATE_SOON(message)
#define V8_DEPRECATED(message)
#define V8_WARN_UNUSED_RESULT
std::unique_ptr< ValueMirror > value