blob: f36c50f49396932521b1126792e734c5637ad304 [file]
// Copyright 2017 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_PROPERTY_DESCRIPTOR_OBJECT_H_
#define V8_OBJECTS_PROPERTY_DESCRIPTOR_OBJECT_H_
#include "src/base/bit-field.h"
#include "src/objects/struct.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
namespace v8 {
namespace internal {
V8_OBJECT class PropertyDescriptorObject : public Struct {
public:
using IsEnumerableBit = base::BitField<bool, 0, 1, uint32_t>;
using HasEnumerableBit = IsEnumerableBit::Next<bool, 1>;
using IsConfigurableBit = HasEnumerableBit::Next<bool, 1>;
using HasConfigurableBit = IsConfigurableBit::Next<bool, 1>;
using IsWritableBit = HasConfigurableBit::Next<bool, 1>;
using HasWritableBit = IsWritableBit::Next<bool, 1>;
using HasValueBit = HasWritableBit::Next<bool, 1>;
using HasGetBit = HasValueBit::Next<bool, 1>;
using HasSetBit = HasGetBit::Next<bool, 1>;
enum Flag : uint32_t {
kNone = 0,
kIsEnumerable = IsEnumerableBit::kMask,
kHasEnumerable = HasEnumerableBit::kMask,
kIsConfigurable = IsConfigurableBit::kMask,
kHasConfigurable = HasConfigurableBit::kMask,
kIsWritable = IsWritableBit::kMask,
kHasWritable = HasWritableBit::kMask,
kHasValue = HasValueBit::kMask,
kHasGet = HasGetBit::kMask,
kHasSet = HasSetBit::kMask,
};
using Flags = base::Flags<Flag>;
static constexpr int kFlagCount = 9;
static const int kRegularAccessorPropertyBits =
HasEnumerableBit::kMask | HasConfigurableBit::kMask | HasGetBit::kMask |
HasSetBit::kMask;
static const int kRegularDataPropertyBits =
HasEnumerableBit::kMask | HasConfigurableBit::kMask |
HasWritableBit::kMask | HasValueBit::kMask;
static const int kHasMask = HasEnumerableBit::kMask |
HasConfigurableBit::kMask |
HasWritableBit::kMask | HasValueBit::kMask |
HasGetBit::kMask | HasSetBit::kMask;
inline int flags() const;
inline void set_flags(int value);
inline Tagged<Object> value() const;
inline void set_value(Tagged<Object> value,
WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
inline Tagged<Object> get() const;
inline void set_get(Tagged<Object> value,
WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
inline Tagged<Object> set() const;
inline void set_set(Tagged<Object> value,
WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
using BodyDescriptor = StructBodyDescriptor;
DECL_PRINTER(PropertyDescriptorObject)
DECL_VERIFIER(PropertyDescriptorObject)
private:
friend class Factory;
friend class TorqueGeneratedPropertyDescriptorObjectAsserts;
friend class CodeStubAssembler;
friend class ObjectBuiltinsAssembler;
friend class MacroAssembler;
TaggedMember<Smi> flags_;
TaggedMember<Object> value_;
TaggedMember<Object> get_;
TaggedMember<Object> set_;
} V8_OBJECT_END;
} // namespace internal
} // namespace v8
#include "src/objects/object-macros-undef.h"
#endif // V8_OBJECTS_PROPERTY_DESCRIPTOR_OBJECT_H_