// Copyright 2018 the V8 project authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
#ifndef V8_OBJECTS_API_CALLBACKS_INL_H_
|
#define V8_OBJECTS_API_CALLBACKS_INL_H_
|
|
#include "src/objects/api-callbacks.h"
|
|
#include "src/heap/heap-inl.h"
|
#include "src/objects/name.h"
|
#include "src/objects/templates.h"
|
|
// Has to be the last include (doesn't have include guards):
|
#include "src/objects/object-macros.h"
|
|
namespace v8 {
|
namespace internal {
|
|
CAST_ACCESSOR(AccessorInfo)
|
CAST_ACCESSOR(AccessCheckInfo)
|
CAST_ACCESSOR(InterceptorInfo)
|
CAST_ACCESSOR(CallHandlerInfo)
|
|
ACCESSORS(AccessorInfo, name, Name, kNameOffset)
|
SMI_ACCESSORS(AccessorInfo, flags, kFlagsOffset)
|
ACCESSORS(AccessorInfo, expected_receiver_type, Object,
|
kExpectedReceiverTypeOffset)
|
|
ACCESSORS_CHECKED2(AccessorInfo, getter, Object, kGetterOffset, true,
|
Foreign::IsNormalized(value))
|
ACCESSORS_CHECKED2(AccessorInfo, setter, Object, kSetterOffset, true,
|
Foreign::IsNormalized(value));
|
ACCESSORS(AccessorInfo, js_getter, Object, kJsGetterOffset)
|
ACCESSORS(AccessorInfo, data, Object, kDataOffset)
|
|
bool AccessorInfo::has_getter() {
|
bool result = getter() != Smi::kZero;
|
DCHECK_EQ(result,
|
getter() != Smi::kZero &&
|
Foreign::cast(getter())->foreign_address() != kNullAddress);
|
return result;
|
}
|
|
bool AccessorInfo::has_setter() {
|
bool result = setter() != Smi::kZero;
|
DCHECK_EQ(result,
|
setter() != Smi::kZero &&
|
Foreign::cast(setter())->foreign_address() != kNullAddress);
|
return result;
|
}
|
|
BIT_FIELD_ACCESSORS(AccessorInfo, flags, all_can_read,
|
AccessorInfo::AllCanReadBit)
|
BIT_FIELD_ACCESSORS(AccessorInfo, flags, all_can_write,
|
AccessorInfo::AllCanWriteBit)
|
BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_special_data_property,
|
AccessorInfo::IsSpecialDataPropertyBit)
|
BIT_FIELD_ACCESSORS(AccessorInfo, flags, replace_on_access,
|
AccessorInfo::ReplaceOnAccessBit)
|
BIT_FIELD_ACCESSORS(AccessorInfo, flags, is_sloppy, AccessorInfo::IsSloppyBit)
|
BIT_FIELD_ACCESSORS(AccessorInfo, flags, has_no_side_effect,
|
AccessorInfo::HasNoSideEffectBit)
|
BIT_FIELD_ACCESSORS(AccessorInfo, flags, initial_property_attributes,
|
AccessorInfo::InitialAttributesBits)
|
|
bool AccessorInfo::IsCompatibleReceiver(Object* receiver) {
|
if (!HasExpectedReceiverType()) return true;
|
if (!receiver->IsJSObject()) return false;
|
return FunctionTemplateInfo::cast(expected_receiver_type())
|
->IsTemplateFor(JSObject::cast(receiver)->map());
|
}
|
|
bool AccessorInfo::HasExpectedReceiverType() {
|
return expected_receiver_type()->IsFunctionTemplateInfo();
|
}
|
|
ACCESSORS(AccessCheckInfo, callback, Object, kCallbackOffset)
|
ACCESSORS(AccessCheckInfo, named_interceptor, Object, kNamedInterceptorOffset)
|
ACCESSORS(AccessCheckInfo, indexed_interceptor, Object,
|
kIndexedInterceptorOffset)
|
ACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
|
|
ACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
|
ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
|
ACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
|
ACCESSORS(InterceptorInfo, descriptor, Object, kDescriptorOffset)
|
ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
|
ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
|
ACCESSORS(InterceptorInfo, definer, Object, kDefinerOffset)
|
ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
|
SMI_ACCESSORS(InterceptorInfo, flags, kFlagsOffset)
|
BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
|
kCanInterceptSymbolsBit)
|
BOOL_ACCESSORS(InterceptorInfo, flags, all_can_read, kAllCanReadBit)
|
BOOL_ACCESSORS(InterceptorInfo, flags, non_masking, kNonMasking)
|
BOOL_ACCESSORS(InterceptorInfo, flags, is_named, kNamed)
|
BOOL_ACCESSORS(InterceptorInfo, flags, has_no_side_effect, kHasNoSideEffect)
|
|
ACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
|
ACCESSORS(CallHandlerInfo, js_callback, Object, kJsCallbackOffset)
|
ACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
|
|
bool CallHandlerInfo::IsSideEffectFreeCallHandlerInfo() const {
|
ReadOnlyRoots roots = GetReadOnlyRoots();
|
DCHECK(map() == roots.side_effect_call_handler_info_map() ||
|
map() == roots.side_effect_free_call_handler_info_map() ||
|
map() == roots.next_call_side_effect_free_call_handler_info_map());
|
return map() == roots.side_effect_free_call_handler_info_map();
|
}
|
|
bool CallHandlerInfo::IsSideEffectCallHandlerInfo() const {
|
ReadOnlyRoots roots = GetReadOnlyRoots();
|
DCHECK(map() == roots.side_effect_call_handler_info_map() ||
|
map() == roots.side_effect_free_call_handler_info_map() ||
|
map() == roots.next_call_side_effect_free_call_handler_info_map());
|
return map() == roots.side_effect_call_handler_info_map();
|
}
|
|
void CallHandlerInfo::SetNextCallHasNoSideEffect() {
|
set_map(
|
GetReadOnlyRoots().next_call_side_effect_free_call_handler_info_map());
|
}
|
|
bool CallHandlerInfo::NextCallHasNoSideEffect() {
|
ReadOnlyRoots roots = GetReadOnlyRoots();
|
if (map() == roots.next_call_side_effect_free_call_handler_info_map()) {
|
set_map(roots.side_effect_call_handler_info_map());
|
return true;
|
}
|
return false;
|
}
|
|
} // namespace internal
|
} // namespace v8
|
|
#include "src/objects/object-macros-undef.h"
|
|
#endif // V8_OBJECTS_API_CALLBACKS_INL_H_
|