Loading...
Searching...
No Matches
v8-object.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_OBJECT_H_
6#define INCLUDE_V8_OBJECT_H_
7
8#include "v8-internal.h" // NOLINT(build/include_directory)
9#include "v8-local-handle.h" // NOLINT(build/include_directory)
10#include "v8-maybe.h" // NOLINT(build/include_directory)
11#include "v8-persistent-handle.h" // NOLINT(build/include_directory)
12#include "v8-primitive.h" // NOLINT(build/include_directory)
13#include "v8-sandbox.h" // NOLINT(build/include_directory)
14#include "v8-traced-handle.h" // NOLINT(build/include_directory)
15#include "v8-value.h" // NOLINT(build/include_directory)
16#include "v8config.h" // NOLINT(build/include_directory)
17
18namespace v8 {
19
20class Array;
21class Function;
22class FunctionTemplate;
23template <typename T>
24class PropertyCallbackInfo;
25
31class V8_EXPORT Private : public Data {
32 public:
37
41 static Local<Private> New(Isolate* isolate,
43
54
55 V8_INLINE static Private* Cast(Data* data);
56
57 private:
58 Private();
59
60 static void CheckCast(Data* that);
61};
62
92 public:
93 // GenericDescriptor
95
96 // DataDescriptor
98
99 // DataDescriptor with writable property
100 PropertyDescriptor(Local<Value> value, bool writable);
101
102 // AccessorDescriptor
104
106
108 bool has_value() const;
109
111 bool has_get() const;
113 bool has_set() const;
114
115 void set_enumerable(bool enumerable);
116 bool enumerable() const;
117 bool has_enumerable() const;
118
119 void set_configurable(bool configurable);
120 bool configurable() const;
121 bool has_configurable() const;
122
123 bool writable() const;
124 bool has_writable() const;
125
126 struct PrivateData;
127 PrivateData* get_private() const { return private_; }
128
130 void operator=(const PropertyDescriptor&) = delete;
131
132 private:
133 PrivateData* private_;
134};
135
141 None = 0,
143 ReadOnly = 1 << 0,
145 DontEnum = 1 << 1,
147 DontDelete = 1 << 2
149
156 "Use AccessorNameGetterCallback signature instead") =
157 void (*)(Local<String> property, const PropertyCallbackInfo<Value>& info);
159 void (*)(Local<Name> property, const PropertyCallbackInfo<Value>& info);
160
162 "Use AccessorNameSetterCallback signature instead") =
163 void (*)(Local<String> property, Local<Value> value,
164 const PropertyCallbackInfo<void>& info);
166 void (*)(Local<Name> property, Local<Value> value,
167 const PropertyCallbackInfo<void>& info);
168
179};
180
190 SKIP_SYMBOLS = 16
192
203enum class SideEffectType {
207};
208
217
223
229
234
238class V8_EXPORT Object : public Value {
239 public:
245 Local<Value> key, Local<Value> value);
246
248 Local<Value> value);
249
261 Local<Name> key,
262 Local<Value> value);
264 uint32_t index,
265 Local<Value> value);
266
277 Local<Context> context, Local<Name> key, Local<Value> value,
278 PropertyAttribute attributes = None);
279
297 Local<Context> context, Local<Name> key, PropertyDescriptor& descriptor);
298
300 Local<Value> key);
301
303 uint32_t index);
304
311 Local<Context> context, Local<Value> key);
312
318 Local<Context> context, Local<Name> key);
319
336 Local<Value> key);
337
339 Local<Value> key);
340
342
344 uint32_t index);
345
346 V8_DEPRECATE_SOON("Use SetNativeDataProperty instead")
347 V8_WARN_UNUSED_RESULT Maybe<bool> SetAccessor(
348 Local<Context> context, Local<Name> name,
350 AccessorNameSetterCallback setter = nullptr,
351 MaybeLocal<Value> data = MaybeLocal<Value>(),
352 AccessControl deprecated_settings = DEFAULT,
353 PropertyAttribute attribute = None,
354 SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
355 SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
356
357 void SetAccessorProperty(Local<Name> name, Local<Function> getter,
358 Local<Function> setter = Local<Function>(),
359 PropertyAttribute attributes = None);
360
365 V8_WARN_UNUSED_RESULT Maybe<bool> SetNativeDataProperty(
366 Local<Context> context, Local<Name> name,
368 AccessorNameSetterCallback setter = nullptr,
369 Local<Value> data = Local<Value>(), PropertyAttribute attributes = None,
370 SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
371 SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
372
381 V8_WARN_UNUSED_RESULT Maybe<bool> SetLazyDataProperty(
382 Local<Context> context, Local<Name> name,
384 PropertyAttribute attributes = None,
385 SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
386 SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
387
394 Maybe<bool> HasPrivate(Local<Context> context, Local<Private> key);
395 Maybe<bool> SetPrivate(Local<Context> context, Local<Private> key,
396 Local<Value> value);
397 Maybe<bool> DeletePrivate(Local<Context> context, Local<Private> key);
398 MaybeLocal<Value> GetPrivate(Local<Context> context, Local<Private> key);
399
407 Local<Context> context);
409 Local<Context> context, KeyCollectionMode mode,
410 PropertyFilter property_filter, IndexFilter index_filter,
411 KeyConversionMode key_conversion = KeyConversionMode::kKeepNumbers);
412
419 Local<Context> context);
420
428 Local<Context> context, PropertyFilter filter,
429 KeyConversionMode key_conversion = KeyConversionMode::kKeepNumbers);
430
436 // V8_DEPRECATE_SOON(
437 // "V8 will stop providing access to hidden prototype (i.e. "
438 // "JSGlobalObject). Use GetPrototypeV2() instead. "
439 // "See http://crbug.com/333672197.")
440 Local<Value> GetPrototype();
441
448 Local<Value> GetPrototypeV2();
449
455 // V8_DEPRECATE_SOON(
456 // "V8 will stop providing access to hidden prototype (i.e. "
457 // "JSGlobalObject). Use SetPrototypeV2() instead. "
458 // "See http://crbug.com/333672197.")
459 V8_WARN_UNUSED_RESULT Maybe<bool> SetPrototype(Local<Context> context,
460 Local<Value> prototype);
461
468 V8_WARN_UNUSED_RESULT Maybe<bool> SetPrototypeV2(Local<Context> context,
469 Local<Value> prototype);
470
475 Local<Object> FindInstanceInPrototypeChain(Local<FunctionTemplate> tmpl);
476
483 Local<Context> context);
484
488 Local<String> GetConstructorName();
489
493 Maybe<bool> SetIntegrityLevel(Local<Context> context, IntegrityLevel level);
494
496 int InternalFieldCount() const;
497
499 V8_INLINE static int InternalFieldCount(
500 const PersistentBase<Object>& object) {
501 return object.template value<Object>()->InternalFieldCount();
502 }
503
506 const BasicTracedReference<Object>& object) {
507 return object.template value<Object>()->InternalFieldCount();
508 }
509
520 V8_INLINE Local<Data> GetInternalField(int index);
521
523 void SetInternalField(int index, Local<Data> data);
524
530 V8_INLINE void* GetAlignedPointerFromInternalField(int index);
531 V8_INLINE void* GetAlignedPointerFromInternalField(v8::Isolate* isolate,
532 int index);
533
536 const PersistentBase<Object>& object, int index) {
537 return object.template value<Object>()->GetAlignedPointerFromInternalField(
538 index);
539 }
540
543 const BasicTracedReference<Object>& object, int index) {
544 return object.template value<Object>()->GetAlignedPointerFromInternalField(
545 index);
546 }
547
553 void SetAlignedPointerInInternalField(int index, void* value);
554 void SetAlignedPointerInInternalFields(int argc, int indices[],
555 void* values[]);
556
567 template <CppHeapPointerTag tag, typename T = void>
568 static V8_INLINE T* Unwrap(v8::Isolate* isolate,
569 const v8::Local<v8::Object>& wrapper);
570 template <CppHeapPointerTag tag, typename T = void>
571 static V8_INLINE T* Unwrap(v8::Isolate* isolate,
572 const PersistentBase<Object>& wrapper);
573 template <CppHeapPointerTag tag, typename T = void>
574 static V8_INLINE T* Unwrap(v8::Isolate* isolate,
575 const BasicTracedReference<Object>& wrapper);
576
586 template <CppHeapPointerTag tag>
587 static V8_INLINE void Wrap(v8::Isolate* isolate,
588 const v8::Local<v8::Object>& wrapper,
589 void* wrappable);
590 template <CppHeapPointerTag tag>
591 static V8_INLINE void Wrap(v8::Isolate* isolate,
592 const PersistentBase<Object>& wrapper,
593 void* wrappable);
594 template <CppHeapPointerTag tag>
595 static V8_INLINE void Wrap(v8::Isolate* isolate,
596 const BasicTracedReference<Object>& wrapper,
597 void* wrappable);
598
606 Local<Name> key);
608 uint32_t index);
623 Local<Name> key);
625 Local<Context> context, uint32_t index);
627 Local<Context> context, Local<Name> key);
628
634 Local<Context> context, Local<Name> key);
635
643 Local<Name> key);
644
651 Local<Context> context, Local<Name> key);
652
659 Local<Context> context, Local<Name> key);
660
663
666
675
680 // TODO(dcarney): take an isolate and optionally bail out?
682
687
692
695 const PersistentBase<Object>& object) {
696 return object.template value<Object>()->GetCreationContext();
697 }
698
711
717 bool IsCallable() const;
718
722 bool IsConstructor() const;
723
735 bool IsApiWrapper() const;
736
742 bool IsUndetectable() const;
743
749 Local<Value> recv,
750 int argc,
751 Local<Value> argv[]);
752
759 Local<Context> context, int argc, Local<Value> argv[]);
760
765
767 return handle.template value<Object>()->GetIsolate();
768 }
769
780
781 static Local<Object> New(Isolate* isolate);
782
791 static Local<Object> New(Isolate* isolate, Local<Value> prototype_or_null,
792 Local<Name>* names, Local<Value>* values,
793 size_t length);
794
795 V8_INLINE static Object* Cast(Value* obj);
796
805 bool IsCodeLike(Isolate* isolate) const;
806
807 private:
808 static void* Unwrap(v8::Isolate* isolate, internal::Address wrapper_obj,
810 static void Wrap(v8::Isolate* isolate, internal::Address wrapper_obj,
811 CppHeapPointerTag tag, void* wrappable);
812
813 Object();
814 static void CheckCast(Value* obj);
815 Local<Data> SlowGetInternalField(int index);
816 void* SlowGetAlignedPointerFromInternalField(int index);
817 void* SlowGetAlignedPointerFromInternalField(v8::Isolate* isolate, int index);
818};
819
820// --- Implementation ---
821
823#ifndef V8_ENABLE_CHECKS
824 using A = internal::Address;
825 using I = internal::Internals;
827 // Fast path: If the object is a plain JSObject, which is the common case, we
828 // know where to find the internal fields and can return the value directly.
829 int instance_type = I::GetInstanceType(obj);
830 if (I::CanHaveInternalField(instance_type)) {
831 int offset = I::kJSAPIObjectWithEmbedderSlotsHeaderSize +
832 (I::kEmbedderDataSlotSize * index);
833 A value = I::ReadRawField<A>(obj, offset);
834#ifdef V8_COMPRESS_POINTERS
835 // We read the full pointer value and then decompress it in order to avoid
836 // dealing with potential endiannes issues.
837 value = I::DecompressTaggedField(obj, static_cast<uint32_t>(value));
838#endif
839
840 auto isolate = reinterpret_cast<v8::Isolate*>(
842 return Local<Data>::New(isolate, value);
843 }
844#endif
845 return SlowGetInternalField(index);
846}
847
849 int index) {
850#if !defined(V8_ENABLE_CHECKS)
851 using A = internal::Address;
852 using I = internal::Internals;
854 // Fast path: If the object is a plain JSObject, which is the common case, we
855 // know where to find the internal fields and can return the value directly.
856 auto instance_type = I::GetInstanceType(obj);
857 if (V8_LIKELY(I::CanHaveInternalField(instance_type))) {
858 int offset = I::kJSAPIObjectWithEmbedderSlotsHeaderSize +
859 (I::kEmbedderDataSlotSize * index) +
860 I::kEmbedderDataSlotExternalPointerOffset;
861 A value =
862 I::ReadExternalPointerField<internal::kEmbedderDataSlotPayloadTag>(
863 isolate, obj, offset);
864 return reinterpret_cast<void*>(value);
865 }
866#endif
867 return SlowGetAlignedPointerFromInternalField(isolate, index);
868}
869
871#if !defined(V8_ENABLE_CHECKS)
872 using A = internal::Address;
873 using I = internal::Internals;
875 // Fast path: If the object is a plain JSObject, which is the common case, we
876 // know where to find the internal fields and can return the value directly.
877 auto instance_type = I::GetInstanceType(obj);
878 if (V8_LIKELY(I::CanHaveInternalField(instance_type))) {
879 int offset = I::kJSAPIObjectWithEmbedderSlotsHeaderSize +
880 (I::kEmbedderDataSlotSize * index) +
881 I::kEmbedderDataSlotExternalPointerOffset;
882 Isolate* isolate = I::GetIsolateForSandbox(obj);
883 A value =
884 I::ReadExternalPointerField<internal::kEmbedderDataSlotPayloadTag>(
885 isolate, obj, offset);
886 return reinterpret_cast<void*>(value);
887 }
888#endif
889 return SlowGetAlignedPointerFromInternalField(index);
890}
891
892// static
893template <CppHeapPointerTag tag, typename T>
895 auto obj = internal::ValueHelper::ValueAsAddress(*wrapper);
896#if !defined(V8_ENABLE_CHECKS)
897 return internal::ReadCppHeapPointerField<tag, T>(
899#else // defined(V8_ENABLE_CHECKS)
900 return reinterpret_cast<T*>(Unwrap(isolate, obj, tag));
901#endif // defined(V8_ENABLE_CHECKS)
902}
903
904// static
905template <CppHeapPointerTag tag, typename T>
907 auto obj =
908 internal::ValueHelper::ValueAsAddress(wrapper.template value<Object>());
909#if !defined(V8_ENABLE_CHECKS)
910 return internal::ReadCppHeapPointerField<tag, T>(
912#else // defined(V8_ENABLE_CHECKS)
913
914 return reinterpret_cast<T*>(Unwrap(isolate, obj, tag));
915#endif // defined(V8_ENABLE_CHECKS)
916}
917
918// static
919template <CppHeapPointerTag tag, typename T>
921 const BasicTracedReference<Object>& wrapper) {
922 auto obj =
923 internal::ValueHelper::ValueAsAddress(wrapper.template value<Object>());
924#if !defined(V8_ENABLE_CHECKS)
925 return internal::ReadCppHeapPointerField<tag, T>(
927#else // defined(V8_ENABLE_CHECKS)
928 return reinterpret_cast<T*>(Unwrap(isolate, obj, tag));
929#endif // defined(V8_ENABLE_CHECKS)
930}
931
932// static
933template <CppHeapPointerTag tag>
934void Object::Wrap(v8::Isolate* isolate, const v8::Local<v8::Object>& wrapper,
935 void* wrappable) {
936 auto obj = internal::ValueHelper::ValueAsAddress(*wrapper);
937 Wrap(isolate, obj, tag, wrappable);
938}
939
940// static
941template <CppHeapPointerTag tag>
942void Object::Wrap(v8::Isolate* isolate, const PersistentBase<Object>& wrapper,
943 void* wrappable) {
944 auto obj =
945 internal::ValueHelper::ValueAsAddress(wrapper.template value<Object>());
946 Wrap(isolate, obj, tag, wrappable);
947}
948
949// static
950template <CppHeapPointerTag tag>
952 const BasicTracedReference<Object>& wrapper,
953 void* wrappable) {
954 auto obj =
955 internal::ValueHelper::ValueAsAddress(wrapper.template value<Object>());
956 Wrap(isolate, obj, tag, wrappable);
957}
958
960#ifdef V8_ENABLE_CHECKS
961 CheckCast(data);
962#endif
963 return reinterpret_cast<Private*>(data);
964}
965
967#ifdef V8_ENABLE_CHECKS
968 CheckCast(value);
969#endif
970 return static_cast<Object*>(value);
971}
972
973} // namespace v8
974
975#endif // INCLUDE_V8_OBJECT_H_
Definition: v8-container.h:25
Definition: v8-traced-handle.h:125
Definition: v8-context.h:48
Definition: v8-data.h:18
Definition: v8-template.h:569
Definition: v8-function.h:26
Definition: v8-isolate.h:210
Definition: v8-local-handle.h:258
static Local< T > New(Isolate *isolate, Local< T > that)
Definition: v8-local-handle.h:338
Definition: v8-local-handle.h:619
Definition: v8-maybe.h:32
Definition: v8-primitive.h:79
Definition: v8-object.h:238
Maybe< PropertyAttribute > GetRealNamedPropertyAttributesInPrototypeChain(Local< Context > context, Local< Name > key)
Maybe< PropertyAttribute > GetPropertyAttributes(Local< Context > context, Local< Value > key)
void SetAlignedPointerInInternalField(int index, void *value)
Maybe< bool > CreateDataProperty(Local< Context > context, uint32_t index, Local< Value > value)
MaybeLocal< Value > GetOwnPropertyDescriptor(Local< Context > context, Local< Name > key)
static void Wrap(v8::Isolate *isolate, const v8::Local< v8::Object > &wrapper, void *wrappable)
Definition: v8-object.h:934
static Object * Cast(Value *obj)
Definition: v8-object.h:966
bool HasNamedLookupInterceptor() const
Maybe< bool > HasRealNamedProperty(Local< Context > context, Local< Name > key)
Maybe< bool > Delete(Local< Context > context, uint32_t index)
MaybeLocal< Value > GetRealNamedProperty(Local< Context > context, Local< Name > key)
Maybe< bool > DefineProperty(Local< Context > context, Local< Name > key, PropertyDescriptor &descriptor)
Maybe< bool > Delete(Local< Context > context, Local< Value > key)
bool IsConstructor() const
bool IsUndetectable() const
MaybeLocal< Value > CallAsFunction(Local< Context > context, Local< Value > recv, int argc, Local< Value > argv[])
Local< Object > Clone()
Maybe< bool > DefineOwnProperty(Local< Context > context, Local< Name > key, Local< Value > value, PropertyAttribute attributes=None)
void * GetAlignedPointerFromInternalField(int index)
Definition: v8-object.h:870
void * GetAlignedPointerFromEmbedderDataInCreationContext(int index)
MaybeLocal< Value > GetRealNamedPropertyInPrototypeChain(Local< Context > context, Local< Name > key)
static int InternalFieldCount(const BasicTracedReference< Object > &object)
Definition: v8-object.h:505
Maybe< bool > Has(Local< Context > context, Local< Value > key)
bool IsCodeLike(Isolate *isolate) const
Maybe< bool > Set(Local< Context > context, Local< Value > key, Local< Value > value)
MaybeLocal< Value > CallAsConstructor(Local< Context > context, int argc, Local< Value > argv[])
static void * GetAlignedPointerFromInternalField(const PersistentBase< Object > &object, int index)
Definition: v8-object.h:535
Maybe< bool > CreateDataProperty(Local< Context > context, Local< Name > key, Local< Value > value)
Maybe< bool > HasRealIndexedProperty(Local< Context > context, uint32_t index)
Isolate * GetIsolate()
bool IsApiWrapper() const
MaybeLocal< Value > Get(Local< Context > context, uint32_t index)
Local< Data > GetInternalField(int index)
Definition: v8-object.h:822
Maybe< PropertyAttribute > GetRealNamedPropertyAttributes(Local< Context > context, Local< Name > key)
static Isolate * GetIsolate(const TracedReference< Object > &handle)
Definition: v8-object.h:766
Local< Context > GetCreationContextChecked()
MaybeLocal< Context > GetCreationContext()
MaybeLocal< Value > Get(Local< Context > context, Local< Value > key)
static Local< Object > New(Isolate *isolate)
int GetIdentityHash()
void SetInternalField(int index, Local< Data > data)
static T * Unwrap(v8::Isolate *isolate, const v8::Local< v8::Object > &wrapper)
Definition: v8-object.h:894
Maybe< bool > Set(Local< Context > context, uint32_t index, Local< Value > value)
Maybe< bool > HasOwnProperty(Local< Context > context, Local< Name > key)
Maybe< bool > Has(Local< Context > context, uint32_t index)
MaybeLocal< Array > PreviewEntries(bool *is_key_value)
static MaybeLocal< Context > GetCreationContext(const PersistentBase< Object > &object)
Definition: v8-object.h:694
bool IsCallable() const
void SetAlignedPointerInInternalFields(int argc, int indices[], void *values[])
Maybe< bool > HasRealNamedCallbackProperty(Local< Context > context, Local< Name > key)
static void * GetAlignedPointerFromInternalField(const BasicTracedReference< Object > &object, int index)
Definition: v8-object.h:542
Maybe< bool > HasOwnProperty(Local< Context > context, uint32_t index)
static Local< Object > New(Isolate *isolate, Local< Value > prototype_or_null, Local< Name > *names, Local< Value > *values, size_t length)
bool HasIndexedLookupInterceptor() const
Definition: v8-persistent-handle.h:91
Definition: v8-object.h:31
static Private * Cast(Data *data)
Definition: v8-object.h:959
Local< Value > Name() const
static Local< Private > ForApi(Isolate *isolate, Local< String > name)
static Local< Private > New(Isolate *isolate, Local< String > name=Local< String >())
Definition: v8-function-callback.h:192
Definition: v8-object.h:91
void set_enumerable(bool enumerable)
bool has_writable() const
bool has_value() const
Local< Value > get() const
Local< Value > set() const
PropertyDescriptor(Local< Value > get, Local< Value > set)
bool has_enumerable() const
PropertyDescriptor(Local< Value > value)
PrivateData * get_private() const
Definition: v8-object.h:127
void operator=(const PropertyDescriptor &)=delete
Local< Value > value() const
bool enumerable() const
PropertyDescriptor(Local< Value > value, bool writable)
void set_configurable(bool configurable)
PropertyDescriptor(const PropertyDescriptor &)=delete
bool has_configurable() const
bool configurable() const
Definition: v8-primitive.h:124
Definition: v8-traced-handle.h:177
Definition: v8-value.h:32
Definition: v8-internal.h:729
static const int kJSObjectHeaderSize
Definition: v8-internal.h:746
static Address ValueAsAddress(const T *value)
Definition: v8-internal.h:1457
internal::Isolate * IsolateFromNeverReadOnlySpaceObject(Address obj)
uintptr_t Address
Definition: v8-internal.h:31
Definition: libplatform.h:15
IntegrityLevel
Definition: v8-object.h:233
PropertyAttribute
Definition: v8-object.h:139
@ DontEnum
Definition: v8-object.h:145
@ None
Definition: v8-object.h:141
@ DontDelete
Definition: v8-object.h:147
@ ReadOnly
Definition: v8-object.h:143
KeyCollectionMode
Definition: v8-object.h:216
void(*)(Local< Name > property, const PropertyCallbackInfo< Value > &info) AccessorNameGetterCallback
Definition: v8-object.h:159
SideEffectType
Definition: v8-object.h:203
CppHeapPointerTag
Definition: v8-sandbox.h:20
AccessControl
Definition: v8-object.h:177
@ DEFAULT
Definition: v8-object.h:178
IndexFilter
Definition: v8-object.h:222
KeyConversionMode
Definition: v8-object.h:228
void(*)(Local< String > property, Local< Value > value, const PropertyCallbackInfo< void > &info) AccessorSetterCallback
Definition: v8-object.h:164
void(*)(Local< Name > property, Local< Value > value, const PropertyCallbackInfo< void > &info) AccessorNameSetterCallback
Definition: v8-object.h:167
void(*)(Local< String > property, const PropertyCallbackInfo< Value > &info) AccessorGetterCallback
Definition: v8-object.h:157
PropertyFilter
Definition: v8-object.h:184
@ ONLY_CONFIGURABLE
Definition: v8-object.h:188
@ SKIP_SYMBOLS
Definition: v8-object.h:190
@ ONLY_WRITABLE
Definition: v8-object.h:186
@ ALL_PROPERTIES
Definition: v8-object.h:185
@ SKIP_STRINGS
Definition: v8-object.h:189
@ ONLY_ENUMERABLE
Definition: v8-object.h:187
#define V8_EXPORT
Definition: v8config.h:762
#define V8_INLINE
Definition: v8config.h:477
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:580
#define V8_LIKELY(condition)
Definition: v8config.h:627
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:637