blob: 719c697bf842f0e49d885f113ac0fb9d5d67dc8f [file] [log] [blame]
// 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-write-barrier-inl.h"
#include "src/heap/heap-write-barrier.h"
#include "src/objects/foreign-inl.h"
#include "src/objects/js-objects-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 {
#include "torque-generated/src/objects/api-callbacks-tq-inl.inc"
TQ_OBJECT_CONSTRUCTORS_IMPL(AccessCheckInfo)
TQ_OBJECT_CONSTRUCTORS_IMPL(AccessorInfo)
TQ_OBJECT_CONSTRUCTORS_IMPL(InterceptorInfo)
EXTERNAL_POINTER_ACCESSORS_MAYBE_READ_ONLY_HOST(AccessorInfo,
maybe_redirected_getter,
Address,
kMaybeRedirectedGetterOffset,
kAccessorInfoGetterTag)
EXTERNAL_POINTER_ACCESSORS_MAYBE_READ_ONLY_HOST(AccessorInfo, setter, Address,
kSetterOffset,
kAccessorInfoSetterTag)
Address AccessorInfo::getter(i::IsolateForSandbox isolate) const {
Address result = maybe_redirected_getter(isolate);
if (!USE_SIMULATOR_BOOL) return result;
if (result == kNullAddress) return kNullAddress;
return ExternalReference::UnwrapRedirection(result);
}
void AccessorInfo::init_getter(i::IsolateForSandbox isolate,
Address initial_value) {
init_maybe_redirected_getter(isolate, initial_value);
if (USE_SIMULATOR_BOOL) {
init_getter_redirection(isolate);
}
}
void AccessorInfo::set_getter(i::IsolateForSandbox isolate, Address value) {
set_maybe_redirected_getter(isolate, value);
if (USE_SIMULATOR_BOOL) {
init_getter_redirection(isolate);
}
}
void AccessorInfo::init_getter_redirection(i::IsolateForSandbox isolate) {
CHECK(USE_SIMULATOR_BOOL);
Address value = maybe_redirected_getter(isolate);
if (value == kNullAddress) return;
value =
ExternalReference::Redirect(value, ExternalReference::DIRECT_GETTER_CALL);
set_maybe_redirected_getter(isolate, value);
}
void AccessorInfo::remove_getter_redirection(i::IsolateForSandbox isolate) {
CHECK(USE_SIMULATOR_BOOL);
Address value = getter(isolate);
set_maybe_redirected_getter(isolate, value);
}
bool AccessorInfo::has_getter(Isolate* isolate) {
return maybe_redirected_getter(isolate) != kNullAddress;
}
bool AccessorInfo::has_setter(Isolate* isolate) {
return setter(isolate) != kNullAddress;
}
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, getter_side_effect_type,
AccessorInfo::GetterSideEffectTypeBits)
SideEffectType AccessorInfo::setter_side_effect_type() const {
return SetterSideEffectTypeBits::decode(flags());
}
void AccessorInfo::set_setter_side_effect_type(SideEffectType value) {
// We do not support describing setters as having no side effect, since
// calling set accessors must go through a store bytecode. Store bytecodes
// support checking receivers for temporary objects, but still expect
// the receiver to be written to.
CHECK_NE(value, SideEffectType::kHasNoSideEffect);
set_flags(SetterSideEffectTypeBits::update(flags(), value));
}
BIT_FIELD_ACCESSORS(AccessorInfo, flags, initial_property_attributes,
AccessorInfo::InitialAttributesBits)
void AccessorInfo::clear_padding() {
if (FIELD_SIZE(kOptionalPaddingOffset) == 0) return;
memset(reinterpret_cast<void*>(address() + kOptionalPaddingOffset), 0,
FIELD_SIZE(kOptionalPaddingOffset));
}
BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
CanInterceptSymbolsBit::kShift)
BOOL_ACCESSORS(InterceptorInfo, flags, non_masking, NonMaskingBit::kShift)
BOOL_ACCESSORS(InterceptorInfo, flags, is_named, NamedBit::kShift)
BOOL_ACCESSORS(InterceptorInfo, flags, has_no_side_effect,
HasNoSideEffectBit::kShift)
BOOL_ACCESSORS(InterceptorInfo, flags, has_new_callbacks_signature,
HasNewCallbacksSignatureBit::kShift)
} // namespace internal
} // namespace v8
#include "src/objects/object-macros-undef.h"
#endif // V8_OBJECTS_API_CALLBACKS_INL_H_