v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
api-arguments-inl.h
Go to the documentation of this file.
1// Copyright 2016 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_API_API_ARGUMENTS_INL_H_
6#define V8_API_API_ARGUMENTS_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
11#include "src/api/api-inl.h"
12#include "src/debug/debug.h"
18
19namespace v8 {
20namespace internal {
21
24
25template <typename T>
27 slot_at(kReturnValueIndex).store(Tagged<Object>(kHandleZapValue));
28}
29
30template <typename T>
31template <typename V>
33 // Check the ReturnValue.
34 FullObjectSlot slot = slot_at(kReturnValueIndex);
35 DCHECK(Is<JSAny>(*slot));
36 return Cast<V>(Handle<Object>(slot.location()));
37}
38
42
44 return *slot_at(T::kThisIndex);
45}
46
47#define DCHECK_NAME_COMPATIBLE(interceptor, name) \
48 DCHECK(interceptor->is_named()); \
49 DCHECK(!name->IsPrivate()); \
50 DCHECK_IMPLIES(IsSymbol(*name), interceptor->can_intercept_symbols());
51
52#define PREPARE_CALLBACK_INFO_ACCESSOR(ISOLATE, F, API_RETURN_TYPE, \
53 ACCESSOR_INFO, RECEIVER, ACCESSOR_KIND, \
54 EXCEPTION_CONTEXT) \
55 if (ISOLATE->should_check_side_effects() && \
56 !ISOLATE->debug()->PerformSideEffectCheckForAccessor( \
57 ACCESSOR_INFO, RECEIVER, ACCESSOR_KIND)) { \
58 return {}; \
59 } \
60 const PropertyCallbackInfo<API_RETURN_TYPE>& callback_info = \
61 GetPropertyCallbackInfo<API_RETURN_TYPE>(); \
62 ExternalCallbackScope call_scope(ISOLATE, FUNCTION_ADDR(F), \
63 EXCEPTION_CONTEXT, &callback_info);
64
65#define PREPARE_CALLBACK_INFO_INTERCEPTOR(ISOLATE, F, API_RETURN_TYPE, \
66 INTERCEPTOR_INFO, EXCEPTION_CONTEXT) \
67 if (ISOLATE->should_check_side_effects() && \
68 !ISOLATE->debug()->PerformSideEffectCheckForInterceptor( \
69 INTERCEPTOR_INFO)) { \
70 return {}; \
71 } \
72 const PropertyCallbackInfo<API_RETURN_TYPE>& callback_info = \
73 GetPropertyCallbackInfo<API_RETURN_TYPE>(); \
74 ExternalCallbackScope call_scope(ISOLATE, FUNCTION_ADDR(F), \
75 EXCEPTION_CONTEXT, &callback_info);
76
79 Isolate* isolate = this->isolate();
80 RCS_SCOPE(isolate, RuntimeCallCounterId::kFunctionCallback);
82 reinterpret_cast<v8::FunctionCallback>(function->callback(isolate));
83 if (isolate->should_check_side_effects() &&
84 !isolate->debug()->PerformSideEffectCheckForCallback(
85 handle(function, isolate))) {
86 return {};
87 }
89 ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f),
92 &info);
93 f(info);
94 return GetReturnValue<Object>(isolate);
95}
96
98#ifdef DEBUG
99// TODO(chromium:1310062): enable this check.
100// if (javascript_execution_counter_) {
101// CHECK_WITH_MSG(javascript_execution_counter_ ==
102// isolate()->javascript_execution_counter(),
103// "Unexpected side effect detected");
104// }
105#endif // DEBUG
106}
107
109 v8::Intercepted intercepted, const char* callback_kind_for_error_message,
110 bool ignore_return_value) {
111 Isolate* isolate = this->isolate();
112 if (isolate->has_exception()) {
113 // TODO(ishell, 328490288): fix Node.js which has Setter/Definer
114 // interceptor callbacks not returning v8::Intercepted::kYes on exceptions.
115 if ((false) && DEBUG_BOOL && (intercepted == v8::Intercepted::kNo)) {
116 FATAL(
117 "Check failed: %s interceptor callback has thrown an "
118 "exception but hasn't returned v8::Intercepted::kYes.",
119 callback_kind_for_error_message);
120 }
122 }
123
124 if (intercepted == v8::Intercepted::kNo) {
125 // Not intercepted, there must be no side effects including exceptions.
126 DCHECK(!isolate->has_exception());
128 }
129 DCHECK_EQ(intercepted, v8::Intercepted::kYes);
131
132 if (ignore_return_value) return Just(InterceptorResult::kTrue);
133
134 bool result = IsTrue(*GetReturnValue<Boolean>(isolate), isolate);
135
136 // TODO(ishell, 348688196): ensure callbacks comply with this and
137 // enable the check.
138 if ((false) && DEBUG_BOOL && !result && ShouldThrowOnError()) {
139 FATAL(
140 "Check failed: %s interceptor callback hasn't thrown an "
141 "exception on failure as requested.",
142 callback_kind_for_error_message);
143 }
145}
146
147// -------------------------------------------------------------------------
148// Named Interceptor callbacks.
149
152 DirectHandle<InterceptorInfo> interceptor) {
153 DCHECK(interceptor->is_named());
154 RCS_SCOPE(isolate(), RuntimeCallCounterId::kNamedEnumeratorCallback);
155 return CallPropertyEnumerator(interceptor);
156}
157
158// TODO(ishell): return std::optional<PropertyAttributes>.
161 DCHECK_NAME_COMPATIBLE(interceptor, name);
162 Isolate* isolate = this->isolate();
163 RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedQueryCallback);
167 interceptor->named_query(isolate));
168 PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Integer, interceptor,
170 v8::Intercepted intercepted = f(v8::Utils::ToLocal(name), callback_info);
171 if (intercepted == v8::Intercepted::kNo) return {};
172 return GetReturnValue<Object>(isolate);
173}
174
177 DCHECK_NAME_COMPATIBLE(interceptor, name);
178 Isolate* isolate = this->isolate();
179 RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedGetterCallback);
181 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value());
183 interceptor->named_getter(isolate));
184 PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Value, interceptor,
186 v8::Intercepted intercepted = f(v8::Utils::ToLocal(name), callback_info);
187 if (intercepted == v8::Intercepted::kNo) return {};
188 return GetReturnValue<JSAny>(isolate);
189}
190
193 DCHECK_NAME_COMPATIBLE(interceptor, name);
194 Isolate* isolate = this->isolate();
195 RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedDescriptorCallback);
197 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value());
199 reinterpret_cast<NamedPropertyDescriptorCallback>(
200 interceptor->named_descriptor(isolate));
201 PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Value, interceptor,
203 v8::Intercepted intercepted = f(v8::Utils::ToLocal(name), callback_info);
204 if (intercepted == v8::Intercepted::kNo) return {};
205 return GetReturnValue<JSAny>(isolate);
206}
207
210 DirectHandle<Object> value) {
211 DCHECK_NAME_COMPATIBLE(interceptor, name);
212 Isolate* isolate = this->isolate();
213 RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedSetterCallback);
215 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value());
217 interceptor->named_setter(isolate));
221 v8::Intercepted intercepted =
222 f(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), callback_info);
223 return intercepted;
224}
225
228 const v8::PropertyDescriptor& desc) {
229 DCHECK_NAME_COMPATIBLE(interceptor, name);
230 Isolate* isolate = this->isolate();
231 RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedDefinerCallback);
233 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value());
235 reinterpret_cast<NamedPropertyDefinerCallback>(
236 interceptor->named_definer(isolate));
240 v8::Intercepted intercepted =
241 f(v8::Utils::ToLocal(name), desc, callback_info);
242 return intercepted;
243}
244
247 DCHECK_NAME_COMPATIBLE(interceptor, name);
248 Isolate* isolate = this->isolate();
249 RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedDeleterCallback);
251 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value());
253 reinterpret_cast<NamedPropertyDeleterCallback>(
254 interceptor->named_deleter(isolate));
258 v8::Intercepted intercepted = f(v8::Utils::ToLocal(name), callback_info);
259 return intercepted;
260}
261
262// -------------------------------------------------------------------------
263// Indexed Interceptor callbacks.
264
267 DirectHandle<InterceptorInfo> interceptor) {
268 DCHECK(!interceptor->is_named());
269 RCS_SCOPE(isolate(), RuntimeCallCounterId::kIndexedEnumeratorCallback);
270 return CallPropertyEnumerator(interceptor);
271}
272
273// TODO(ishell): return std::optional<PropertyAttributes>.
275 DirectHandle<InterceptorInfo> interceptor, uint32_t index) {
276 DCHECK(!interceptor->is_named());
277 Isolate* isolate = this->isolate();
278 RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedQueryCallback);
279 index_ = index;
280 slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker
283 reinterpret_cast<IndexedPropertyQueryCallbackV2>(
284 interceptor->indexed_query(isolate));
285 PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Integer, interceptor,
287 v8::Intercepted intercepted = f(index, callback_info);
288 if (intercepted == v8::Intercepted::kNo) return {};
289 return GetReturnValue<Object>(isolate);
290}
291
293 DirectHandle<InterceptorInfo> interceptor, uint32_t index) {
294 DCHECK(!interceptor->is_named());
295 Isolate* isolate = this->isolate();
296 RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedGetterCallback);
297 index_ = index;
298 slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker
299 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value());
301 reinterpret_cast<IndexedPropertyGetterCallbackV2>(
302 interceptor->indexed_getter(isolate));
303 PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Value, interceptor,
305 v8::Intercepted intercepted = f(index, callback_info);
306 if (intercepted == v8::Intercepted::kNo) return {};
307 return GetReturnValue<JSAny>(isolate);
308}
309
311 DirectHandle<InterceptorInfo> interceptor, uint32_t index) {
312 DCHECK(!interceptor->is_named());
313 Isolate* isolate = this->isolate();
314 RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedDescriptorCallback);
315 index_ = index;
316 slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker
317 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value());
319 reinterpret_cast<IndexedPropertyDescriptorCallbackV2>(
320 interceptor->indexed_descriptor(isolate));
321 PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Value, interceptor,
323 v8::Intercepted intercepted = f(index, callback_info);
324 if (intercepted == v8::Intercepted::kNo) return {};
325 return GetReturnValue<JSAny>(isolate);
326}
327
329 DirectHandle<InterceptorInfo> interceptor, uint32_t index,
330 DirectHandle<Object> value) {
331 DCHECK(!interceptor->is_named());
332 Isolate* isolate = this->isolate();
333 RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedSetterCallback);
334 index_ = index;
335 slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker
336 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value());
338 reinterpret_cast<IndexedPropertySetterCallbackV2>(
339 interceptor->indexed_setter(isolate));
343 v8::Intercepted intercepted =
344 f(index, v8::Utils::ToLocal(value), callback_info);
345 return intercepted;
346}
347
349 DirectHandle<InterceptorInfo> interceptor, uint32_t index,
350 const v8::PropertyDescriptor& desc) {
351 DCHECK(!interceptor->is_named());
352 Isolate* isolate = this->isolate();
353 RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedDefinerCallback);
354 index_ = index;
355 slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker
356 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value());
358 reinterpret_cast<IndexedPropertyDefinerCallbackV2>(
359 interceptor->indexed_definer(isolate));
363 v8::Intercepted intercepted = f(index, desc, callback_info);
364 return intercepted;
365}
366
368 DirectHandle<InterceptorInfo> interceptor, uint32_t index) {
369 DCHECK(!interceptor->is_named());
370 Isolate* isolate = this->isolate();
371 RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedDeleterCallback);
372 index_ = index;
373 slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker
374 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value());
376 reinterpret_cast<IndexedPropertyDeleterCallbackV2>(
377 interceptor->indexed_deleter(isolate));
378 PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Boolean, interceptor,
380 v8::Intercepted intercepted = f(index, callback_info);
381 return intercepted;
382}
383
386 DirectHandle<InterceptorInfo> interceptor) {
387 // Named and indexed enumerator callbacks have same signatures.
388 static_assert(std::is_same_v<NamedPropertyEnumeratorCallback,
390 Isolate* isolate = this->isolate();
391 slot_at(kPropertyKeyIndex).store(Smi::zero()); // not relevant
392 // Enumerator callback's return value is initialized with undefined even
393 // though it's supposed to return v8::Array.
394 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value());
395 // TODO(ishell): consider making it return v8::Intercepted to indicate
396 // whether the result was set or not.
398 if (interceptor->is_named()) {
399 f = reinterpret_cast<NamedPropertyEnumeratorCallback>(
400 interceptor->named_enumerator(isolate));
401 } else {
402 f = reinterpret_cast<IndexedPropertyEnumeratorCallback>(
403 interceptor->indexed_enumerator(isolate));
404 }
405 PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Array, interceptor,
407 f(callback_info);
409 DCHECK(IsUndefined(*result) || IsJSObject(*result));
411}
412
413// -------------------------------------------------------------------------
414// Accessors
415
418 Isolate* isolate = this->isolate();
419 RCS_SCOPE(isolate, RuntimeCallCounterId::kAccessorGetterCallback);
420 // Unlike interceptor callbacks we know that the property exists, so
421 // the callback is allowed to have side effects.
423
425 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value());
427 reinterpret_cast<AccessorNameGetterCallback>(info->getter(isolate));
429 isolate, f, v8::Value, info, direct_handle(receiver(), isolate),
431 f(v8::Utils::ToLocal(name), callback_info);
432 return GetReturnValue<JSAny>(isolate);
433}
434
437 DirectHandle<Object> value) {
438 Isolate* isolate = this->isolate();
439 RCS_SCOPE(isolate, RuntimeCallCounterId::kAccessorSetterCallback);
440 // Unlike interceptor callbacks we know that the property exists, so
441 // the callback is allowed to have side effects.
443
445 slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value());
446 // The actual type of setter callback is either
447 // v8::AccessorNameSetterCallback or
448 // i::Accessors::AccessorNameBooleanSetterCallback, depending on whether the
449 // AccessorInfo was created by the API or internally (see accessors.cc).
450 // Here we handle both cases using the AccessorNameSetterCallback signature
451 // and checking whether the returned result is set to default value
452 // (the undefined value).
453 // TODO(ishell, 348660658): update V8 Api to allow setter callbacks provide
454 // the result of [[Set]] operation according to JavaScript semantics.
456 accessor_info->setter(isolate));
458 isolate, f, void, accessor_info, direct_handle(receiver(), isolate),
460 f(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), callback_info);
461 // Historically, in case of v8::AccessorNameSetterCallback it wasn't allowed
462 // to set the result and not setting the result was treated as successful
463 // execution.
464 // During interceptors Api refactoring it was temporarily allowed to call
465 // v8::ReturnValue<void>::Set[NonEmpty](Local<S>) and the result was just
466 // converted to v8::Boolean which was then treated as a result of [[Set]].
467 // In case of AccessorNameBooleanSetterCallback, the result is always
468 // set to v8::Boolean or an exception is be thrown (in which case the
469 // result is ignored anyway). So, regardless of whether the signature was
470 // v8::AccessorNameSetterCallback or AccessorNameBooleanSetterCallback
471 // the result is guaranteed to be v8::Boolean value indicating success or
472 // failure.
474 return IsTrue(*result, isolate);
475}
476
477#undef PREPARE_CALLBACK_INFO_ACCESSOR
478#undef PREPARE_CALLBACK_INFO_INTERCEPTOR
479
480} // namespace internal
481} // namespace v8
482
483#endif // V8_API_API_ARGUMENTS_INL_H_
#define PREPARE_CALLBACK_INFO_INTERCEPTOR(ISOLATE, F, API_RETURN_TYPE, INTERCEPTOR_INFO, EXCEPTION_CONTEXT)
#define PREPARE_CALLBACK_INFO_ACCESSOR(ISOLATE, F, API_RETURN_TYPE, ACCESSOR_INFO, RECEIVER, ACCESSOR_KIND, EXCEPTION_CONTEXT)
#define DCHECK_NAME_COMPATIBLE(interceptor, name)
static constexpr int kThisIndex
static constexpr int kHolderIndex
Handle< V > GetReturnValue(Isolate *isolate) const
Address values_[FunctionCallbackInfo< Value >::kArgsLength]
void store(Tagged< Object > value) const
Definition slots-inl.h:54
DirectHandle< Object > CallOrConstruct(Tagged< FunctionTemplateInfo > function, bool is_construct)
DirectHandle< JSAny > CallNamedGetter(DirectHandle< InterceptorInfo > interceptor, DirectHandle< Name > name)
DirectHandle< JSObjectOrUndefined > CallIndexedEnumerator(DirectHandle< InterceptorInfo > interceptor)
Handle< JSAny > CallIndexedDescriptor(DirectHandle< InterceptorInfo > interceptor, uint32_t index)
DirectHandle< JSAny > CallAccessorGetter(DirectHandle< AccessorInfo > info, DirectHandle< Name > name)
v8::Intercepted CallNamedDeleter(DirectHandle< InterceptorInfo > interceptor, DirectHandle< Name > name)
Maybe< InterceptorResult > GetBooleanReturnValue(v8::Intercepted intercepted, const char *callback_kind_for_error_message, bool ignore_return_value=false)
DirectHandle< JSObjectOrUndefined > CallNamedEnumerator(DirectHandle< InterceptorInfo > interceptor)
DirectHandle< Object > CallNamedQuery(DirectHandle< InterceptorInfo > interceptor, DirectHandle< Name > name)
v8::Intercepted CallNamedSetter(DirectHandle< InterceptorInfo > interceptor, DirectHandle< Name > name, DirectHandle< Object > value)
v8::Intercepted CallNamedDefiner(DirectHandle< InterceptorInfo > interceptor, DirectHandle< Name > name, const v8::PropertyDescriptor &desc)
DirectHandle< JSAny > CallIndexedGetter(DirectHandle< InterceptorInfo > interceptor, uint32_t index)
DirectHandle< JSObjectOrUndefined > CallPropertyEnumerator(DirectHandle< InterceptorInfo > interceptor)
v8::Intercepted CallIndexedDefiner(DirectHandle< InterceptorInfo > interceptor, uint32_t index, const v8::PropertyDescriptor &desc)
DirectHandle< Object > CallIndexedQuery(DirectHandle< InterceptorInfo > interceptor, uint32_t index)
v8::Intercepted CallIndexedDeleter(DirectHandle< InterceptorInfo > interceptor, uint32_t index)
V8_WARN_UNUSED_RESULT bool CallAccessorSetter(DirectHandle< AccessorInfo > info, DirectHandle< Name > name, DirectHandle< Object > value)
v8::Intercepted CallIndexedSetter(DirectHandle< InterceptorInfo > interceptor, uint32_t index, DirectHandle< Object > value)
Handle< JSAny > CallNamedDescriptor(DirectHandle< InterceptorInfo > interceptor, DirectHandle< Name > name)
TData * location() const
Definition slots.h:80
static constexpr Tagged< Smi > FromInt(int value)
Definition smi.h:38
static constexpr Tagged< Smi > zero()
Definition smi.h:99
#define DEBUG_BOOL
Definition globals.h:87
#define FUNCTION_ADDR(f)
Definition globals.h:712
Handle< SharedFunctionInfo > info
bool is_construct
Definition execution.cc:82
ZoneVector< RpoNumber > & result
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
Definition handles-inl.h:72
bool Is(IndirectHandle< U > value)
Definition handles-inl.h:51
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
@ ACCESSOR_GETTER
Definition objects.h:879
@ ACCESSOR_SETTER
Definition objects.h:879
constexpr uint32_t kHandleZapValue
Definition globals.h:1006
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
@ None
Definition v8-object.h:141
Intercepted(*)(uint32_t index, const PropertyCallbackInfo< Boolean > &info) IndexedPropertyDeleterCallbackV2
void(*)(Local< Name > property, const PropertyCallbackInfo< Value > &info) AccessorNameGetterCallback
Definition v8-object.h:155
void(*)(const PropertyCallbackInfo< Array > &info) NamedPropertyEnumeratorCallback
Maybe< T > Nothing()
Definition v8-maybe.h:112
Intercepted(*)( Local< Name > property, const PropertyCallbackInfo< Integer > &info) NamedPropertyQueryCallback
Intercepted(*)( uint32_t index, Local< Value > value, const PropertyCallbackInfo< void > &info) IndexedPropertySetterCallbackV2
Intercepted(*)(uint32_t index, const PropertyCallbackInfo< Value > &info) IndexedPropertyDescriptorCallbackV2
Intercepted(*)( Local< Name > property, const PropertyCallbackInfo< Value > &info) NamedPropertyGetterCallback
Intercepted(*)(uint32_t index, const PropertyCallbackInfo< Value > &info) IndexedPropertyGetterCallbackV2
Intercepted(*)(uint32_t index, const PropertyDescriptor &desc, const PropertyCallbackInfo< void > &info) IndexedPropertyDefinerCallbackV2
void(*)(const FunctionCallbackInfo< Value > &info) FunctionCallback
void(*)(const PropertyCallbackInfo< Array > &info) IndexedPropertyEnumeratorCallback
Intercepted(*)(Local< Name > property, const PropertyDescriptor &desc, const PropertyCallbackInfo< void > &info) NamedPropertyDefinerCallback
void(*)(Local< Name > property, Local< Value > value, const PropertyCallbackInfo< void > &info) AccessorNameSetterCallback
Definition v8-object.h:158
Intercepted(*)( Local< Name > property, const PropertyCallbackInfo< Value > &info) NamedPropertyDescriptorCallback
Intercepted(*)(Local< Name > property, Local< Value > value, const PropertyCallbackInfo< void > &info) NamedPropertySetterCallback
Intercepted(*)( Local< Name > property, const PropertyCallbackInfo< Boolean > &info) NamedPropertyDeleterCallback
Intercepted(*)(uint32_t index, const PropertyCallbackInfo< Integer > &info) IndexedPropertyQueryCallbackV2
Maybe< T > Just(const T &t)
Definition v8-maybe.h:117
Intercepted
#define RCS_SCOPE(...)
#define FATAL(...)
Definition logging.h:47
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485