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
289 virtual void Unaccount(Isolate* isolate) {}
290
300 virtual size_t EstimateMemoryUsage() const {
301 return kDefaultMemoryEstimate;
302 }
303 static constexpr size_t kDefaultMemoryEstimate = static_cast<size_t>(-1);
304
306 public:
311 virtual void RecordSharedMemoryUsage(const void* location,
312 size_t size) = 0;
313 };
314
320 SharedMemoryUsageRecorder* recorder) const {}
321
322 // Disallow copying and assigning.
325
326 protected:
328
335 virtual void Dispose() { delete this; }
336
348 virtual void Lock() const {}
349
353 virtual void Unlock() const {}
354
355 private:
356 friend class internal::ExternalString;
357 friend class v8::String;
358 friend class internal::StringForwardingTable;
359 friend class internal::ScopedExternalStringLock;
360 };
361
369 public:
374 ~ExternalStringResource() override = default;
375
380 virtual const uint16_t* data() const = 0;
381
385 virtual size_t length() const = 0;
386
392 const uint16_t* cached_data() const {
393 CheckCachedDataInvariants();
394 return cached_data_;
395 }
396
402
403 protected:
405
406 private:
407 void CheckCachedDataInvariants() const;
408
409 const uint16_t* cached_data_ = nullptr;
410 };
411
424 public:
429 ~ExternalOneByteStringResource() override = default;
430
435 virtual const char* data() const = 0;
436
438 virtual size_t length() const = 0;
439
445 const char* cached_data() const {
446 CheckCachedDataInvariants();
447 return cached_data_;
448 }
449
455
456 protected:
458
459 private:
460 void CheckCachedDataInvariants() const;
461
462 const char* cached_data_ = nullptr;
463 };
464
470 V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase(
471 v8::Isolate* isolate, Encoding* encoding_out) const;
472 V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase(
473 Encoding* encoding_out) const;
474
479 // TODO(pthier): Change return type to const ExternalStringResource*.
480 V8_INLINE ExternalStringResource* GetExternalStringResource() const;
481
486 V8_INLINE const ExternalOneByteStringResource*
487 GetExternalOneByteStringResource() const;
489 V8_INLINE static String* Cast(v8::Data* data) {
490#ifdef V8_ENABLE_CHECKS
491 CheckCast(data);
492#endif
493 return static_cast<String*>(data);
494 }
495
505 template <int N>
507 Isolate* isolate, const char (&literal)[N],
508 NewStringType type = NewStringType::kNormal) {
509 static_assert(N <= kMaxLength, "String is too long");
510 return NewFromUtf8Literal(isolate, literal, type, N - 1);
511 }
512
516 Isolate* isolate, const char* data,
517 NewStringType type = NewStringType::kNormal, int length = -1);
518
522 Isolate* isolate, const uint8_t* data,
523 NewStringType type = NewStringType::kNormal, int length = -1);
524
528 Isolate* isolate, const uint16_t* data,
529 NewStringType type = NewStringType::kNormal, int length = -1);
530
536 Local<String> right);
537
547 Isolate* isolate, ExternalStringResource* resource);
548
558 V8_DEPRECATE_SOON("Use the version with the isolate argument instead.")
559 bool MakeExternal(ExternalStringResource* resource);
560
570 bool MakeExternal(Isolate* isolate, ExternalStringResource* resource);
571
580 static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewExternalOneByte(
581 Isolate* isolate, ExternalOneByteStringResource* resource);
582
592 V8_DEPRECATE_SOON("Use the version with the isolate argument instead.")
593 bool MakeExternal(ExternalOneByteStringResource* resource);
594
604 bool MakeExternal(Isolate* isolate, ExternalOneByteStringResource* resource);
605
610 bool CanMakeExternal(Encoding encoding) const;
611
615 bool StringEquals(Local<String> str) const;
616
628 public:
631 char* operator*() { return str_; }
632 const char* operator*() const { return str_; }
633 size_t length() const { return length_; }
634 std::string_view as_view() const { return std::string_view(str_, length_); }
635
636 // Disallow copying and assigning.
637 Utf8Value(const Utf8Value&) = delete;
638 void operator=(const Utf8Value&) = delete;
639
640 private:
641 char* str_;
642 size_t length_;
643 };
644
656 "Prefer using String::ValueView if you can, or string->Write to a "
657 "buffer if you cannot.") V8_EXPORT Value {
658 public:
660 "Prefer using String::ValueView if you can, or string->Write to a "
661 "buffer if you cannot.")
662 Value(Isolate* isolate, Local<v8::Value> obj);
664 uint16_t* operator*() { return str_; }
665 const uint16_t* operator*() const { return str_; }
666 uint32_t length() const { return length_; }
667
668 // Disallow copying and assigning.
669 Value(const Value&) = delete;
670 void operator=(const Value&) = delete;
671
672 private:
673 uint16_t* str_;
674 uint32_t length_;
675 };
676
688 public:
691 const uint8_t* data8() const {
692#if V8_ENABLE_CHECKS
693 CheckOneByte(true);
694#endif
695 return data8_;
696 }
697 const uint16_t* data16() const {
698#if V8_ENABLE_CHECKS
699 CheckOneByte(false);
700#endif
701 return data16_;
702 }
703 uint32_t length() const { return length_; }
704 bool is_one_byte() const { return is_one_byte_; }
705
706 // Disallow copying and assigning.
707 ValueView(const ValueView&) = delete;
708 void operator=(const ValueView&) = delete;
709
710 private:
711 void CheckOneByte(bool is_one_byte) const;
712
713 Local<v8::String> flat_str_;
714 union {
715 const uint8_t* data8_;
716 const uint16_t* data16_;
717 };
718 uint32_t length_;
719 bool is_one_byte_;
720 // Avoid exposing the internal DisallowGarbageCollection scope.
721 alignas(internal::Internals::
722 kDisallowGarbageCollectionAlign) char no_gc_debug_scope_
723 [internal::Internals::kDisallowGarbageCollectionSize];
724 };
725
726 private:
727 void VerifyExternalStringResourceBase(const ExternalStringResourceBase* v,
728 Encoding encoding) const;
729 ExternalStringResource* GetExternalStringResourceSlow() const;
730 const ExternalOneByteStringResource* GetExternalOneByteStringResourceSlow()
731 const;
732 ExternalStringResourceBase* GetExternalStringResourceBaseSlow(
733 String::Encoding* encoding_out) const;
734
735 static Local<v8::String> NewFromUtf8Literal(Isolate* isolate,
736 const char* literal,
737 NewStringType type, int length);
738
739 static void CheckCast(v8::Data* that);
740};
741
742// Zero-length string specialization (templated string size includes
743// terminator).
744template <>
746 Isolate* isolate, const char (&literal)[1], NewStringType type) {
747 return String::Empty(isolate);
748}
749
754 public:
755 virtual ~ExternalResourceVisitor() = default;
756 virtual void VisitExternalString(Local<String> string) {}
757};
758
762class V8_EXPORT Symbol : public Name {
763 public:
768
773 static Local<Symbol> New(Isolate* isolate,
774 Local<String> description = Local<String>());
775
784 static Local<Symbol> For(Isolate* isolate, Local<String> description);
785
790 static Local<Symbol> ForApi(Isolate* isolate, Local<String> description);
791
792 // Well-known symbols
806
807 V8_INLINE static Symbol* Cast(Data* data) {
808#ifdef V8_ENABLE_CHECKS
809 CheckCast(data);
810#endif
811 return static_cast<Symbol*>(data);
812 }
813
814 private:
815 Symbol();
816 static void CheckCast(Data* that);
817};
818
824 private:
825 Numeric();
826 static void CheckCast(v8::Data* that);
827};
828
832class V8_EXPORT Number : public Numeric {
833 public:
834 double Value() const;
835 static Local<Number> New(Isolate* isolate, double value);
836 template <typename Int>
837 requires(std::is_integral<Int>::value && !std::is_same<Int, bool>::value &&
838 std::is_signed_v<Int> && sizeof(Int) <= sizeof(int32_t))
839 V8_INLINE static Local<Number> New(Isolate* isolate, Int value) {
840 return NewFromInt32(isolate, value);
841 }
842 template <typename UInt>
843 requires(std::is_integral<UInt>::value &&
844 !std::is_same<UInt, bool>::value && std::is_unsigned_v<UInt> &&
845 sizeof(UInt) <= sizeof(uint32_t))
846 V8_INLINE static Local<Number> New(Isolate* isolate, UInt value) {
847 return NewFromUint32(isolate, value);
848 }
849 V8_INLINE static Number* Cast(v8::Data* data) {
850#ifdef V8_ENABLE_CHECKS
851 CheckCast(data);
852#endif
853 return static_cast<Number*>(data);
854 }
855
856 private:
857 Number();
858 static Local<Number> NewFromInt32(Isolate* isolate, int32_t value);
859 static Local<Number> NewFromUint32(Isolate* isolate, uint32_t value);
860 static void CheckCast(v8::Data* that);
861};
862
866class V8_EXPORT Integer : public Number {
867 public:
868 static Local<Integer> New(Isolate* isolate, int32_t value);
869 static Local<Integer> NewFromUnsigned(Isolate* isolate, uint32_t value);
870 int64_t Value() const;
872#ifdef V8_ENABLE_CHECKS
873 CheckCast(data);
874#endif
875 return static_cast<Integer*>(data);
876 }
877
878 private:
879 Integer();
880 static void CheckCast(v8::Data* that);
881};
882
886class V8_EXPORT Int32 : public Integer {
887 public:
888 int32_t Value() const;
889 V8_INLINE static Int32* Cast(v8::Data* data) {
890#ifdef V8_ENABLE_CHECKS
891 CheckCast(data);
892#endif
893 return static_cast<Int32*>(data);
894 }
895
896 private:
897 Int32();
898 static void CheckCast(v8::Data* that);
899};
900
904class V8_EXPORT Uint32 : public Integer {
905 public:
906 uint32_t Value() const;
907 V8_INLINE static Uint32* Cast(v8::Data* data) {
908#ifdef V8_ENABLE_CHECKS
909 CheckCast(data);
910#endif
911 return static_cast<Uint32*>(data);
912 }
913
914 private:
915 Uint32();
916 static void CheckCast(v8::Data* that);
917};
918
922class V8_EXPORT BigInt : public Numeric {
923 public:
924 static Local<BigInt> New(Isolate* isolate, int64_t value);
925 static Local<BigInt> NewFromUnsigned(Isolate* isolate, uint64_t value);
933 static MaybeLocal<BigInt> NewFromWords(Local<Context> context, int sign_bit,
934 int word_count, const uint64_t* words);
935
942 uint64_t Uint64Value(bool* lossless = nullptr) const;
943
949 int64_t Int64Value(bool* lossless = nullptr) const;
950
955 int WordCount() const;
956
965 void ToWordsArray(int* sign_bit, int* word_count, uint64_t* words) const;
966
967 V8_INLINE static BigInt* Cast(v8::Data* data) {
968#ifdef V8_ENABLE_CHECKS
969 CheckCast(data);
970#endif
971 return static_cast<BigInt*>(data);
972 }
973
974 private:
975 BigInt();
976 static void CheckCast(v8::Data* that);
977};
978
980 using S = internal::Address;
981 using I = internal::Internals;
982 I::CheckInitialized(isolate);
983 S* slot = I::GetRootSlot(isolate, I::kEmptyStringRootIndex);
984 return Local<String>::FromSlot(slot);
985}
986
988 using A = internal::Address;
989 using I = internal::Internals;
991
993 if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
994 Isolate* isolate = I::GetCurrentIsolateForSandbox();
995 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
996 isolate, obj, I::kStringResourceOffset);
997 result = reinterpret_cast<String::ExternalStringResource*>(value);
998 } else {
999 result = GetExternalStringResourceSlow();
1000 }
1001#ifdef V8_ENABLE_CHECKS
1002 VerifyExternalStringResourceBase(result, Encoding::TWO_BYTE_ENCODING);
1003#endif
1004 return result;
1005}
1006
1009 using A = internal::Address;
1010 using I = internal::Internals;
1012 const ExternalOneByteStringResource* result;
1013 if (I::IsExternalOneByteString(I::GetInstanceType(obj))) {
1014 Isolate* isolate = I::GetCurrentIsolateForSandbox();
1015 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1016 isolate, obj, I::kStringResourceOffset);
1017 result = reinterpret_cast<String::ExternalOneByteStringResource*>(value);
1018 } else {
1019 result = GetExternalOneByteStringResourceSlow();
1020 }
1021#ifdef V8_ENABLE_CHECKS
1022 VerifyExternalStringResourceBase(result, Encoding::ONE_BYTE_ENCODING);
1023#endif
1024 return result;
1025}
1026
1028 v8::Isolate* isolate, String::Encoding* encoding_out) const {
1029 using A = internal::Address;
1030 using I = internal::Internals;
1032 int type = I::GetInstanceType(obj) & I::kStringRepresentationAndEncodingMask;
1033 *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
1035 if (type == I::kExternalOneByteRepresentationTag ||
1036 type == I::kExternalTwoByteRepresentationTag) {
1037 A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
1038 isolate, obj, I::kStringResourceOffset);
1039 resource = reinterpret_cast<ExternalStringResourceBase*>(value);
1040 } else {
1041 resource = GetExternalStringResourceBaseSlow(encoding_out);
1042 }
1043#ifdef V8_ENABLE_CHECKS
1044 VerifyExternalStringResourceBase(resource, *encoding_out);
1045#endif
1046 return resource;
1047}
1048
1050 String::Encoding* encoding_out) const {
1052 return GetExternalStringResourceBase(isolate, encoding_out);
1053}
1054
1055// --- Statics ---
1056
1058 using S = internal::Address;
1059 using I = internal::Internals;
1060 I::CheckInitialized(isolate);
1061 S* slot = I::GetRootSlot(isolate, I::kUndefinedValueRootIndex);
1062 return Local<Primitive>::FromSlot(slot);
1063}
1064
1066 using S = internal::Address;
1067 using I = internal::Internals;
1068 I::CheckInitialized(isolate);
1069 S* slot = I::GetRootSlot(isolate, I::kNullValueRootIndex);
1070 return Local<Primitive>::FromSlot(slot);
1071}
1072
1074 using S = internal::Address;
1075 using I = internal::Internals;
1076 I::CheckInitialized(isolate);
1077 S* slot = I::GetRootSlot(isolate, I::kTrueValueRootIndex);
1078 return Local<Boolean>::FromSlot(slot);
1079}
1080
1082 using S = internal::Address;
1083 using I = internal::Internals;
1084 I::CheckInitialized(isolate);
1085 S* slot = I::GetRootSlot(isolate, I::kFalseValueRootIndex);
1086 return Local<Boolean>::FromSlot(slot);
1087}
1088
1089Local<Boolean> Boolean::New(Isolate* isolate, bool value) {
1090 return value ? True(isolate) : False(isolate);
1091}
1092
1093} // namespace v8
1094
1095#endif // INCLUDE_V8_PRIMITIVE_H_
Definition: v8-primitive.h:922
uint64_t Uint64Value(bool *lossless=nullptr) const
static BigInt * Cast(v8::Data *data)
Definition: v8-primitive.h:967
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:1089
static Boolean * Cast(v8::Data *data)
Definition: v8-primitive.h:40
Definition: v8-data.h:18
Definition: v8-primitive.h:753
virtual ~ExternalResourceVisitor()=default
virtual void VisitExternalString(Local< String > string)
Definition: v8-primitive.h:756
Definition: v8-primitive.h:886
static Int32 * Cast(v8::Data *data)
Definition: v8-primitive.h:889
int32_t Value() const
Definition: v8-primitive.h:866
static Integer * Cast(v8::Data *data)
Definition: v8-primitive.h:871
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:291
Definition: v8-local-handle.h:366
Definition: v8-local-handle.h:734
Definition: v8-primitive.h:81
static Name * Cast(Data *data)
Definition: v8-primitive.h:92
int GetIdentityHash()
Definition: v8-primitive.h:832
static Local< Number > New(Isolate *isolate, double value)
static Local< Number > New(Isolate *isolate, Int value)
Definition: v8-primitive.h:839
static Local< Number > New(Isolate *isolate, UInt value)
Definition: v8-primitive.h:846
static Number * Cast(v8::Data *data)
Definition: v8-primitive.h:849
double Value() const
Definition: v8-primitive.h:823
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:423
const char * cached_data() const
Definition: v8-primitive.h:445
~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:289
ExternalStringResourceBase(const ExternalStringResourceBase &)=delete
virtual ~ExternalStringResourceBase()=default
virtual void Unlock() const
Definition: v8-primitive.h:353
virtual void EstimateSharedMemoryUsage(SharedMemoryUsageRecorder *recorder) const
Definition: v8-primitive.h:319
virtual bool IsCacheable() const
Definition: v8-primitive.h:282
virtual void Lock() const
Definition: v8-primitive.h:348
virtual size_t EstimateMemoryUsage() const
Definition: v8-primitive.h:300
virtual void Dispose()
Definition: v8-primitive.h:335
Definition: v8-primitive.h:368
virtual const uint16_t * data() const =0
const uint16_t * cached_data() const
Definition: v8-primitive.h:392
virtual size_t length() const =0
~ExternalStringResource() override=default
Definition: v8-primitive.h:627
char * operator*()
Definition: v8-primitive.h:631
Utf8Value(Isolate *isolate, Local< v8::Value > obj)
Utf8Value(const Utf8Value &)=delete
const char * operator*() const
Definition: v8-primitive.h:632
void operator=(const Utf8Value &)=delete
std::string_view as_view() const
Definition: v8-primitive.h:634
size_t length() const
Definition: v8-primitive.h:633
Definition: v8-primitive.h:687
bool is_one_byte() const
Definition: v8-primitive.h:704
const uint16_t * data16_
Definition: v8-primitive.h:716
void operator=(const ValueView &)=delete
const uint8_t * data8() const
Definition: v8-primitive.h:691
uint32_t length() const
Definition: v8-primitive.h:703
ValueView(const ValueView &)=delete
const uint16_t * data16() const
Definition: v8-primitive.h:697
ValueView(Isolate *isolate, Local< v8::String > str)
const uint8_t * data8_
Definition: v8-primitive.h:715
Definition: v8-primitive.h:657
const uint16_t * operator*() const
Definition: v8-primitive.h:665
uint32_t length() const
Definition: v8-primitive.h:666
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:1027
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:489
size_t Utf8Length(Isolate *isolate) const
static Local< String > Empty(Isolate *isolate)
Definition: v8-primitive.h:979
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:506
ExternalStringResource * GetExternalStringResource() const
Definition: v8-primitive.h:987
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:1008
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:762
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:807
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:904
static Uint32 * Cast(v8::Data *data)
Definition: v8-primitive.h:907
uint32_t Value() const
Definition: v8-value.h:32
Definition: v8-internal.h:1012
static v8::Isolate * GetCurrentIsolateForSandbox()
Definition: v8-internal.h:1495
static Address ValueAsAddress(const T *value)
Definition: v8-internal.h:1887
uintptr_t Address
Definition: v8-internal.h:38
Definition: libplatform.h:15
Local< Primitive > Null(Isolate *isolate)
Definition: v8-primitive.h:1065
Local< Primitive > Undefined(Isolate *isolate)
Definition: v8-primitive.h:1057
Local< Boolean > False(Isolate *isolate)
Definition: v8-primitive.h:1081
Local< Boolean > True(Isolate *isolate)
Definition: v8-primitive.h:1073
NewStringType
Definition: v8-primitive.h:109
Definition: v8-primitive.h:168
#define V8_EXPORT
Definition: v8config.h:856
#define V8_INLINE
Definition: v8config.h:510
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:623
#define V8_DEPRECATED(message)
Definition: v8config.h:615
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:680