Loading...
Searching...
No Matches
v8-primitive.h
Go to the documentation of this file.
1// Copyright 2021 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef INCLUDE_V8_PRIMITIVE_H_
6#define INCLUDE_V8_PRIMITIVE_H_
7
8#include <string_view>
9
10#include "v8-data.h" // NOLINT(build/include_directory)
11#include "v8-internal.h" // NOLINT(build/include_directory)
12#include "v8-local-handle.h" // NOLINT(build/include_directory)
13#include "v8-value.h" // NOLINT(build/include_directory)
14#include "v8config.h" // NOLINT(build/include_directory)
15
16namespace v8 {
17
18class Context;
19class Isolate;
20class String;
21
22namespace internal {
23class ExternalString;
24class ScopedExternalStringLock;
25class StringForwardingTable;
26} // namespace internal
27
31class V8_EXPORT Primitive : public Value {};
32
37class V8_EXPORT Boolean : public Primitive {
38 public:
39 bool Value() const;
40 V8_INLINE static Boolean* Cast(v8::Data* data) {
41#ifdef V8_ENABLE_CHECKS
42 CheckCast(data);
43#endif
44 return static_cast<Boolean*>(data);
45 }
46
47 V8_INLINE static Local<Boolean> New(Isolate* isolate, bool value);
48
49 private:
50 static void CheckCast(v8::Data* that);
51};
52
61 public:
62 static Local<PrimitiveArray> New(Isolate* isolate, int length);
63 int Length() const;
64 void Set(Isolate* isolate, int index, Local<Primitive> item);
65 Local<Primitive> Get(Isolate* isolate, int index);
66
68#ifdef V8_ENABLE_CHECKS
69 CheckCast(data);
70#endif
71 return reinterpret_cast<PrimitiveArray*>(data);
72 }
73
74 private:
75 static void CheckCast(Data* obj);
76};
77
81class V8_EXPORT Name : public Primitive {
82 public:
91
92 V8_INLINE static Name* Cast(Data* data) {
93#ifdef V8_ENABLE_CHECKS
94 CheckCast(data);
95#endif
96 return static_cast<Name*>(data);
97 }
98
99 private:
100 static void CheckCast(Data* that);
101};
102
109enum class NewStringType {
113 kNormal,
114
121};
122
126class V8_EXPORT String : public Name {
127 public:
128#ifndef V8_LOWER_LIMITS_MODE
129 static constexpr int kMaxLength =
130 internal::kApiSystemPointerSize == 4 ? (1 << 28) - 16 : (1 << 29) - 24;
131#else
132 static constexpr int kMaxLength = 1 << 20;
133#endif // V8_LOWER_LIMITS_MODE
134
135 enum Encoding {
136 UNKNOWN_ENCODING = 0x1,
137 TWO_BYTE_ENCODING = 0x0,
138 ONE_BYTE_ENCODING = 0x8
139 };
143 int Length() const;
144
148 size_t Utf8Length(Isolate* isolate) const;
149 // TODO(http://crbug.com/373485796): deprecate and remove.
150 V8_DEPRECATE_SOON("Use Utf8Length(isolate) instead.")
151 size_t Utf8LengthV2(Isolate* isolate) const { return Utf8Length(isolate); }
152
159 bool IsOneByte() const;
160
167
168 struct WriteFlags {
169 enum {
170 kNone = 0,
171 // Indicates that the output string should be null-terminated. In that
172 // case, the output buffer must include sufficient space for the
173 // additional null character.
174 kNullTerminate = 1,
175 // Used by WriteUtf8 to replace orphan surrogate code units with the
176 // unicode replacement character. Needs to be set to guarantee valid UTF-8
177 // output.
178 kReplaceInvalidUtf8 = 2
179 };
180 };
181
194 void Write(Isolate* isolate, uint32_t offset, uint32_t length,
195 uint16_t* buffer, int flags = WriteFlags::kNone) const;
196 void WriteOneByte(Isolate* isolate, uint32_t offset, uint32_t length,
197 uint8_t* buffer, int flags = WriteFlags::kNone) const;
198 // TODO(http://crbug.com/373485796): deprecate and remove.
199 V8_DEPRECATE_SOON("Use Write(..) instead.")
200 void WriteV2(Isolate* isolate, uint32_t offset, uint32_t length,
201 uint16_t* buffer, int flags = WriteFlags::kNone) const {
202 Write(isolate, offset, length, buffer, flags);
203 }
204 // TODO(http://crbug.com/373485796): deprecate and remove.
205 V8_DEPRECATE_SOON("Use WriteOneByte(..) instead.")
206 void WriteOneByteV2(Isolate* isolate, uint32_t offset, uint32_t length,
207 uint8_t* buffer, int flags = WriteFlags::kNone) const {
208 WriteOneByte(isolate, offset, length, buffer, flags);
209 }
210
230 size_t WriteUtf8(Isolate* isolate, char* buffer, size_t capacity,
231 int flags = WriteFlags::kNone,
232 size_t* processed_characters_return = nullptr) const;
233 // TODO(http://crbug.com/373485796): deprecate and remove.
234 V8_DEPRECATE_SOON("Use WriteUtf8(..) instead.")
235 size_t WriteUtf8V2(Isolate* isolate, char* buffer, size_t capacity,
236 int flags = WriteFlags::kNone,
237 size_t* processed_characters_return = nullptr) const {
238 return WriteUtf8(isolate, buffer, capacity, flags,
239 processed_characters_return);
240 }
241
245 V8_INLINE static Local<String> Empty(Isolate* isolate);
246
250 bool IsExternal() const;
251
255 bool IsExternalTwoByte() const;
256
260 bool IsExternalOneByte() const;
261
267
271 bool IsInStringTable(Isolate* isolate) const;
272
274 public:
275 virtual ~ExternalStringResourceBase() = default;
276
282 virtual bool IsCacheable() const { return true; }
283
292 virtual void Unaccount(Isolate* isolate) {}
293
303 virtual size_t EstimateMemoryUsage() const {
304 return kDefaultMemoryEstimate;
305 }
306 static constexpr size_t kDefaultMemoryEstimate = static_cast<size_t>(-1);
307
309 public:
314 virtual void RecordSharedMemoryUsage(const void* location,
315 size_t size) = 0;
316 };
317
323 SharedMemoryUsageRecorder* recorder) const {}
324
325 // Disallow copying and assigning.
328
329 protected:
331
341 virtual void Dispose() { delete this; }
342
354 virtual void Lock() const {}
355
359 virtual void Unlock() const {}
360
361 private:
362 friend class internal::ExternalString;
363 friend class v8::String;
364 friend class internal::StringForwardingTable;
365 friend class internal::ScopedExternalStringLock;
366 };
367
375 public:
380 ~ExternalStringResource() override = default;
381
386 virtual const uint16_t* data() const = 0;
387
391 virtual size_t length() const = 0;
392
398 const uint16_t* cached_data() const {
399 CheckCachedDataInvariants();
400 return cached_data_;
401 }
402
408
409 protected:
411
412 private:
413 void CheckCachedDataInvariants() const;
414
415 const uint16_t* cached_data_ = nullptr;
416 };
417
430 public:
435 ~ExternalOneByteStringResource() override = default;
436
441 virtual const char* data() const = 0;
442
444 virtual size_t length() const = 0;
445
451 const char* cached_data() const {
452 CheckCachedDataInvariants();
453 return cached_data_;
454 }
455
461
462 protected:
464
465 private:
466 void CheckCachedDataInvariants() const;
467
468 const char* cached_data_ = nullptr;
469 };
470
476 V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase(
477 v8::Isolate* isolate, Encoding* encoding_out) const;
478 V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase(
479 Encoding* encoding_out) const;
480
485 // TODO(pthier): Change return type to const ExternalStringResource*.
486 V8_INLINE ExternalStringResource* GetExternalStringResource() const;
487
492 V8_INLINE const ExternalOneByteStringResource*
493 GetExternalOneByteStringResource() const;
494
495 V8_INLINE static String* Cast(v8::Data* data) {
496#ifdef V8_ENABLE_CHECKS
497 CheckCast(data);
498#endif
499 return static_cast<String*>(data);
500 }
501
511 template <int N>
513 Isolate* isolate, const char (&literal)[N],
514 NewStringType type = NewStringType::kNormal) {
515 static_assert(N <= kMaxLength, "String is too long");
516 return NewFromUtf8Literal(isolate, literal, type, N - 1);
517 }
518
522 Isolate* isolate, const char* data,
523 NewStringType type = NewStringType::kNormal, int length = -1);
524
528 Isolate* isolate, const uint8_t* data,
529 NewStringType type = NewStringType::kNormal, int length = -1);
530
534 Isolate* isolate, const uint16_t* data,
535 NewStringType type = NewStringType::kNormal, int length = -1);
536
542 Local<String> right);
543
553 Isolate* isolate, ExternalStringResource* resource);
554
564 V8_DEPRECATE_SOON("Use the version with the isolate argument instead.")
565 bool MakeExternal(ExternalStringResource* resource);
566
576 bool MakeExternal(Isolate* isolate, ExternalStringResource* resource);
577
586 static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewExternalOneByte(
587 Isolate* isolate, ExternalOneByteStringResource* resource);
588
598 V8_DEPRECATE_SOON("Use the version with the isolate argument instead.")
599 bool MakeExternal(ExternalOneByteStringResource* resource);
600
610 bool MakeExternal(Isolate* isolate, ExternalOneByteStringResource* resource);
611
616 bool CanMakeExternal(Encoding encoding) const;
617
621 bool StringEquals(Local<String> str) const;
622
634 public:
637 char* operator*() { return str_; }
638 const char* operator*() const { return str_; }
639 size_t length() const { return length_; }
640 std::string_view as_view() const { return std::string_view(str_, length_); }
641
642 // Disallow copying and assigning.
643 Utf8Value(const Utf8Value&) = delete;
644 void operator=(const Utf8Value&) = delete;
645
646 private:
647 char* str_;
648 size_t length_;
649 };
650
662 "Prefer using String::ValueView if you can, or string->Write to a "
663 "buffer if you cannot.") V8_EXPORT Value {
664 public:
666 "Prefer using String::ValueView if you can, or string->Write to a "
667 "buffer if you cannot.")
668 Value(Isolate* isolate, Local<v8::Value> obj);
670 uint16_t* operator*() { return str_; }
671 const uint16_t* operator*() const { return str_; }
672 uint32_t length() const { return length_; }
673
674 // Disallow copying and assigning.
675 Value(const Value&) = delete;
676 void operator=(const Value&) = delete;
677
678 private:
679 uint16_t* str_;
680 uint32_t length_;
681 };
682
694 public:
697 const uint8_t* data8() const {
698#if V8_ENABLE_CHECKS
699 CheckOneByte(true);
700#endif
701 return data8_;
702 }
703 const uint16_t* data16() const {
704#if V8_ENABLE_CHECKS
705 CheckOneByte(false);
706#endif
707 return data16_;
708 }
709 uint32_t length() const { return length_; }
710 bool is_one_byte() const { return is_one_byte_; }
711
712 // Disallow copying and assigning.
713 ValueView(const ValueView&) = delete;
714 void operator=(const ValueView&) = delete;
715
716 private:
717 void CheckOneByte(bool is_one_byte) const;
718
719 Local<v8::String> flat_str_;
720 union {
721 const uint8_t* data8_;
722 const uint16_t* data16_;
723 };
724 uint32_t length_;
725 bool is_one_byte_;
726 // Avoid exposing the internal DisallowGarbageCollection scope.
727 alignas(internal::Internals::
728 kDisallowGarbageCollectionAlign) char no_gc_debug_scope_
729 [internal::Internals::kDisallowGarbageCollectionSize];
730 };
731
732 private:
733 void VerifyExternalStringResourceBase(const ExternalStringResourceBase* v,
734 Encoding encoding) const;
735 ExternalStringResource* GetExternalStringResourceSlow() const;
736 const ExternalOneByteStringResource* GetExternalOneByteStringResourceSlow()
737 const;
738 ExternalStringResourceBase* GetExternalStringResourceBaseSlow(
739 String::Encoding* encoding_out) const;
740
741 static Local<v8::String> NewFromUtf8Literal(Isolate* isolate,
742 const char* literal,
743 NewStringType type, int length);
744
745 static void CheckCast(v8::Data* that);
746};
747
748// Zero-length string specialization (templated string size includes
749// terminator).
750template <>
752 Isolate* isolate, const char (&literal)[1], NewStringType type) {
753 return String::Empty(isolate);
754}
755
760 public:
761 virtual ~ExternalResourceVisitor() = default;
762 virtual void VisitExternalString(Local<String> string) {}
763};
764
768class V8_EXPORT Symbol : public Name {
769 public:
774
779 static Local<Symbol> New(Isolate* isolate,
780 Local<String> description = Local<String>());
781
790 static Local<Symbol> For(Isolate* isolate, Local<String> description);
791
796 static Local<Symbol> ForApi(Isolate* isolate, Local<String> description);
797
798 // Well-known symbols
812
813 V8_INLINE static Symbol* Cast(Data* data) {
814#ifdef V8_ENABLE_CHECKS
815 CheckCast(data);
816#endif
817 return static_cast<Symbol*>(data);
818 }
819
820 private:
821 Symbol();
822 static void CheckCast(Data* that);
823};
824
830 private:
831 Numeric();
832 static void CheckCast(v8::Data* that);
833};
834
838class V8_EXPORT Number : public Numeric {
839 public:
840 double Value() const;
841 static Local<Number> New(Isolate* isolate, double value);
842 template <typename Int>
843 requires(std::is_integral<Int>::value && !std::is_same<Int, bool>::value &&
844 std::is_signed_v<Int> && sizeof(Int) <= sizeof(int32_t))
845 V8_INLINE static Local<Number> New(Isolate* isolate, Int value) {
846 return NewFromInt32(isolate, value);
847 }
848 template <typename UInt>
849 requires(std::is_integral<UInt>::value &&
850 !std::is_same<UInt, bool>::value && std::is_unsigned_v<UInt> &&
851 sizeof(UInt) <= sizeof(uint32_t))
852 V8_INLINE static Local<Number> New(Isolate* isolate, UInt value) {
853 return NewFromUint32(isolate, value);
854 }
855 V8_INLINE static Number* Cast(v8::Data* data) {
856#ifdef V8_ENABLE_CHECKS
857 CheckCast(data);
858#endif
859 return static_cast<Number*>(data);
860 }
861
862 private:
863 Number();
864 static Local<Number> NewFromInt32(Isolate* isolate, int32_t value);
865 static Local<Number> NewFromUint32(Isolate* isolate, uint32_t value);
866 static void CheckCast(v8::Data* that);
867};
868
872class V8_EXPORT Integer : public Number {
873 public:
874 static Local<Integer> New(Isolate* isolate, int32_t value);
875 static Local<Integer> NewFromUnsigned(Isolate* isolate, uint32_t value);
876 int64_t Value() const;
878#ifdef V8_ENABLE_CHECKS
879 CheckCast(data);
880#endif
881 return static_cast<Integer*>(data);
882 }
883
884 private:
885 Integer();
886 static void CheckCast(v8::Data* that);
887};
888
892class V8_EXPORT Int32 : public Integer {
893 public:
894 int32_t Value() const;
895 V8_INLINE static Int32* Cast(v8::Data* data) {
896#ifdef V8_ENABLE_CHECKS
897 CheckCast(data);
898#endif
899 return static_cast<Int32*>(data);
900 }
901
902 private:
903 Int32();
904 static void CheckCast(v8::Data* that);
905};
906
910class V8_EXPORT Uint32 : public Integer {
911 public:
912 uint32_t Value() const;
913 V8_INLINE static Uint32* Cast(v8::Data* data) {
914#ifdef V8_ENABLE_CHECKS
915 CheckCast(data);
916#endif
917 return static_cast<Uint32*>(data);
918 }
919
920 private:
921 Uint32();
922 static void CheckCast(v8::Data* that);
923};
924
928class V8_EXPORT BigInt : public Numeric {
929 public:
930 static Local<BigInt> New(Isolate* isolate, int64_t value);
931 static Local<BigInt> NewFromUnsigned(Isolate* isolate, uint64_t value);
939 static MaybeLocal<BigInt> NewFromWords(Local<Context> context, int sign_bit,
940 int word_count, const uint64_t* words);
941
948 uint64_t Uint64Value(bool* lossless = nullptr) const;
949
955 int64_t Int64Value(bool* lossless = nullptr) const;
956
961 int WordCount() const;
962
971 void ToWordsArray(int* sign_bit, int* word_count, uint64_t* words) const;
972
973 V8_INLINE static BigInt* Cast(v8::Data* data) {
974#ifdef V8_ENABLE_CHECKS
975 CheckCast(data);
976#endif
977 return static_cast<BigInt*>(data);
978 }
979
980 private:
981 BigInt();
982 static void CheckCast(v8::Data* that);
983};
984
986 using S = internal::Address;
987 using I = internal::Internals;
988 I::CheckInitialized(isolate);
989 S* slot = I::GetRootSlot(isolate, I::kEmptyStringRootIndex);
990 return Local<String>::FromSlot(slot);
991}
992
994 using A = internal::Address;
995 using I = internal::Internals;
997
999 if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
1000 Isolate* isolate = I::GetCurrentIsolateForSandbox();
1001 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1002 isolate, obj, I::kStringResourceOffset);
1003 result = reinterpret_cast<String::ExternalStringResource*>(value);
1004 } else {
1005 result = GetExternalStringResourceSlow();
1006 }
1007#ifdef V8_ENABLE_CHECKS
1008 VerifyExternalStringResourceBase(result, Encoding::TWO_BYTE_ENCODING);
1009#endif
1010 return result;
1011}
1012
1015 using A = internal::Address;
1016 using I = internal::Internals;
1018 const ExternalOneByteStringResource* result;
1019 if (I::IsExternalOneByteString(I::GetInstanceType(obj))) {
1020 Isolate* isolate = I::GetCurrentIsolateForSandbox();
1021 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1022 isolate, obj, I::kStringResourceOffset);
1023 result = reinterpret_cast<String::ExternalOneByteStringResource*>(value);
1024 } else {
1025 result = GetExternalOneByteStringResourceSlow();
1026 }
1027#ifdef V8_ENABLE_CHECKS
1028 VerifyExternalStringResourceBase(result, Encoding::ONE_BYTE_ENCODING);
1029#endif
1030 return result;
1031}
1032
1034 v8::Isolate* isolate, String::Encoding* encoding_out) const {
1035 using A = internal::Address;
1036 using I = internal::Internals;
1038 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
1039 *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
1041 if (type == I::kExternalOneByteRepresentationTag ||
1042 type == I::kExternalTwoByteRepresentationTag) {
1043 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1044 isolate, obj, I::kStringResourceOffset);
1045 resource = reinterpret_cast<ExternalStringResourceBase*>(value);
1046 } else {
1047 resource = GetExternalStringResourceBaseSlow(encoding_out);
1048 }
1049#ifdef V8_ENABLE_CHECKS
1050 VerifyExternalStringResourceBase(resource, *encoding_out);
1051#endif
1052 return resource;
1053}
1054
1056 String::Encoding* encoding_out) const {
1058 return GetExternalStringResourceBase(isolate, encoding_out);
1059}
1060
1061// --- Statics ---
1062
1064 using S = internal::Address;
1065 using I = internal::Internals;
1066 I::CheckInitialized(isolate);
1067 S* slot = I::GetRootSlot(isolate, I::kUndefinedValueRootIndex);
1068 return Local<Primitive>::FromSlot(slot);
1069}
1070
1072 using S = internal::Address;
1073 using I = internal::Internals;
1074 I::CheckInitialized(isolate);
1075 S* slot = I::GetRootSlot(isolate, I::kNullValueRootIndex);
1076 return Local<Primitive>::FromSlot(slot);
1077}
1078
1080 using S = internal::Address;
1081 using I = internal::Internals;
1082 I::CheckInitialized(isolate);
1083 S* slot = I::GetRootSlot(isolate, I::kTrueValueRootIndex);
1084 return Local<Boolean>::FromSlot(slot);
1085}
1086
1088 using S = internal::Address;
1089 using I = internal::Internals;
1090 I::CheckInitialized(isolate);
1091 S* slot = I::GetRootSlot(isolate, I::kFalseValueRootIndex);
1092 return Local<Boolean>::FromSlot(slot);
1093}
1094
1095Local<Boolean> Boolean::New(Isolate* isolate, bool value) {
1096 return value ? True(isolate) : False(isolate);
1097}
1098
1099} // namespace v8
1100
1101#endif // INCLUDE_V8_PRIMITIVE_H_
Definition: v8-primitive.h:928
uint64_t Uint64Value(bool *lossless=nullptr) const
static BigInt * Cast(v8::Data *data)
Definition: v8-primitive.h:973
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)
int WordCount() const
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:37
bool Value() const
static Local< Boolean > New(Isolate *isolate, bool value)
Definition: v8-primitive.h:1095
static Boolean * Cast(v8::Data *data)
Definition: v8-primitive.h:40
Definition: v8-data.h:18
Definition: v8-primitive.h:759
virtual ~ExternalResourceVisitor()=default
virtual void VisitExternalString(Local< String > string)
Definition: v8-primitive.h:762
Definition: v8-primitive.h:892
static Int32 * Cast(v8::Data *data)
Definition: v8-primitive.h:895
int32_t Value() const
Definition: v8-primitive.h:872
static Integer * Cast(v8::Data *data)
Definition: v8-primitive.h:877
static Local< Integer > New(Isolate *isolate, int32_t value)
static Local< Integer > NewFromUnsigned(Isolate *isolate, uint32_t value)
int64_t Value() const
Definition: v8-isolate.h:305
Definition: v8-local-handle.h:359
Definition: v8-local-handle.h:730
Definition: v8-primitive.h:81
static Name * Cast(Data *data)
Definition: v8-primitive.h:92
int GetIdentityHash()
Definition: v8-primitive.h:838
static Local< Number > New(Isolate *isolate, double value)
static Local< Number > New(Isolate *isolate, Int value)
Definition: v8-primitive.h:845
static Local< Number > New(Isolate *isolate, UInt value)
Definition: v8-primitive.h:852
static Number * Cast(v8::Data *data)
Definition: v8-primitive.h:855
double Value() const
Definition: v8-primitive.h:829
Definition: v8-primitive.h:60
static Local< PrimitiveArray > New(Isolate *isolate, int length)
Local< Primitive > Get(Isolate *isolate, int index)
static PrimitiveArray * Cast(Data *data)
Definition: v8-primitive.h:67
int Length() const
void Set(Isolate *isolate, int index, Local< Primitive > item)
Definition: v8-primitive.h:31
Definition: v8-primitive.h:429
const char * cached_data() const
Definition: v8-primitive.h:451
~ExternalOneByteStringResource() override=default
virtual const char * data() const =0
virtual void RecordSharedMemoryUsage(const void *location, size_t size)=0
Definition: v8-primitive.h:273
void operator=(const ExternalStringResourceBase &)=delete
virtual void Unaccount(Isolate *isolate)
Definition: v8-primitive.h:292
ExternalStringResourceBase(const ExternalStringResourceBase &)=delete
virtual ~ExternalStringResourceBase()=default
virtual void Unlock() const
Definition: v8-primitive.h:359
virtual void EstimateSharedMemoryUsage(SharedMemoryUsageRecorder *recorder) const
Definition: v8-primitive.h:322
virtual bool IsCacheable() const
Definition: v8-primitive.h:282
virtual void Lock() const
Definition: v8-primitive.h:354
virtual size_t EstimateMemoryUsage() const
Definition: v8-primitive.h:303
virtual void Dispose()
Definition: v8-primitive.h:341
Definition: v8-primitive.h:374
virtual const uint16_t * data() const =0
const uint16_t * cached_data() const
Definition: v8-primitive.h:398
virtual size_t length() const =0
~ExternalStringResource() override=default
Definition: v8-primitive.h:633
char * operator*()
Definition: v8-primitive.h:637
Utf8Value(Isolate *isolate, Local< v8::Value > obj)
Utf8Value(const Utf8Value &)=delete
const char * operator*() const
Definition: v8-primitive.h:638
void operator=(const Utf8Value &)=delete
std::string_view as_view() const
Definition: v8-primitive.h:640
size_t length() const
Definition: v8-primitive.h:639
Definition: v8-primitive.h:693
bool is_one_byte() const
Definition: v8-primitive.h:710
const uint16_t * data16_
Definition: v8-primitive.h:722
void operator=(const ValueView &)=delete
const uint8_t * data8() const
Definition: v8-primitive.h:697
uint32_t length() const
Definition: v8-primitive.h:709
ValueView(const ValueView &)=delete
const uint16_t * data16() const
Definition: v8-primitive.h:703
ValueView(Isolate *isolate, Local< v8::String > str)
const uint8_t * data8_
Definition: v8-primitive.h:721
Definition: v8-primitive.h:663
const uint16_t * operator*() const
Definition: v8-primitive.h:671
uint32_t length() const
Definition: v8-primitive.h:672
Value(const Value &)=delete
void operator=(const Value &)=delete
Definition: v8-primitive.h:126
bool IsInStringTable(Isolate *isolate) const
bool IsExternalTwoByte() const
bool IsExternal() 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:1033
Encoding
Definition: v8-primitive.h:135
@ ONE_BYTE_ENCODING
Definition: v8-primitive.h:138
@ TWO_BYTE_ENCODING
Definition: v8-primitive.h:137
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)
bool IsOneByte() const
static String * Cast(v8::Data *data)
Definition: v8-primitive.h:495
size_t Utf8Length(Isolate *isolate) const
static Local< String > Empty(Isolate *isolate)
Definition: v8-primitive.h:985
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:512
ExternalStringResource * GetExternalStringResource() const
Definition: v8-primitive.h:993
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:1014
void Write(Isolate *isolate, uint32_t offset, uint32_t length, uint16_t *buffer, int flags=WriteFlags::kNone) const
int Length() const
Definition: v8-primitive.h:768
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:813
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:910
static Uint32 * Cast(v8::Data *data)
Definition: v8-primitive.h:913
uint32_t Value() const
Definition: v8-value.h:32
Definition: v8-internal.h:979
static v8::Isolate * GetCurrentIsolateForSandbox()
Definition: v8-internal.h:1450
static Address ValueAsAddress(const T *value)
Definition: v8-internal.h:1842
uintptr_t Address
Definition: v8-internal.h:38
Definition: libplatform.h:15
Local< Primitive > Null(Isolate *isolate)
Definition: v8-primitive.h:1071
Local< Primitive > Undefined(Isolate *isolate)
Definition: v8-primitive.h:1063
Local< Boolean > False(Isolate *isolate)
Definition: v8-primitive.h:1087
Local< Boolean > True(Isolate *isolate)
Definition: v8-primitive.h:1079
NewStringType
Definition: v8-primitive.h:109
Definition: v8-primitive.h:168
#define V8_EXPORT
Definition: v8config.h:874
#define V8_INLINE
Definition: v8config.h:518
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:631
#define V8_DEPRECATED(message)
Definition: v8config.h:623
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:688