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