v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
accessors.h
Go to the documentation of this file.
1// Copyright 2012 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_BUILTINS_ACCESSORS_H_
6#define V8_BUILTINS_ACCESSORS_H_
7
10#include "src/common/globals.h"
13
14namespace v8 {
15namespace internal {
16
17// Forward declarations.
18class AccessorInfo;
19class FieldIndex;
20class JavaScriptFrame;
21
22// The list of accessor descriptors. This is a second-order macro
23// taking a macro to be applied to all accessor descriptor names.
24// V(accessor_name, AccessorName, GetterSideEffectType, SetterSideEffectType)
25#define ACCESSOR_INFO_LIST_GENERATOR(V, _) \
26 V(_, arguments_iterator, ArgumentsIterator, kHasNoSideEffect, \
27 kHasSideEffectToReceiver) \
28 V(_, array_length, ArrayLength, kHasNoSideEffect, kHasSideEffectToReceiver) \
29 V(_, bound_function_length, BoundFunctionLength, kHasNoSideEffect, \
30 kHasSideEffectToReceiver) \
31 V(_, bound_function_name, BoundFunctionName, kHasNoSideEffect, \
32 kHasSideEffectToReceiver) \
33 V(_, function_arguments, FunctionArguments, kHasNoSideEffect, \
34 kHasSideEffectToReceiver) \
35 V(_, function_caller, FunctionCaller, kHasNoSideEffect, \
36 kHasSideEffectToReceiver) \
37 V(_, function_name, FunctionName, kHasNoSideEffect, \
38 kHasSideEffectToReceiver) \
39 V(_, function_length, FunctionLength, kHasNoSideEffect, \
40 kHasSideEffectToReceiver) \
41 V(_, function_prototype, FunctionPrototype, kHasNoSideEffect, \
42 kHasSideEffectToReceiver) \
43 V(_, string_length, StringLength, kHasNoSideEffect, \
44 kHasSideEffectToReceiver) \
45 V(_, value_unavailable, ValueUnavailable, kHasNoSideEffect, \
46 kHasSideEffectToReceiver) \
47 V(_, wrapped_function_length, WrappedFunctionLength, kHasNoSideEffect, \
48 kHasSideEffectToReceiver) \
49 V(_, wrapped_function_name, WrappedFunctionName, kHasNoSideEffect, \
50 kHasSideEffectToReceiver)
51
52#define ACCESSOR_GETTER_LIST(V) V(ModuleNamespaceEntryGetter)
53
54#define ACCESSOR_SETTER_LIST(V) \
55 V(ArrayLengthSetter) \
56 V(FunctionPrototypeSetter) \
57 V(ModuleNamespaceEntrySetter) \
58 V(ReconfigureToDataProperty)
59
60#define ACCESSOR_CALLBACK_LIST_GENERATOR(V, _) \
61 V(_, ErrorStackGetter, kHasSideEffect) \
62 V(_, ErrorStackSetter, kHasSideEffectToReceiver)
63
64// Accessors contains all predefined proxy accessors.
65
66class Accessors : public AllStatic {
67 public:
68#define ACCESSOR_GETTER_DECLARATION(_, accessor_name, AccessorName, ...) \
69 static void AccessorName##Getter( \
70 v8::Local<v8::Name> name, \
71 const v8::PropertyCallbackInfo<v8::Value>& info);
73#undef ACCESSOR_GETTER_DECLARATION
74
75#define ACCESSOR_GETTER_DECLARATION(AccessorName) \
76 static void AccessorName(v8::Local<v8::Name> name, \
77 const v8::PropertyCallbackInfo<v8::Value>& info);
79#undef ACCESSOR_GETTER_DECLARATION
80
81#define ACCESSOR_SETTER_DECLARATION(AccessorName) \
82 static void AccessorName(v8::Local<v8::Name> name, \
83 v8::Local<v8::Value> value, \
84 const v8::PropertyCallbackInfo<v8::Boolean>& info);
86#undef ACCESSOR_SETTER_DECLARATION
87
88#define ACCESSOR_CALLBACK_DECLARATION(_, AccessorName, ...) \
89 static void AccessorName(const v8::FunctionCallbackInfo<v8::Value>& info);
91 /* not used */)
92#undef ACCESSOR_CALLBACK_DECLARATION
93
94#define COUNT_ACCESSOR(...) +1
95 static constexpr int kAccessorInfoCount =
97
98 static constexpr int kAccessorGetterCount =
100
101 static constexpr int kAccessorSetterCount =
103
104 static constexpr int kAccessorCallbackCount =
106#undef COUNT_ACCESSOR
107
109 Isolate* isolate, DirectHandle<String> name);
110
111 // Accessor function called directly from the runtime system. Returns the
112 // newly materialized arguments object for the given {frame}. Note that for
113 // optimized frames it is possible to specify an {inlined_jsframe_index}.
115 int inlined_jsframe_index);
116
117 // Returns true for properties that are accessors to object fields.
118 // If true, the matching FieldIndex is returned through |field_index|.
119 static bool IsJSObjectFieldAccessor(Isolate* isolate, DirectHandle<Map> map,
121 FieldIndex* field_index);
122
127
128 // Create an AccessorInfo. The setter is optional (can be nullptr).
129 //
130 // Note that the type of setter is AccessorNameBooleanSetterCallback instead
131 // of v8::AccessorNameSetterCallback. The difference is that the former can
132 // set a (boolean) return value. The setter should roughly follow the same
133 // conventions as many of the internal methods in objects.cc:
134 // - The return value is unset iff there was an exception.
135 // - If the ShouldThrow argument is true, the return value must not be false.
139
141 Isolate* isolate, DirectHandle<Name> name,
144
145 private:
146#define ACCESSOR_INFO_DECLARATION(_, accessor_name, AccessorName, ...) \
147 static DirectHandle<AccessorInfo> Make##AccessorName##Info(Isolate* isolate);
149#undef ACCESSOR_INFO_DECLARATION
150
151 friend class Heap;
152};
153
154} // namespace internal
155} // namespace v8
156
157#endif // V8_BUILTINS_ACCESSORS_H_
#define ACCESSOR_GETTER_DECLARATION(_, accessor_name, AccessorName,...)
Definition accessors.h:68
#define ACCESSOR_CALLBACK_LIST_GENERATOR(V, _)
Definition accessors.h:60
#define ACCESSOR_SETTER_LIST(V)
Definition accessors.h:54
#define ACCESSOR_GETTER_LIST(V)
Definition accessors.h:52
#define ACCESSOR_SETTER_DECLARATION(AccessorName)
Definition accessors.h:81
#define COUNT_ACCESSOR(...)
#define ACCESSOR_INFO_DECLARATION(_, accessor_name, AccessorName,...)
Definition accessors.h:146
#define ACCESSOR_INFO_LIST_GENERATOR(V, _)
Definition accessors.h:25
#define ACCESSOR_CALLBACK_DECLARATION(_, AccessorName,...)
Definition accessors.h:88
PropertyT * getter
static MaybeDirectHandle< Object > ReplaceAccessorWithDataProperty(Isolate *isolate, DirectHandle< JSAny > receiver, DirectHandle< JSObject > holder, DirectHandle< Name > name, DirectHandle< Object > value)
Definition accessors.cc:88
static constexpr int kAccessorSetterCount
Definition accessors.h:101
ACCESSOR_CALLBACK_LIST_GENERATOR(ACCESSOR_CALLBACK_DECLARATION,) static const expr int kAccessorInfoCount
static constexpr int kAccessorCallbackCount
Definition accessors.h:104
static DirectHandle< AccessorInfo > MakeModuleNamespaceEntryInfo(Isolate *isolate, DirectHandle< String > name)
Definition accessors.cc:274
static V8_EXPORT_PRIVATE DirectHandle< AccessorInfo > MakeAccessor(Isolate *isolate, DirectHandle< Name > name, AccessorNameGetterCallback getter, AccessorNameBooleanSetterCallback setter)
Definition accessors.cc:29
static constexpr int kAccessorGetterCount
Definition accessors.h:98
static bool IsJSObjectFieldAccessor(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, FieldIndex *field_index)
Definition accessors.cc:64
static Handle< JSObject > FunctionGetArguments(JavaScriptFrame *frame, int inlined_jsframe_index)
Definition accessors.cc:520
void(*)(Local< v8::Name > property, Local< v8::Value > value, const PropertyCallbackInfo< v8::Boolean > &info) AccessorNameBooleanSetterCallback
Definition accessors.h:136
Handle< SharedFunctionInfo > info
TNode< Object > receiver
const std::string property
return value
Definition map-inl.h:893
void(*)(Local< Name > property, const PropertyCallbackInfo< Value > &info) AccessorNameGetterCallback
Definition v8-object.h:155
#define V8_EXPORT_PRIVATE
Definition macros.h:460