v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
api-callbacks-inl.h
Go to the documentation of this file.
1// Copyright 2018 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 V8_OBJECTS_API_CALLBACKS_INL_H_
6#define V8_OBJECTS_API_CALLBACKS_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
15#include "src/objects/name.h"
16#include "src/objects/oddball.h"
18
19// Has to be the last include (doesn't have include guards):
21
22namespace v8 {
23namespace internal {
24
25#include "torque-generated/src/objects/api-callbacks-tq-inl.inc"
26
29TQ_OBJECT_CONSTRUCTORS_IMPL(InterceptorInfo)
30
32 maybe_redirected_getter,
33 Address,
34 kMaybeRedirectedGetterOffset,
39
41 Address result = maybe_redirected_getter(isolate);
42 if (!USE_SIMULATOR_BOOL) return result;
43 if (result == kNullAddress) return kNullAddress;
45}
46
47void AccessorInfo::init_getter(i::IsolateForSandbox isolate,
48 Address initial_value) {
49 init_maybe_redirected_getter(isolate, initial_value);
52 }
53}
54
55void AccessorInfo::set_getter(i::IsolateForSandbox isolate, Address value) {
56 set_maybe_redirected_getter(isolate, value);
59 }
60}
61
64 Address value = maybe_redirected_getter(isolate);
65 if (value == kNullAddress) return;
66 value =
68 set_maybe_redirected_getter(isolate, value);
69}
70
73 Address value = getter(isolate);
74 set_maybe_redirected_getter(isolate, value);
75}
76
78 return maybe_redirected_getter(isolate) != kNullAddress;
79}
80
82 return setter(isolate) != kNullAddress;
83}
84
85BIT_FIELD_ACCESSORS(AccessorInfo, flags, replace_on_access,
86 AccessorInfo::ReplaceOnAccessBit)
87BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_sloppy, AccessorInfo::IsSloppyBit)
89 AccessorInfo::GetterSideEffectTypeBits)
90
91SideEffectType AccessorInfo::setter_side_effect_type() const {
92 return SetterSideEffectTypeBits::decode(flags());
93}
94
96 // We do not support describing setters as having no side effect, since
97 // calling set accessors must go through a store bytecode. Store bytecodes
98 // support checking receivers for temporary objects, but still expect
99 // the receiver to be written to.
101 set_flags(SetterSideEffectTypeBits::update(flags(), value));
102}
103
104BIT_FIELD_ACCESSORS(AccessorInfo, flags, initial_property_attributes,
105 AccessorInfo::InitialAttributesBits)
106
108 if (FIELD_SIZE(kOptionalPaddingOffset) == 0) return;
109 memset(reinterpret_cast<void*>(address() + kOptionalPaddingOffset), 0,
110 FIELD_SIZE(kOptionalPaddingOffset));
111}
112
113// For the purpose of checking whether the respective callback field is
114// initialized we can use any of the named/indexed versions.
115#define INTERCEPTOR_INFO_HAS_GETTER(name) \
116 bool InterceptorInfo::has_##name() const { return has_named_##name(); }
117
125
126#undef INTERCEPTOR_INFO_HAS_GETTER
127
129 InterceptorInfo, named_getter, Address, kGetterOffset,
131 is_named() && (value != kNullAddress))
135 is_named() && (value != kNullAddress))
137 InterceptorInfo, named_query, Address, kQueryOffset,
139 is_named() && (value != kNullAddress))
141 InterceptorInfo, named_descriptor, Address, kDescriptorOffset,
143 is_named() && (value != kNullAddress))
145 InterceptorInfo, named_deleter, Address, kDeleterOffset,
147 is_named() && (value != kNullAddress))
149 InterceptorInfo, named_enumerator, Address, kEnumeratorOffset,
151 is_named() && (value != kNullAddress))
153 InterceptorInfo, named_definer, Address, kDefinerOffset,
155 is_named() && (value != kNullAddress))
156
158 InterceptorInfo, indexed_getter, Address, kGetterOffset,
160 !is_named() && (value != kNullAddress))
162 InterceptorInfo, indexed_setter, Address, kSetterOffset,
164 !is_named() && (value != kNullAddress))
166 InterceptorInfo, indexed_query, Address, kQueryOffset,
168 !is_named() && (value != kNullAddress))
170 InterceptorInfo, indexed_descriptor, Address, kDescriptorOffset,
172 !is_named() && (value != kNullAddress))
174 InterceptorInfo, indexed_deleter, Address, kDeleterOffset,
176 !is_named() && (value != kNullAddress))
178 InterceptorInfo, indexed_enumerator, Address, kEnumeratorOffset,
180 !is_named() && (value != kNullAddress))
182 InterceptorInfo, indexed_definer, Address, kDefinerOffset,
184 !is_named() && (value != kNullAddress))
185
186BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
187 CanInterceptSymbolsBit::kShift)
188BOOL_ACCESSORS(InterceptorInfo, flags, non_masking, NonMaskingBit::kShift)
189BOOL_ACCESSORS(InterceptorInfo, flags, is_named, NamedBit::kShift)
190BOOL_ACCESSORS(InterceptorInfo, flags, has_no_side_effect,
191 HasNoSideEffectBit::kShift)
192// TODO(ishell): remove once all the Api changes are done.
193BOOL_ACCESSORS(InterceptorInfo, flags, has_new_callbacks_signature,
194 HasNewCallbacksSignatureBit::kShift)
195
197 if (FIELD_SIZE(kOptionalPaddingOffset) == 0) return;
198 memset(reinterpret_cast<void*>(address() + kOptionalPaddingOffset), 0,
199 FIELD_SIZE(kOptionalPaddingOffset));
200}
201
202} // namespace internal
203} // namespace v8
204
206
207#endif // V8_OBJECTS_API_CALLBACKS_INL_H_
#define INTERCEPTOR_INFO_HAS_GETTER(name)
PropertyT * getter
void init_getter_redirection(IsolateForSandbox isolate)
void set_setter_side_effect_type(SideEffectType type)
void remove_getter_redirection(IsolateForSandbox isolate)
bool has_getter(Isolate *isolate)
bool has_setter(Isolate *isolate)
static Address Redirect(Address external_function, Type type=ExternalReference::BUILTIN_CALL)
static Address UnwrapRedirection(Address redirection_trampoline)
Address Address Address Address Address Address Address void clear_padding()
#define USE_SIMULATOR_BOOL
Definition globals.h:73
ZoneVector< RpoNumber > & result
bool is_sloppy(LanguageMode language_mode)
Definition globals.h:773
UnionOf< Undefined, FunctionTemplateInfo > UnionOf< Undefined, InterceptorInfo > UnionOf< Undefined, ObjectTemplateInfo > AccessCheckInfo
Flag flags[]
Definition flags.cc:3797
@ kApiIndexedPropertyDescriptorCallbackTag
@ kApiNamedPropertyDefinerCallbackTag
@ kApiIndexedPropertySetterCallbackTag
@ kApiIndexedPropertyGetterCallbackTag
@ kApiNamedPropertyDescriptorCallbackTag
@ kApiIndexedPropertyDefinerCallbackTag
@ kApiNamedPropertyDeleterCallbackTag
@ kApiNamedPropertyGetterCallbackTag
@ kApiIndexedPropertyEnumeratorCallbackTag
@ kApiNamedPropertyQueryCallbackTag
@ kApiIndexedPropertyQueryCallbackTag
@ kApiIndexedPropertyDeleterCallbackTag
@ kApiNamedPropertyEnumeratorCallbackTag
static constexpr Address kNullAddress
Definition v8-internal.h:53
SideEffectType
Definition v8-object.h:198
#define BOOL_ACCESSORS(holder, field, name, offset)
#define TQ_OBJECT_CONSTRUCTORS_IMPL(Type)
#define EXTERNAL_POINTER_ACCESSORS_MAYBE_READ_ONLY_HOST(holder, name, type, offset, tag)
#define BIT_FIELD_ACCESSORS(holder, field, name, BitField)
#define LAZY_EXTERNAL_POINTER_ACCESSORS_MAYBE_READ_ONLY_HOST_CHECKED2( holder, name, type, offset, tag, get_condition, set_condition)
#define CHECK(condition)
Definition logging.h:124
#define CHECK_NE(lhs, rhs)
#define FIELD_SIZE(Name)
Definition utils.h:259