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-inl.h"
11 : #include "src/heap/heap-write-barrier.h"
12 : #include "src/objects/foreign-inl.h"
13 : #include "src/objects/name.h"
14 : #include "src/objects/templates.h"
15 :
16 : // Has to be the last include (doesn't have include guards):
17 : #include "src/objects/object-macros.h"
18 :
19 : namespace v8 {
20 : namespace internal {
21 :
22 7812 : OBJECT_CONSTRUCTORS_IMPL(AccessCheckInfo, Struct)
23 3830260 : OBJECT_CONSTRUCTORS_IMPL(AccessorInfo, Struct)
24 4322924 : OBJECT_CONSTRUCTORS_IMPL(InterceptorInfo, Struct)
25 12275198 : OBJECT_CONSTRUCTORS_IMPL(CallHandlerInfo, Tuple3)
26 :
27 1915130 : CAST_ACCESSOR(AccessorInfo)
28 3906 : CAST_ACCESSOR(AccessCheckInfo)
29 2161462 : CAST_ACCESSOR(InterceptorInfo)
30 6137602 : CAST_ACCESSOR(CallHandlerInfo)
31 :
32 1329734 : ACCESSORS(AccessorInfo, name, Name, kNameOffset)
33 5960976 : SMI_ACCESSORS(AccessorInfo, flags, kFlagsOffset)
34 2973786 : ACCESSORS(AccessorInfo, expected_receiver_type, Object,
35 : kExpectedReceiverTypeOffset)
36 :
37 4644556 : ACCESSORS_CHECKED2(AccessorInfo, getter, Object, kGetterOffset, true,
38 : Foreign::IsNormalized(value))
39 3747679 : ACCESSORS_CHECKED2(AccessorInfo, setter, Object, kSetterOffset, true,
40 : Foreign::IsNormalized(value));
41 455335 : ACCESSORS(AccessorInfo, js_getter, Object, kJsGetterOffset)
42 4470732 : ACCESSORS(AccessorInfo, data, Object, kDataOffset)
43 :
44 : bool AccessorInfo::has_getter() {
45 1282404 : bool result = getter() != Smi::kZero;
46 : DCHECK_EQ(result,
47 : getter() != Smi::kZero &&
48 : Foreign::cast(getter())->foreign_address() != kNullAddress);
49 : return result;
50 : }
51 :
52 : bool AccessorInfo::has_setter() {
53 495464 : bool result = setter() != Smi::kZero;
54 : DCHECK_EQ(result,
55 : setter() != Smi::kZero &&
56 : Foreign::cast(setter())->foreign_address() != kNullAddress);
57 : return result;
58 : }
59 :
60 128283 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, all_can_read,
61 : AccessorInfo::AllCanReadBit)
62 127917 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, all_can_write,
63 : AccessorInfo::AllCanWriteBit)
64 1004126 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_special_data_property,
65 : AccessorInfo::IsSpecialDataPropertyBit)
66 2266427 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, replace_on_access,
67 : AccessorInfo::ReplaceOnAccessBit)
68 3178990 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_sloppy, AccessorInfo::IsSloppyBit)
69 371355 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, getter_side_effect_type,
70 : AccessorInfo::GetterSideEffectTypeBits)
71 :
72 41 : SideEffectType AccessorInfo::setter_side_effect_type() const {
73 82 : return SetterSideEffectTypeBits::decode(flags());
74 : }
75 :
76 92685 : void AccessorInfo::set_setter_side_effect_type(SideEffectType value) {
77 : // We do not support describing setters as having no side effect, since
78 : // calling set accessors must go through a store bytecode. Store bytecodes
79 : // support checking receivers for temporary objects, but still expect
80 : // the receiver to be written to.
81 92685 : CHECK_NE(value, SideEffectType::kHasNoSideEffect);
82 185370 : set_flags(SetterSideEffectTypeBits::update(flags(), value));
83 92685 : }
84 :
85 974460 : BIT_FIELD_ACCESSORS(AccessorInfo, flags, initial_property_attributes,
86 : AccessorInfo::InitialAttributesBits)
87 :
88 889114 : bool AccessorInfo::IsCompatibleReceiver(Object receiver) {
89 889114 : if (!HasExpectedReceiverType()) return true;
90 348 : if (!receiver->IsJSObject()) return false;
91 348 : return FunctionTemplateInfo::cast(expected_receiver_type())
92 348 : ->IsTemplateFor(JSObject::cast(receiver)->map());
93 : }
94 :
95 986490 : bool AccessorInfo::HasExpectedReceiverType() {
96 1972980 : return expected_receiver_type()->IsFunctionTemplateInfo();
97 : }
98 :
99 8091 : ACCESSORS(AccessCheckInfo, callback, Object, kCallbackOffset)
100 2250 : ACCESSORS(AccessCheckInfo, named_interceptor, Object, kNamedInterceptorOffset)
101 3150 : ACCESSORS(AccessCheckInfo, indexed_interceptor, Object,
102 : kIndexedInterceptorOffset)
103 8562 : ACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
104 :
105 2601627 : ACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
106 2781563 : ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
107 754774 : ACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
108 1950 : ACCESSORS(InterceptorInfo, descriptor, Object, kDescriptorOffset)
109 894 : ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
110 3655 : ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
111 1260 : ACCESSORS(InterceptorInfo, definer, Object, kDefinerOffset)
112 3708883 : ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
113 1852836 : SMI_ACCESSORS(InterceptorInfo, flags, kFlagsOffset)
114 2538 : BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
115 : kCanInterceptSymbolsBit)
116 3682 : BOOL_ACCESSORS(InterceptorInfo, flags, all_can_read, kAllCanReadBit)
117 1834378 : BOOL_ACCESSORS(InterceptorInfo, flags, non_masking, kNonMasking)
118 2422 : BOOL_ACCESSORS(InterceptorInfo, flags, is_named, kNamed)
119 2494 : BOOL_ACCESSORS(InterceptorInfo, flags, has_no_side_effect, kHasNoSideEffect)
120 :
121 54552881 : ACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
122 36184614 : ACCESSORS(CallHandlerInfo, js_callback, Object, kJsCallbackOffset)
123 43639934 : ACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
124 :
125 144 : bool CallHandlerInfo::IsSideEffectFreeCallHandlerInfo() const {
126 144 : ReadOnlyRoots roots = GetReadOnlyRoots();
127 : DCHECK(map() == roots.side_effect_call_handler_info_map() ||
128 : map() == roots.side_effect_free_call_handler_info_map() ||
129 : map() == roots.next_call_side_effect_free_call_handler_info_map());
130 144 : return map() == roots.side_effect_free_call_handler_info_map();
131 : }
132 :
133 : bool CallHandlerInfo::IsSideEffectCallHandlerInfo() const {
134 : ReadOnlyRoots roots = GetReadOnlyRoots();
135 : DCHECK(map() == roots.side_effect_call_handler_info_map() ||
136 : map() == roots.side_effect_free_call_handler_info_map() ||
137 : map() == roots.next_call_side_effect_free_call_handler_info_map());
138 : return map() == roots.side_effect_call_handler_info_map();
139 : }
140 :
141 10 : void CallHandlerInfo::SetNextCallHasNoSideEffect() {
142 : set_map(
143 20 : GetReadOnlyRoots().next_call_side_effect_free_call_handler_info_map());
144 10 : }
145 :
146 139 : bool CallHandlerInfo::NextCallHasNoSideEffect() {
147 139 : ReadOnlyRoots roots = GetReadOnlyRoots();
148 139 : if (map() == roots.next_call_side_effect_free_call_handler_info_map()) {
149 10 : set_map(roots.side_effect_call_handler_info_map());
150 10 : return true;
151 : }
152 : return false;
153 : }
154 :
155 : } // namespace internal
156 : } // namespace v8
157 :
158 : #include "src/objects/object-macros-undef.h"
159 :
160 : #endif // V8_OBJECTS_API_CALLBACKS_INL_H_
|