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_SNAPSHOT_MEM_ENCODE_BIT_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_SNAPSHOT_MEM_ENCODE_BIT_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include "ecmascript/mem/c_containers.h" 204514f5e3Sopenharmony_ci#include "ecmascript/mem/slots.h" 214514f5e3Sopenharmony_ci#include "ecmascript/snapshot/mem/constants.h" 224514f5e3Sopenharmony_ci 234514f5e3Sopenharmony_ci#include "libpandabase/utils/bit_field.h" 244514f5e3Sopenharmony_ci 254514f5e3Sopenharmony_ci/* 264514f5e3Sopenharmony_ci * EncodeBit: use uint64_t value to encode TaggedObject when serialize 274514f5e3Sopenharmony_ci * 284514f5e3Sopenharmony_ci * |0000...000| |0000...00| |0| |0| |0| |00000000| |0| |0000...000| |00...0| 294514f5e3Sopenharmony_ci * 16bit 8bit 1bit 1bit 1bit 8bit 1bit 18bit 10bit 304514f5e3Sopenharmony_ci * is reference unused weak builtins special obj type string obj offset region index 314514f5e3Sopenharmony_ci */ 324514f5e3Sopenharmony_ci 334514f5e3Sopenharmony_cinamespace panda::ecmascript { 344514f5e3Sopenharmony_ciclass EncodeBit final { 354514f5e3Sopenharmony_cipublic: 364514f5e3Sopenharmony_ci ~EncodeBit() = default; 374514f5e3Sopenharmony_ci EncodeBit() = delete; 384514f5e3Sopenharmony_ci 394514f5e3Sopenharmony_ci DEFAULT_COPY_SEMANTIC(EncodeBit); 404514f5e3Sopenharmony_ci DEFAULT_MOVE_SEMANTIC(EncodeBit); 414514f5e3Sopenharmony_ci 424514f5e3Sopenharmony_ci explicit EncodeBit(uint64_t value) : value_(value) {} 434514f5e3Sopenharmony_ci 444514f5e3Sopenharmony_ci // encode bit 454514f5e3Sopenharmony_ci static constexpr int REGION_INDEX_BIT_NUMBER = 10; // region index 464514f5e3Sopenharmony_ci static constexpr int OBJECT_OFFSET_IN_REGION_NUMBER = 18; // object offset in current region 474514f5e3Sopenharmony_ci static constexpr int OBJECT_TO_STRING_FLAG_NUMBER = 1; // 1 : reference to string 484514f5e3Sopenharmony_ci static constexpr int OBJECT_TYPE_BIT_NUMBER = 8; // js_type 494514f5e3Sopenharmony_ci static constexpr int OBJECT_SPECIAL = 1; // special 504514f5e3Sopenharmony_ci static constexpr int GLOBAL_CONST_OR_BUILTINS = 1; // is global const or builtins object 514514f5e3Sopenharmony_ci static constexpr int TS_WEAK_OBJECT = 1; // weak objects generated by AOT, e.g. TSHClass 524514f5e3Sopenharmony_ci static constexpr int UNUSED_BIT_NUMBER = 8; // unused bit number 534514f5e3Sopenharmony_ci static constexpr int IS_REFERENCE_BIT_NUMBER = 16; // [0x0000] is reference 544514f5e3Sopenharmony_ci 554514f5e3Sopenharmony_ci using RegionIndexBits = BitField<size_t, 0, REGION_INDEX_BIT_NUMBER>; 564514f5e3Sopenharmony_ci using ObjectOffsetInRegionBits = RegionIndexBits::NextField<size_t, OBJECT_OFFSET_IN_REGION_NUMBER>; 574514f5e3Sopenharmony_ci using ObjectToStringBits = ObjectOffsetInRegionBits::NextField<bool, OBJECT_TO_STRING_FLAG_NUMBER>; 584514f5e3Sopenharmony_ci using ObjectTypeBits = ObjectToStringBits::NextField<size_t, OBJECT_TYPE_BIT_NUMBER>; 594514f5e3Sopenharmony_ci using ObjectSpecialBits = ObjectTypeBits::NextField<bool, OBJECT_SPECIAL>; 604514f5e3Sopenharmony_ci using GlobalConstOrBuiltinsBits = ObjectSpecialBits::NextField<bool, GLOBAL_CONST_OR_BUILTINS>; 614514f5e3Sopenharmony_ci using TSWeakObjectBits = GlobalConstOrBuiltinsBits::NextField<bool, TS_WEAK_OBJECT>; 624514f5e3Sopenharmony_ci using UnusedBits = TSWeakObjectBits::NextField<size_t, UNUSED_BIT_NUMBER>; 634514f5e3Sopenharmony_ci using IsReferenceBits = UnusedBits::NextField<size_t, IS_REFERENCE_BIT_NUMBER>; 644514f5e3Sopenharmony_ci 654514f5e3Sopenharmony_ci void SetRegionIndex(size_t region_index) 664514f5e3Sopenharmony_ci { 674514f5e3Sopenharmony_ci RegionIndexBits::Set<uint64_t>(region_index, &value_); 684514f5e3Sopenharmony_ci } 694514f5e3Sopenharmony_ci 704514f5e3Sopenharmony_ci void SetObjectOffsetInRegion(size_t object_offset) 714514f5e3Sopenharmony_ci { 724514f5e3Sopenharmony_ci ObjectOffsetInRegionBits::Set<uint64_t>(object_offset, &value_); 734514f5e3Sopenharmony_ci } 744514f5e3Sopenharmony_ci 754514f5e3Sopenharmony_ci void SetReferenceToString(bool flag) 764514f5e3Sopenharmony_ci { 774514f5e3Sopenharmony_ci ObjectToStringBits::Set<uint64_t>(flag, &value_); 784514f5e3Sopenharmony_ci } 794514f5e3Sopenharmony_ci 804514f5e3Sopenharmony_ci bool IsReferenceToString() const 814514f5e3Sopenharmony_ci { 824514f5e3Sopenharmony_ci return ObjectToStringBits::Decode(value_); 834514f5e3Sopenharmony_ci } 844514f5e3Sopenharmony_ci 854514f5e3Sopenharmony_ci void SetObjectType(size_t object_type) 864514f5e3Sopenharmony_ci { 874514f5e3Sopenharmony_ci ObjectTypeBits::Set<uint64_t>(object_type, &value_); 884514f5e3Sopenharmony_ci } 894514f5e3Sopenharmony_ci 904514f5e3Sopenharmony_ci uint64_t GetValue() const 914514f5e3Sopenharmony_ci { 924514f5e3Sopenharmony_ci return value_; 934514f5e3Sopenharmony_ci } 944514f5e3Sopenharmony_ci 954514f5e3Sopenharmony_ci size_t GetRegionIndex() const 964514f5e3Sopenharmony_ci { 974514f5e3Sopenharmony_ci return RegionIndexBits::Decode(value_); 984514f5e3Sopenharmony_ci } 994514f5e3Sopenharmony_ci 1004514f5e3Sopenharmony_ci size_t GetObjectOffsetInRegion() const 1014514f5e3Sopenharmony_ci { 1024514f5e3Sopenharmony_ci return ObjectOffsetInRegionBits::Decode(value_); 1034514f5e3Sopenharmony_ci } 1044514f5e3Sopenharmony_ci 1054514f5e3Sopenharmony_ci size_t GetNativePointerOrObjectIndex() const 1064514f5e3Sopenharmony_ci { 1074514f5e3Sopenharmony_ci return (ObjectOffsetInRegionBits::Decode(value_) << REGION_INDEX_BIT_NUMBER) + RegionIndexBits::Decode(value_); 1084514f5e3Sopenharmony_ci } 1094514f5e3Sopenharmony_ci 1104514f5e3Sopenharmony_ci size_t GetObjectType() const 1114514f5e3Sopenharmony_ci { 1124514f5e3Sopenharmony_ci return ObjectTypeBits::Decode(value_); 1134514f5e3Sopenharmony_ci } 1144514f5e3Sopenharmony_ci 1154514f5e3Sopenharmony_ci bool IsReference() const 1164514f5e3Sopenharmony_ci { 1174514f5e3Sopenharmony_ci return IsReferenceBits::Decode(value_) == 0; 1184514f5e3Sopenharmony_ci } 1194514f5e3Sopenharmony_ci 1204514f5e3Sopenharmony_ci bool IsSpecial() const 1214514f5e3Sopenharmony_ci { 1224514f5e3Sopenharmony_ci return ObjectSpecialBits::Decode(value_); 1234514f5e3Sopenharmony_ci } 1244514f5e3Sopenharmony_ci 1254514f5e3Sopenharmony_ci void SetObjectSpecial() 1264514f5e3Sopenharmony_ci { 1274514f5e3Sopenharmony_ci ObjectSpecialBits::Set<uint64_t>(true, &value_); 1284514f5e3Sopenharmony_ci } 1294514f5e3Sopenharmony_ci 1304514f5e3Sopenharmony_ci bool IsGlobalConstOrBuiltins() const 1314514f5e3Sopenharmony_ci { 1324514f5e3Sopenharmony_ci return GlobalConstOrBuiltinsBits::Decode(value_); 1334514f5e3Sopenharmony_ci } 1344514f5e3Sopenharmony_ci 1354514f5e3Sopenharmony_ci void SetGlobalConstOrBuiltins() 1364514f5e3Sopenharmony_ci { 1374514f5e3Sopenharmony_ci GlobalConstOrBuiltinsBits::Set<uint64_t>(true, &value_); 1384514f5e3Sopenharmony_ci } 1394514f5e3Sopenharmony_ci 1404514f5e3Sopenharmony_ci bool IsTSWeakObject() const 1414514f5e3Sopenharmony_ci { 1424514f5e3Sopenharmony_ci return TSWeakObjectBits::Decode(value_); 1434514f5e3Sopenharmony_ci } 1444514f5e3Sopenharmony_ci 1454514f5e3Sopenharmony_ci void SetTSWeakObject() 1464514f5e3Sopenharmony_ci { 1474514f5e3Sopenharmony_ci TSWeakObjectBits::Set<uint64_t>(true, &value_); 1484514f5e3Sopenharmony_ci } 1494514f5e3Sopenharmony_ci 1504514f5e3Sopenharmony_ci // low 28 bits are used to record object location(region index and object offset), besides, it's 1514514f5e3Sopenharmony_ci // used to record string index, global const and builtins object index, native pointer index 1524514f5e3Sopenharmony_ci void SetNativePointerOrObjectIndex(size_t index) 1534514f5e3Sopenharmony_ci { 1544514f5e3Sopenharmony_ci ASSERT(index < Constants::MAX_OBJECT_INDEX); 1554514f5e3Sopenharmony_ci ObjectOffsetInRegionBits::Set<uint64_t>(index >> REGION_INDEX_BIT_NUMBER, &value_); 1564514f5e3Sopenharmony_ci RegionIndexBits::Set<uint64_t>(index & Constants::REGION_INDEX_MASK, &value_); 1574514f5e3Sopenharmony_ci } 1584514f5e3Sopenharmony_ci 1594514f5e3Sopenharmony_ci void ClearObjectSpecialFlag() 1604514f5e3Sopenharmony_ci { 1614514f5e3Sopenharmony_ci ObjectSpecialBits::Set<uint64_t>(false, &value_); 1624514f5e3Sopenharmony_ci } 1634514f5e3Sopenharmony_ci 1644514f5e3Sopenharmony_ciprivate: 1654514f5e3Sopenharmony_ci uint64_t value_; 1664514f5e3Sopenharmony_ci}; 1674514f5e3Sopenharmony_cistatic_assert(EncodeBit::REGION_INDEX_BIT_NUMBER + EncodeBit::OBJECT_OFFSET_IN_REGION_NUMBER + 1684514f5e3Sopenharmony_ci EncodeBit::OBJECT_TO_STRING_FLAG_NUMBER + EncodeBit::OBJECT_TYPE_BIT_NUMBER + EncodeBit::OBJECT_SPECIAL + 1694514f5e3Sopenharmony_ci EncodeBit::GLOBAL_CONST_OR_BUILTINS + EncodeBit::TS_WEAK_OBJECT + EncodeBit::UNUSED_BIT_NUMBER + 1704514f5e3Sopenharmony_ci EncodeBit::IS_REFERENCE_BIT_NUMBER == Constants::UINT_64_BITS_COUNT); 1714514f5e3Sopenharmony_ci} // namespace panda::ecmascript 1724514f5e3Sopenharmony_ci 1734514f5e3Sopenharmony_ci#endif // ECMASCRIPT_SNAPSHOT_MEM_ENCODE_BIT_H 174