Line data Source code
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 :
8 : #include "src/objects/api-callbacks.h"
9 :
10 : #include "src/heap/heap-write-barrier-inl.h"
11 : #include "src/heap/heap-write-barrier.h"
12 : #include "src/objects/foreign-inl.h"
13 : #include "src/objects/js-objects-inl.h"
14 : #include "src/objects/name.h"
15 : #include "src/objects/templates.h"
16 :
17 : // Has to be the last include (doesn't have include guards):
18 : #include "src/objects/object-macros.h"
19 :
20 : namespace v8 {
21 : namespace internal {
22 :
23 7776 : OBJECT_CONSTRUCTORS_IMPL(AccessCheckInfo, Struct)
24 3674697 : OBJECT_CONSTRUCTORS_IMPL(AccessorInfo, Struct)
25 4307167 : OBJECT_CONSTRUCTORS_IMPL(InterceptorInfo, Struct)
26 11937130 : OBJECT_CONSTRUCTORS_IMPL(CallHandlerInfo, Tuple3)
27 :
28 1903855 : CAST_ACCESSOR(AccessorInfo)
29 3888 : CAST_ACCESSOR(AccessCheckInfo)
30 2153611 : CAST_ACCESSOR(InterceptorInfo)
31 5968565 : CAST_ACCESSOR(CallHandlerInfo)
32 :
33 1342241 : ACCESSORS(AccessorInfo, name, Name, kNameOffset)
34 3407918 : SMI_ACCESSORS(AccessorInfo, flags, kFlagsOffset)
35 983477 : ACCESSORS(AccessorInfo, expected_receiver_type, Object,
36 : kExpectedReceiverTypeOffset)
37 :
38 1845132 : ACCESSORS_CHECKED2(AccessorInfo, getter, Object, kGetterOffset, true,
39 : Foreign::IsNormalized(value))
40 1554114 : ACCESSORS_CHECKED2(AccessorInfo, setter, Object, kSetterOffset, true,
41 : Foreign::IsNormalized(value))
42 459820 : ACCESSORS(AccessorInfo, js_getter, Object, kJsGetterOffset)
43 2664460 : ACCESSORS(AccessorInfo, data, Object, kDataOffset)
44 :
45 : bool AccessorInfo::has_getter() {
46 : bool result = getter() != Smi::kZero;
47 : DCHECK_EQ(result,
48 : getter() != Smi::kZero &&
49 : Foreign::cast(getter())->foreign_address() != kNullAddress);
50 : return result;
51 : }
52 :
53 : bool AccessorInfo::has_setter() {
54 : bool result = setter() != Smi::kZero;
55 : DCHECK_EQ(result,
56 : setter() != Smi::kZero &&
57 : Foreign::cast(setter())->foreign_address() != kNullAddress);
58 : return result;
59 : }
60 :
61 128283 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, all_can_read,
62 : AccessorInfo::AllCanReadBit)
63 127917 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, all_can_write,
64 : AccessorInfo::AllCanWriteBit)
65 1007561 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_special_data_property,
66 : AccessorInfo::IsSpecialDataPropertyBit)
67 2246525 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, replace_on_access,
68 : AccessorInfo::ReplaceOnAccessBit)
69 3159205 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_sloppy, AccessorInfo::IsSloppyBit)
70 373095 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, getter_side_effect_type,
71 : AccessorInfo::GetterSideEffectTypeBits)
72 :
73 41 : SideEffectType AccessorInfo::setter_side_effect_type() const {
74 82 : return SetterSideEffectTypeBits::decode(flags());
75 : }
76 :
77 93582 : void AccessorInfo::set_setter_side_effect_type(SideEffectType value) {
78 : // We do not support describing setters as having no side effect, since
79 : // calling set accessors must go through a store bytecode. Store bytecodes
80 : // support checking receivers for temporary objects, but still expect
81 : // the receiver to be written to.
82 93582 : CHECK_NE(value, SideEffectType::kHasNoSideEffect);
83 186548 : set_flags(SetterSideEffectTypeBits::update(flags(), value));
84 93582 : }
85 :
86 987861 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, initial_property_attributes,
87 : AccessorInfo::InitialAttributesBits)
88 :
89 881274 : bool AccessorInfo::IsCompatibleReceiver(Object receiver) {
90 881274 : if (!HasExpectedReceiverType()) return true;
91 348 : if (!receiver->IsJSObject()) return false;
92 : return FunctionTemplateInfo::cast(expected_receiver_type())
93 348 : ->IsTemplateFor(JSObject::cast(receiver)->map());
94 : }
95 :
96 978656 : bool AccessorInfo::HasExpectedReceiverType() {
97 1957313 : return expected_receiver_type()->IsFunctionTemplateInfo();
98 : }
99 :
100 3221 : ACCESSORS(AccessCheckInfo, callback, Object, kCallbackOffset)
101 1280 : ACCESSORS(AccessCheckInfo, named_interceptor, Object, kNamedInterceptorOffset)
102 1580 : ACCESSORS(AccessCheckInfo, indexed_interceptor, Object,
103 : kIndexedInterceptorOffset)
104 3378 : ACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
105 :
106 866847 : ACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
107 928510 : ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
108 252235 : ACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
109 750 : ACCESSORS(InterceptorInfo, descriptor, Object, kDescriptorOffset)
110 578 : ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
111 1755 : ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
112 720 : ACCESSORS(InterceptorInfo, definer, Object, kDefinerOffset)
113 2594493 : ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
114 1843956 : SMI_ACCESSORS(InterceptorInfo, flags, kFlagsOffset)
115 2422 : BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
116 : kCanInterceptSymbolsBit)
117 3566 : BOOL_ACCESSORS(InterceptorInfo, flags, all_can_read, kAllCanReadBit)
118 1826310 : BOOL_ACCESSORS(InterceptorInfo, flags, non_masking, kNonMasking)
119 2306 : BOOL_ACCESSORS(InterceptorInfo, flags, is_named, kNamed)
120 2378 : BOOL_ACCESSORS(InterceptorInfo, flags, has_no_side_effect, kHasNoSideEffect)
121 :
122 39975028 : ACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
123 34012577 : ACCESSORS(CallHandlerInfo, js_callback, Object, kJsCallbackOffset)
124 36566393 : ACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
125 :
126 144 : bool CallHandlerInfo::IsSideEffectFreeCallHandlerInfo() const {
127 144 : ReadOnlyRoots roots = GetReadOnlyRoots();
128 : DCHECK(map() == roots.side_effect_call_handler_info_map() ||
129 : map() == roots.side_effect_free_call_handler_info_map() ||
130 : map() == roots.next_call_side_effect_free_call_handler_info_map());
131 144 : return map() == roots.side_effect_free_call_handler_info_map();
132 : }
133 :
134 : bool CallHandlerInfo::IsSideEffectCallHandlerInfo() const {
135 : ReadOnlyRoots roots = GetReadOnlyRoots();
136 : DCHECK(map() == roots.side_effect_call_handler_info_map() ||
137 : map() == roots.side_effect_free_call_handler_info_map() ||
138 : map() == roots.next_call_side_effect_free_call_handler_info_map());
139 : return map() == roots.side_effect_call_handler_info_map();
140 : }
141 :
142 10 : void CallHandlerInfo::SetNextCallHasNoSideEffect() {
143 : set_map(
144 20 : GetReadOnlyRoots().next_call_side_effect_free_call_handler_info_map());
145 10 : }
146 :
147 139 : bool CallHandlerInfo::NextCallHasNoSideEffect() {
148 139 : ReadOnlyRoots roots = GetReadOnlyRoots();
149 139 : if (map() == roots.next_call_side_effect_free_call_handler_info_map()) {
150 10 : set_map(roots.side_effect_call_handler_info_map());
151 10 : return true;
152 : }
153 : return false;
154 : }
155 :
156 : } // namespace internal
157 : } // namespace v8
158 :
159 : #include "src/objects/object-macros-undef.h"
160 :
161 : #endif // V8_OBJECTS_API_CALLBACKS_INL_H_
|