current commit
261004.7 · deps: update V8 to 15.2.124.38
// 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_