• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/objects/name.h"
12 #include "src/objects/templates.h"
13 
14 // Has to be the last include (doesn't have include guards):
15 #include "src/objects/object-macros.h"
16 
17 namespace v8 {
18 namespace internal {
19 
20 CAST_ACCESSOR(AccessorInfo)
21 CAST_ACCESSOR(AccessCheckInfo)
22 CAST_ACCESSOR(InterceptorInfo)
23 CAST_ACCESSOR(CallHandlerInfo)
24 
25 ACCESSORS(AccessorInfo, name, Name, kNameOffset)
26 SMI_ACCESSORS(AccessorInfo, flags, kFlagsOffset)
27 ACCESSORS(AccessorInfo, expected_receiver_type, Object,
28           kExpectedReceiverTypeOffset)
29 
30 ACCESSORS_CHECKED2(AccessorInfo, getter, Object, kGetterOffset, true,
31                    Foreign::IsNormalized(value))
32 ACCESSORS_CHECKED2(AccessorInfo, setter, Object, kSetterOffset, true,
33                    Foreign::IsNormalized(value));
ACCESSORS(AccessorInfo,js_getter,Object,kJsGetterOffset)34 ACCESSORS(AccessorInfo, js_getter, Object, kJsGetterOffset)
35 ACCESSORS(AccessorInfo, data, Object, kDataOffset)
36 
37 bool AccessorInfo::has_getter() {
38   bool result = getter() != Smi::kZero;
39   DCHECK_EQ(result,
40             getter() != Smi::kZero &&
41                 Foreign::cast(getter())->foreign_address() != kNullAddress);
42   return result;
43 }
44 
has_setter()45 bool AccessorInfo::has_setter() {
46   bool result = setter() != Smi::kZero;
47   DCHECK_EQ(result,
48             setter() != Smi::kZero &&
49                 Foreign::cast(setter())->foreign_address() != kNullAddress);
50   return result;
51 }
52 
BIT_FIELD_ACCESSORS(AccessorInfo,flags,all_can_read,AccessorInfo::AllCanReadBit)53 BIT_FIELD_ACCESSORS(AccessorInfo, flags, all_can_read,
54                     AccessorInfo::AllCanReadBit)
55 BIT_FIELD_ACCESSORS(AccessorInfo, flags, all_can_write,
56                     AccessorInfo::AllCanWriteBit)
57 BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_special_data_property,
58                     AccessorInfo::IsSpecialDataPropertyBit)
59 BIT_FIELD_ACCESSORS(AccessorInfo, flags, replace_on_access,
60                     AccessorInfo::ReplaceOnAccessBit)
61 BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_sloppy, AccessorInfo::IsSloppyBit)
62 BIT_FIELD_ACCESSORS(AccessorInfo, flags, has_no_side_effect,
63                     AccessorInfo::HasNoSideEffectBit)
64 BIT_FIELD_ACCESSORS(AccessorInfo, flags, initial_property_attributes,
65                     AccessorInfo::InitialAttributesBits)
66 
67 bool AccessorInfo::IsCompatibleReceiver(Object* receiver) {
68   if (!HasExpectedReceiverType()) return true;
69   if (!receiver->IsJSObject()) return false;
70   return FunctionTemplateInfo::cast(expected_receiver_type())
71       ->IsTemplateFor(JSObject::cast(receiver)->map());
72 }
73 
HasExpectedReceiverType()74 bool AccessorInfo::HasExpectedReceiverType() {
75   return expected_receiver_type()->IsFunctionTemplateInfo();
76 }
77 
ACCESSORS(AccessCheckInfo,callback,Object,kCallbackOffset)78 ACCESSORS(AccessCheckInfo, callback, Object, kCallbackOffset)
79 ACCESSORS(AccessCheckInfo, named_interceptor, Object, kNamedInterceptorOffset)
80 ACCESSORS(AccessCheckInfo, indexed_interceptor, Object,
81           kIndexedInterceptorOffset)
82 ACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
83 
84 ACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
85 ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
86 ACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
87 ACCESSORS(InterceptorInfo, descriptor, Object, kDescriptorOffset)
88 ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
89 ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
90 ACCESSORS(InterceptorInfo, definer, Object, kDefinerOffset)
91 ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
92 SMI_ACCESSORS(InterceptorInfo, flags, kFlagsOffset)
93 BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
94                kCanInterceptSymbolsBit)
95 BOOL_ACCESSORS(InterceptorInfo, flags, all_can_read, kAllCanReadBit)
96 BOOL_ACCESSORS(InterceptorInfo, flags, non_masking, kNonMasking)
97 BOOL_ACCESSORS(InterceptorInfo, flags, is_named, kNamed)
98 BOOL_ACCESSORS(InterceptorInfo, flags, has_no_side_effect, kHasNoSideEffect)
99 
100 ACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
101 ACCESSORS(CallHandlerInfo, js_callback, Object, kJsCallbackOffset)
102 ACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
103 
104 bool CallHandlerInfo::IsSideEffectFreeCallHandlerInfo() const {
105   ReadOnlyRoots roots = GetReadOnlyRoots();
106   DCHECK(map() == roots.side_effect_call_handler_info_map() ||
107          map() == roots.side_effect_free_call_handler_info_map() ||
108          map() == roots.next_call_side_effect_free_call_handler_info_map());
109   return map() == roots.side_effect_free_call_handler_info_map();
110 }
111 
IsSideEffectCallHandlerInfo()112 bool CallHandlerInfo::IsSideEffectCallHandlerInfo() const {
113   ReadOnlyRoots roots = GetReadOnlyRoots();
114   DCHECK(map() == roots.side_effect_call_handler_info_map() ||
115          map() == roots.side_effect_free_call_handler_info_map() ||
116          map() == roots.next_call_side_effect_free_call_handler_info_map());
117   return map() == roots.side_effect_call_handler_info_map();
118 }
119 
SetNextCallHasNoSideEffect()120 void CallHandlerInfo::SetNextCallHasNoSideEffect() {
121   set_map(
122       GetReadOnlyRoots().next_call_side_effect_free_call_handler_info_map());
123 }
124 
NextCallHasNoSideEffect()125 bool CallHandlerInfo::NextCallHasNoSideEffect() {
126   ReadOnlyRoots roots = GetReadOnlyRoots();
127   if (map() == roots.next_call_side_effect_free_call_handler_info_map()) {
128     set_map(roots.side_effect_call_handler_info_map());
129     return true;
130   }
131   return false;
132 }
133 
134 }  // namespace internal
135 }  // namespace v8
136 
137 #include "src/objects/object-macros-undef.h"
138 
139 #endif  // V8_OBJECTS_API_CALLBACKS_INL_H_
140