14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_PROPERTY_ATTRIBUTES_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_PROPERTY_ATTRIBUTES_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h"
204514f5e3Sopenharmony_ci
214514f5e3Sopenharmony_ci#include "libpandabase/utils/bit_field.h"
224514f5e3Sopenharmony_ci
234514f5e3Sopenharmony_cinamespace panda::ecmascript {
244514f5e3Sopenharmony_ciclass PropertyDescriptor;
254514f5e3Sopenharmony_ci
264514f5e3Sopenharmony_cienum class Representation {
274514f5e3Sopenharmony_ci    NONE,
284514f5e3Sopenharmony_ci    INT,
294514f5e3Sopenharmony_ci    DOUBLE,
304514f5e3Sopenharmony_ci    TAGGED,
314514f5e3Sopenharmony_ci};
324514f5e3Sopenharmony_ci
334514f5e3Sopenharmony_cienum class TrackType : uint8_t {
344514f5e3Sopenharmony_ci    NONE = 0x0ULL,
354514f5e3Sopenharmony_ci    INT = 0x1ULL,
364514f5e3Sopenharmony_ci    DOUBLE = 0x1ULL << 1,
374514f5e3Sopenharmony_ci    NUMBER = INT | DOUBLE,
384514f5e3Sopenharmony_ci    TAGGED = 0x1ULL << 2
394514f5e3Sopenharmony_ci};
404514f5e3Sopenharmony_cienum class SharedFieldType {
414514f5e3Sopenharmony_ci    NONE = 0,
424514f5e3Sopenharmony_ci    NUMBER = (1 << 0),
434514f5e3Sopenharmony_ci    STRING = (1 << 1),
444514f5e3Sopenharmony_ci    BOOLEAN = (1 << 2),
454514f5e3Sopenharmony_ci    SENDABLE = (1 << 3),
464514f5e3Sopenharmony_ci    BIG_INT = (1 << 4),
474514f5e3Sopenharmony_ci    GENERIC = (1 << 5),
484514f5e3Sopenharmony_ci    NULL_TYPE = (1 << 6),
494514f5e3Sopenharmony_ci    UNDEFINED = (1 << 7),
504514f5e3Sopenharmony_ci};
514514f5e3Sopenharmony_ci
524514f5e3Sopenharmony_cienum class PropertyBoxType {
534514f5e3Sopenharmony_ci    // Meaningful when a property cell does not contain the hole.
544514f5e3Sopenharmony_ci    UNDEFINED,     // The PREMONOMORPHIC of property cells.
554514f5e3Sopenharmony_ci    CONSTANT,      // Cell has been assigned only once.
564514f5e3Sopenharmony_ci    CONSTANTTYPE,  // Cell has been assigned only one type.
574514f5e3Sopenharmony_ci    MUTABLE,       // Cell will no longer be tracked as constant.
584514f5e3Sopenharmony_ci
594514f5e3Sopenharmony_ci    // Meaningful when a property cell contains the hole.
604514f5e3Sopenharmony_ci    UNINITIALIZED = UNDEFINED,  // Cell has never been initialized.
614514f5e3Sopenharmony_ci    INVALIDATED = CONSTANT,     // Cell has been deleted, invalidated or never existed.
624514f5e3Sopenharmony_ci};
634514f5e3Sopenharmony_ci
644514f5e3Sopenharmony_ci/**
654514f5e3Sopenharmony_ci * [bitfield]
664514f5e3Sopenharmony_ci *  Common | WritableField (bit 1)
674514f5e3Sopenharmony_ci *         | EnumerableField (bit 2)
684514f5e3Sopenharmony_ci *         | ConfigurableField (bit 3)
694514f5e3Sopenharmony_ci *         | IsAccessorField (bit 4)
704514f5e3Sopenharmony_ci *         | IsInlinedPropsField(bit 5)
714514f5e3Sopenharmony_ci *         | RepresentationField(bit 6...7)
724514f5e3Sopenharmony_ci *         --------------------------------
734514f5e3Sopenharmony_ci *    Fast | OffsetField(bit 8...17)
744514f5e3Sopenharmony_ci *         | TrackTypeField(bit 18...20)
754514f5e3Sopenharmony_ci *         | SharedFieldTypeField(bit 21...28)
764514f5e3Sopenharmony_ci *         | SortedIndexField(bit 29...38)
774514f5e3Sopenharmony_ci *         | IsConstPropsField(bit 39)
784514f5e3Sopenharmony_ci *         | IsNotHoleField(bit 40)
794514f5e3Sopenharmony_ci *         -----------------------------
804514f5e3Sopenharmony_ci *    Slow | PropertyBoxTypeField(bit 8...9)
814514f5e3Sopenharmony_ci *         | DictionaryOrderField(bit 10...29)
824514f5e3Sopenharmony_ci *         | SharedFieldTypeField(bit 30...37)
834514f5e3Sopenharmony_ci */
844514f5e3Sopenharmony_ciclass PropertyAttributes {
854514f5e3Sopenharmony_cipublic:
864514f5e3Sopenharmony_ci    PropertyAttributes() = default;
874514f5e3Sopenharmony_ci    ~PropertyAttributes() = default;
884514f5e3Sopenharmony_ci
894514f5e3Sopenharmony_ci    DEFAULT_NOEXCEPT_MOVE_SEMANTIC(PropertyAttributes);
904514f5e3Sopenharmony_ci    DEFAULT_COPY_SEMANTIC(PropertyAttributes);
914514f5e3Sopenharmony_ci
924514f5e3Sopenharmony_ci    explicit PropertyAttributes(uint64_t v) : value_(v) {}
934514f5e3Sopenharmony_ci    explicit PropertyAttributes(JSTaggedValue v) : value_(JSTaggedValue::UnwrapToUint64(v)) {}
944514f5e3Sopenharmony_ci    explicit PropertyAttributes(const PropertyDescriptor &desc);
954514f5e3Sopenharmony_ci
964514f5e3Sopenharmony_ci    static constexpr uint32_t DICTIONARY_ORDER_NUM = 20;
974514f5e3Sopenharmony_ci    static constexpr uint32_t OFFSET_BITFIELD_NUM = 10;
984514f5e3Sopenharmony_ci    static constexpr uint32_t REPRESENTATION_NUM = 2;
994514f5e3Sopenharmony_ci    static constexpr uint32_t TRACK_TYPE_NUM = 3;
1004514f5e3Sopenharmony_ci    static constexpr uint32_t FIELD_TYPE_NUM = 8;
1014514f5e3Sopenharmony_ci    static constexpr uint32_t MAX_FAST_PROPS_CAPACITY = (1U << OFFSET_BITFIELD_NUM) - 1;
1024514f5e3Sopenharmony_ci    static constexpr unsigned BITS_PER_BYTE = 8;
1034514f5e3Sopenharmony_ci
1044514f5e3Sopenharmony_ci    static constexpr uint32_t MAX_BIT_SIZE = 48;
1054514f5e3Sopenharmony_ci    static constexpr int INITIAL_PROPERTY_INDEX = 0;
1064514f5e3Sopenharmony_ci
1074514f5e3Sopenharmony_ci    using PropertyMetaDataField = BitField<int32_t, 0, 4>;  // 4: property metaData field occupies 4 bits
1084514f5e3Sopenharmony_ci    using AttributesField = BitField<int32_t, 0, 4>;        // 4: attributes field occupies 4 bits
1094514f5e3Sopenharmony_ci    using DefaultAttributesField = BitField<int32_t, 0, 3>; // 3: default attributes field occupies 3 bits
1104514f5e3Sopenharmony_ci    using WritableField = BitField<bool, 0, 1>;         // 1: writable field occupies 1 bits
1114514f5e3Sopenharmony_ci    using EnumerableField = WritableField::NextFlag;
1124514f5e3Sopenharmony_ci    using ConfigurableField = EnumerableField::NextFlag;
1134514f5e3Sopenharmony_ci    using IsAccessorField = ConfigurableField::NextFlag; // 4
1144514f5e3Sopenharmony_ci
1154514f5e3Sopenharmony_ci    using IsInlinedPropsField = PropertyMetaDataField::NextFlag;                                    // 5
1164514f5e3Sopenharmony_ci    using RepresentationField = IsInlinedPropsField::NextField<Representation, REPRESENTATION_NUM>; // 2: 2 bits, 6-7
1174514f5e3Sopenharmony_ci    using CommonLastBitField = RepresentationField;
1184514f5e3Sopenharmony_ci    // For flags required for both fast mode and slow mode, need to be added before CommonLastBitField
1194514f5e3Sopenharmony_ci
1204514f5e3Sopenharmony_ci    // ---------------------------------------------------------------------------------------------
1214514f5e3Sopenharmony_ci    // only for fast mode
1224514f5e3Sopenharmony_ci    using FastModeStartField = CommonLastBitField;
1234514f5e3Sopenharmony_ci    static_assert(FastModeStartField::START_BIT == CommonLastBitField::START_BIT);
1244514f5e3Sopenharmony_ci    static_assert(FastModeStartField::SIZE == CommonLastBitField::SIZE);
1254514f5e3Sopenharmony_ci    using OffsetField = FastModeStartField::NextField<uint32_t, OFFSET_BITFIELD_NUM>; // 17
1264514f5e3Sopenharmony_ci    using TrackTypeField = OffsetField::NextField<TrackType, TRACK_TYPE_NUM>;     // 20: 3 bits
1274514f5e3Sopenharmony_ci    static_assert(TrackTypeField::END_BIT <= sizeof(uint32_t) * BITS_PER_BYTE, "Invalid");
1284514f5e3Sopenharmony_ci
1294514f5e3Sopenharmony_ci    // normal attr should include SharedFieldTypeField when set to layout
1304514f5e3Sopenharmony_ci    static constexpr uint32_t NORMAL_ATTR_BITS = 28;
1314514f5e3Sopenharmony_ci    using NormalAttrField = BitField<uint32_t, 0, NORMAL_ATTR_BITS>;
1324514f5e3Sopenharmony_ci    using SharedFieldTypeField = TrackTypeField::NextField<SharedFieldType, FIELD_TYPE_NUM>; // 28: 8 bits
1334514f5e3Sopenharmony_ci    using SortedIndexField = SharedFieldTypeField::NextField<uint32_t, OFFSET_BITFIELD_NUM>; // 38: 10 bits
1344514f5e3Sopenharmony_ci    using IsConstPropsField = SortedIndexField::NextFlag;                              // 39
1354514f5e3Sopenharmony_ci    using IsNotHoleField = IsConstPropsField::NextFlag;                                // 40
1364514f5e3Sopenharmony_ci    using IsPGODumpedField = IsNotHoleField::NextFlag;                                      // 41
1374514f5e3Sopenharmony_ci    using FastModeLastField = IsPGODumpedField;
1384514f5e3Sopenharmony_ci    static_assert(
1394514f5e3Sopenharmony_ci        FastModeLastField::START_BIT + FastModeLastField::SIZE <= MAX_BIT_SIZE, "Invalid");
1404514f5e3Sopenharmony_ci
1414514f5e3Sopenharmony_ci    // ---------------------------------------------------------------------------------------------
1424514f5e3Sopenharmony_ci    // only for dictionary mode, include global
1434514f5e3Sopenharmony_ci    using DictModeStartField = CommonLastBitField;
1444514f5e3Sopenharmony_ci    static_assert(DictModeStartField::START_BIT == CommonLastBitField::START_BIT);
1454514f5e3Sopenharmony_ci    static_assert(DictModeStartField::SIZE == CommonLastBitField::SIZE);
1464514f5e3Sopenharmony_ci    using PropertyBoxTypeField = DictModeStartField::NextField<PropertyBoxType, 2>;               // 2: 2 bits, 8-9
1474514f5e3Sopenharmony_ci    using DictionaryOrderField = PropertyBoxTypeField::NextField<uint32_t, DICTIONARY_ORDER_NUM>; // 29
1484514f5e3Sopenharmony_ci    using DictSharedFieldTypeField = DictionaryOrderField::NextField<SharedFieldType, FIELD_TYPE_NUM>;
1494514f5e3Sopenharmony_ci    using DictModeLastField = DictSharedFieldTypeField;
1504514f5e3Sopenharmony_ci
1514514f5e3Sopenharmony_ci    static_assert(
1524514f5e3Sopenharmony_ci        DictModeLastField::START_BIT + DictModeLastField::SIZE <= MAX_BIT_SIZE, "Invalid");
1534514f5e3Sopenharmony_ci
1544514f5e3Sopenharmony_ci    inline int32_t GetPropertyMetaData() const
1554514f5e3Sopenharmony_ci    {
1564514f5e3Sopenharmony_ci        return PropertyMetaDataField::Get(value_);
1574514f5e3Sopenharmony_ci    }
1584514f5e3Sopenharmony_ci
1594514f5e3Sopenharmony_ci    static PropertyAttributes Default()
1604514f5e3Sopenharmony_ci    {
1614514f5e3Sopenharmony_ci        return PropertyAttributes(GetDefaultAttributes());
1624514f5e3Sopenharmony_ci    }
1634514f5e3Sopenharmony_ci
1644514f5e3Sopenharmony_ci    static PropertyAttributes Default(bool w, bool e, bool c, bool isAccessor = false)
1654514f5e3Sopenharmony_ci    {
1664514f5e3Sopenharmony_ci        uint64_t value = WritableField::Encode(w) | EnumerableField::Encode(e) | ConfigurableField::Encode(c) |
1674514f5e3Sopenharmony_ci                         IsAccessorField::Encode(isAccessor);
1684514f5e3Sopenharmony_ci        return PropertyAttributes(value);
1694514f5e3Sopenharmony_ci    }
1704514f5e3Sopenharmony_ci
1714514f5e3Sopenharmony_ci    static PropertyAttributes DefaultAccessor(bool w, bool e, bool c)
1724514f5e3Sopenharmony_ci    {
1734514f5e3Sopenharmony_ci        uint64_t value = WritableField::Encode(w) | EnumerableField::Encode(e) | ConfigurableField::Encode(c) |
1744514f5e3Sopenharmony_ci                         IsAccessorField::Encode(true);
1754514f5e3Sopenharmony_ci        return PropertyAttributes(value);
1764514f5e3Sopenharmony_ci    }
1774514f5e3Sopenharmony_ci
1784514f5e3Sopenharmony_ci    inline void SetDefaultAttributes()
1794514f5e3Sopenharmony_ci    {
1804514f5e3Sopenharmony_ci        AttributesField::Set<uint64_t>(DefaultAttributesField::Mask(), &value_);
1814514f5e3Sopenharmony_ci    }
1824514f5e3Sopenharmony_ci
1834514f5e3Sopenharmony_ci    static inline int32_t GetDefaultAttributes()
1844514f5e3Sopenharmony_ci    {
1854514f5e3Sopenharmony_ci        return DefaultAttributesField::Mask();
1864514f5e3Sopenharmony_ci    }
1874514f5e3Sopenharmony_ci    // JSShared should not update tracktype.
1884514f5e3Sopenharmony_ci    bool UpdateTrackType(JSTaggedValue value)
1894514f5e3Sopenharmony_ci    {
1904514f5e3Sopenharmony_ci        TrackType oldType = GetTrackType();
1914514f5e3Sopenharmony_ci        if (oldType == TrackType::TAGGED) {
1924514f5e3Sopenharmony_ci            return false;
1934514f5e3Sopenharmony_ci        }
1944514f5e3Sopenharmony_ci
1954514f5e3Sopenharmony_ci        TrackType newType = TrackType::TAGGED;
1964514f5e3Sopenharmony_ci        if (value.IsInt()) {
1974514f5e3Sopenharmony_ci            newType = static_cast<TrackType>(static_cast<uint8_t>(TrackType::INT) | static_cast<uint8_t>(oldType));
1984514f5e3Sopenharmony_ci        } else if (value.IsDouble()) {
1994514f5e3Sopenharmony_ci            newType = static_cast<TrackType>(static_cast<uint8_t>(TrackType::DOUBLE) | static_cast<uint8_t>(oldType));
2004514f5e3Sopenharmony_ci        }
2014514f5e3Sopenharmony_ci
2024514f5e3Sopenharmony_ci        if (oldType != newType) {
2034514f5e3Sopenharmony_ci            SetTrackType(newType);
2044514f5e3Sopenharmony_ci            return true;
2054514f5e3Sopenharmony_ci        }
2064514f5e3Sopenharmony_ci        return false;
2074514f5e3Sopenharmony_ci    }
2084514f5e3Sopenharmony_ci
2094514f5e3Sopenharmony_ci    inline bool IsDefaultAttributes() const
2104514f5e3Sopenharmony_ci    {
2114514f5e3Sopenharmony_ci        return AttributesField::Get(value_) == static_cast<int32_t>(DefaultAttributesField::Mask());
2124514f5e3Sopenharmony_ci    }
2134514f5e3Sopenharmony_ci
2144514f5e3Sopenharmony_ci    inline void SetNoneAttributes()
2154514f5e3Sopenharmony_ci    {
2164514f5e3Sopenharmony_ci        AttributesField::Set<uint64_t>(0U, &value_);
2174514f5e3Sopenharmony_ci    }
2184514f5e3Sopenharmony_ci
2194514f5e3Sopenharmony_ci    inline bool IsNoneAttributes() const
2204514f5e3Sopenharmony_ci    {
2214514f5e3Sopenharmony_ci        return AttributesField::Get(value_) == 0;
2224514f5e3Sopenharmony_ci    }
2234514f5e3Sopenharmony_ci
2244514f5e3Sopenharmony_ci    inline void SetWritable(bool flag)
2254514f5e3Sopenharmony_ci    {
2264514f5e3Sopenharmony_ci        WritableField::Set<uint64_t>(flag, &value_);
2274514f5e3Sopenharmony_ci    }
2284514f5e3Sopenharmony_ci    inline bool IsWritable() const
2294514f5e3Sopenharmony_ci    {
2304514f5e3Sopenharmony_ci        return WritableField::Get(value_);
2314514f5e3Sopenharmony_ci    }
2324514f5e3Sopenharmony_ci    inline void SetEnumerable(bool flag)
2334514f5e3Sopenharmony_ci    {
2344514f5e3Sopenharmony_ci        EnumerableField::Set<uint64_t>(flag, &value_);
2354514f5e3Sopenharmony_ci    }
2364514f5e3Sopenharmony_ci    inline bool IsEnumerable() const
2374514f5e3Sopenharmony_ci    {
2384514f5e3Sopenharmony_ci        return EnumerableField::Get(value_);
2394514f5e3Sopenharmony_ci    }
2404514f5e3Sopenharmony_ci    inline void SetConfigurable(bool flag)
2414514f5e3Sopenharmony_ci    {
2424514f5e3Sopenharmony_ci        ConfigurableField::Set<uint64_t>(flag, &value_);
2434514f5e3Sopenharmony_ci    }
2444514f5e3Sopenharmony_ci    inline bool IsConfigurable() const
2454514f5e3Sopenharmony_ci    {
2464514f5e3Sopenharmony_ci        return ConfigurableField::Get(value_);
2474514f5e3Sopenharmony_ci    }
2484514f5e3Sopenharmony_ci
2494514f5e3Sopenharmony_ci    inline void SetIsAccessor(bool flag)
2504514f5e3Sopenharmony_ci    {
2514514f5e3Sopenharmony_ci        IsAccessorField::Set<uint64_t>(flag, &value_);
2524514f5e3Sopenharmony_ci    }
2534514f5e3Sopenharmony_ci
2544514f5e3Sopenharmony_ci    inline bool IsAccessor() const
2554514f5e3Sopenharmony_ci    {
2564514f5e3Sopenharmony_ci        return IsAccessorField::Get(value_);
2574514f5e3Sopenharmony_ci    }
2584514f5e3Sopenharmony_ci
2594514f5e3Sopenharmony_ci    inline void SetIsInlinedProps(bool flag)
2604514f5e3Sopenharmony_ci    {
2614514f5e3Sopenharmony_ci        IsInlinedPropsField::Set<uint64_t>(flag, &value_);
2624514f5e3Sopenharmony_ci    }
2634514f5e3Sopenharmony_ci
2644514f5e3Sopenharmony_ci    inline bool IsInlinedProps() const
2654514f5e3Sopenharmony_ci    {
2664514f5e3Sopenharmony_ci        return IsInlinedPropsField::Get(value_);
2674514f5e3Sopenharmony_ci    }
2684514f5e3Sopenharmony_ci
2694514f5e3Sopenharmony_ci    inline void SetIsConstProps(bool flag)
2704514f5e3Sopenharmony_ci    {
2714514f5e3Sopenharmony_ci        IsConstPropsField::Set<uint64_t>(flag, &value_);
2724514f5e3Sopenharmony_ci    }
2734514f5e3Sopenharmony_ci
2744514f5e3Sopenharmony_ci    inline bool IsConstProps() const
2754514f5e3Sopenharmony_ci    {
2764514f5e3Sopenharmony_ci        return IsConstPropsField::Get(value_);
2774514f5e3Sopenharmony_ci    }
2784514f5e3Sopenharmony_ci
2794514f5e3Sopenharmony_ci    inline void SetIsNotHole(bool flag)
2804514f5e3Sopenharmony_ci    {
2814514f5e3Sopenharmony_ci        IsNotHoleField::Set<uint64_t>(flag, &value_);
2824514f5e3Sopenharmony_ci    }
2834514f5e3Sopenharmony_ci
2844514f5e3Sopenharmony_ci    inline bool IsNotHole() const
2854514f5e3Sopenharmony_ci    {
2864514f5e3Sopenharmony_ci        return IsNotHoleField::Get(value_);
2874514f5e3Sopenharmony_ci    }
2884514f5e3Sopenharmony_ci
2894514f5e3Sopenharmony_ci    inline bool IsTaggedRep() const
2904514f5e3Sopenharmony_ci    {
2914514f5e3Sopenharmony_ci        return !IsDoubleRep() && !IsIntRep();
2924514f5e3Sopenharmony_ci    }
2934514f5e3Sopenharmony_ci
2944514f5e3Sopenharmony_ci    inline bool IsDoubleRep() const
2954514f5e3Sopenharmony_ci    {
2964514f5e3Sopenharmony_ci        auto rep = GetRepresentation();
2974514f5e3Sopenharmony_ci        return rep == Representation::DOUBLE;
2984514f5e3Sopenharmony_ci    }
2994514f5e3Sopenharmony_ci
3004514f5e3Sopenharmony_ci    inline bool IsIntRep() const
3014514f5e3Sopenharmony_ci    {
3024514f5e3Sopenharmony_ci        auto rep = GetRepresentation();
3034514f5e3Sopenharmony_ci        return rep == Representation::INT;
3044514f5e3Sopenharmony_ci    }
3054514f5e3Sopenharmony_ci
3064514f5e3Sopenharmony_ci    inline void SetRepresentation(Representation representation)
3074514f5e3Sopenharmony_ci    {
3084514f5e3Sopenharmony_ci        RepresentationField::Set<uint64_t>(representation, &value_);
3094514f5e3Sopenharmony_ci    }
3104514f5e3Sopenharmony_ci
3114514f5e3Sopenharmony_ci    inline Representation GetRepresentation() const
3124514f5e3Sopenharmony_ci    {
3134514f5e3Sopenharmony_ci        return RepresentationField::Get(value_);
3144514f5e3Sopenharmony_ci    }
3154514f5e3Sopenharmony_ci
3164514f5e3Sopenharmony_ci    inline TrackType GetTrackType() const
3174514f5e3Sopenharmony_ci    {
3184514f5e3Sopenharmony_ci        return TrackTypeField::Get(value_);
3194514f5e3Sopenharmony_ci    }
3204514f5e3Sopenharmony_ci
3214514f5e3Sopenharmony_ci    inline void SetTrackType(TrackType type)
3224514f5e3Sopenharmony_ci    {
3234514f5e3Sopenharmony_ci        TrackTypeField::Set<uint64_t>(type, &value_);
3244514f5e3Sopenharmony_ci    }
3254514f5e3Sopenharmony_ci
3264514f5e3Sopenharmony_ci    inline bool IsPGODumped()
3274514f5e3Sopenharmony_ci    {
3284514f5e3Sopenharmony_ci        return IsPGODumpedField::Get(value_);
3294514f5e3Sopenharmony_ci    }
3304514f5e3Sopenharmony_ci
3314514f5e3Sopenharmony_ci    inline void SetIsPGODumped(bool isDumped)
3324514f5e3Sopenharmony_ci    {
3334514f5e3Sopenharmony_ci        IsPGODumpedField::Set<uint64_t>(isDumped, &value_);
3344514f5e3Sopenharmony_ci    }
3354514f5e3Sopenharmony_ci
3364514f5e3Sopenharmony_ci    inline SharedFieldType GetSharedFieldType() const
3374514f5e3Sopenharmony_ci    {
3384514f5e3Sopenharmony_ci        return SharedFieldTypeField::Get(value_);
3394514f5e3Sopenharmony_ci    }
3404514f5e3Sopenharmony_ci
3414514f5e3Sopenharmony_ci    inline void SetSharedFieldType(SharedFieldType fieldType)
3424514f5e3Sopenharmony_ci    {
3434514f5e3Sopenharmony_ci        SharedFieldTypeField::Set<uint64_t>(fieldType, &value_);
3444514f5e3Sopenharmony_ci    }
3454514f5e3Sopenharmony_ci
3464514f5e3Sopenharmony_ci    inline void SetDictSharedFieldType(SharedFieldType fieldType)
3474514f5e3Sopenharmony_ci    {
3484514f5e3Sopenharmony_ci        DictSharedFieldTypeField::Set<uint64_t>(fieldType, &value_);
3494514f5e3Sopenharmony_ci    }
3504514f5e3Sopenharmony_ci
3514514f5e3Sopenharmony_ci    inline SharedFieldType GetDictSharedFieldType() const
3524514f5e3Sopenharmony_ci    {
3534514f5e3Sopenharmony_ci        return DictSharedFieldTypeField::Get(value_);
3544514f5e3Sopenharmony_ci    }
3554514f5e3Sopenharmony_ci
3564514f5e3Sopenharmony_ci    inline void SetDictionaryOrder(uint32_t order)
3574514f5e3Sopenharmony_ci    {
3584514f5e3Sopenharmony_ci        DictionaryOrderField::Set<uint64_t>(order, &value_);
3594514f5e3Sopenharmony_ci    }
3604514f5e3Sopenharmony_ci    inline uint32_t GetDictionaryOrder() const
3614514f5e3Sopenharmony_ci    {
3624514f5e3Sopenharmony_ci        return DictionaryOrderField::Get(value_);
3634514f5e3Sopenharmony_ci    }
3644514f5e3Sopenharmony_ci
3654514f5e3Sopenharmony_ci    inline void SetOffset(uint32_t offset)
3664514f5e3Sopenharmony_ci    {
3674514f5e3Sopenharmony_ci        OffsetField::Set<uint64_t>(offset, &value_);
3684514f5e3Sopenharmony_ci    }
3694514f5e3Sopenharmony_ci
3704514f5e3Sopenharmony_ci    inline uint32_t GetOffset() const
3714514f5e3Sopenharmony_ci    {
3724514f5e3Sopenharmony_ci        return OffsetField::Get(value_);
3734514f5e3Sopenharmony_ci    }
3744514f5e3Sopenharmony_ci
3754514f5e3Sopenharmony_ci    inline void SetSortedIndex(uint32_t sortedIndex)
3764514f5e3Sopenharmony_ci    {
3774514f5e3Sopenharmony_ci        SortedIndexField::Set<uint64_t>(sortedIndex, &value_);
3784514f5e3Sopenharmony_ci    }
3794514f5e3Sopenharmony_ci    inline uint32_t GetSortedIndex() const
3804514f5e3Sopenharmony_ci    {
3814514f5e3Sopenharmony_ci        return SortedIndexField::Get(value_);
3824514f5e3Sopenharmony_ci    }
3834514f5e3Sopenharmony_ci
3844514f5e3Sopenharmony_ci    inline void SetNormalAttr(uint32_t normalAttr)
3854514f5e3Sopenharmony_ci    {
3864514f5e3Sopenharmony_ci        NormalAttrField::Set<uint64_t>(normalAttr, &value_);
3874514f5e3Sopenharmony_ci    }
3884514f5e3Sopenharmony_ci
3894514f5e3Sopenharmony_ci    inline uint32_t GetNormalAttr() const
3904514f5e3Sopenharmony_ci    {
3914514f5e3Sopenharmony_ci        return NormalAttrField::Get(value_);
3924514f5e3Sopenharmony_ci    }
3934514f5e3Sopenharmony_ci
3944514f5e3Sopenharmony_ci    inline JSTaggedValue GetNormalTagged() const
3954514f5e3Sopenharmony_ci    {
3964514f5e3Sopenharmony_ci        return JSTaggedValue::WrapUint64(GetNormalAttr());
3974514f5e3Sopenharmony_ci    }
3984514f5e3Sopenharmony_ci
3994514f5e3Sopenharmony_ci    inline uint64_t GetValue() const
4004514f5e3Sopenharmony_ci    {
4014514f5e3Sopenharmony_ci        return value_;
4024514f5e3Sopenharmony_ci    }
4034514f5e3Sopenharmony_ci
4044514f5e3Sopenharmony_ci    inline void SetBoxType(PropertyBoxType cellType)
4054514f5e3Sopenharmony_ci    {
4064514f5e3Sopenharmony_ci        PropertyBoxTypeField::Set<uint64_t>(cellType, &value_);
4074514f5e3Sopenharmony_ci    }
4084514f5e3Sopenharmony_ci
4094514f5e3Sopenharmony_ci    inline PropertyBoxType GetBoxType() const
4104514f5e3Sopenharmony_ci    {
4114514f5e3Sopenharmony_ci        return PropertyBoxTypeField::Get(value_);
4124514f5e3Sopenharmony_ci    }
4134514f5e3Sopenharmony_ci
4144514f5e3Sopenharmony_ci    static inline Representation TranslateToRep(JSTaggedValue value)
4154514f5e3Sopenharmony_ci    {
4164514f5e3Sopenharmony_ci        if (value.IsInt()) {
4174514f5e3Sopenharmony_ci            return Representation::INT;
4184514f5e3Sopenharmony_ci        } else if (value.IsDouble()) {
4194514f5e3Sopenharmony_ci            return Representation::DOUBLE;
4204514f5e3Sopenharmony_ci        }
4214514f5e3Sopenharmony_ci        return Representation::TAGGED;
4224514f5e3Sopenharmony_ci    }
4234514f5e3Sopenharmony_ci
4244514f5e3Sopenharmony_ci    inline static bool IsValidIndex(int index)
4254514f5e3Sopenharmony_ci    {
4264514f5e3Sopenharmony_ci        return DictionaryOrderField::IsValid(index);
4274514f5e3Sopenharmony_ci    }
4284514f5e3Sopenharmony_ci
4294514f5e3Sopenharmony_ci    inline JSTaggedValue GetTaggedValue() const
4304514f5e3Sopenharmony_ci    {
4314514f5e3Sopenharmony_ci        return JSTaggedValue::WrapUint64(value_);
4324514f5e3Sopenharmony_ci    }
4334514f5e3Sopenharmony_ci
4344514f5e3Sopenharmony_ciprivate:
4354514f5e3Sopenharmony_ci    uint64_t value_{0};
4364514f5e3Sopenharmony_ci};
4374514f5e3Sopenharmony_ci}  // namespace panda::ecmascript
4384514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_PROPERTY_ATTRIBUTES_H
439