1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ECMASCRIPT_MEM_SPACE_INL_H 17 #define ECMASCRIPT_MEM_SPACE_INL_H 18 19 #include "ecmascript/mem/space.h" 20 21 namespace panda::ecmascript { AddRegion(Region *region)22void Space::AddRegion(Region *region) 23 { 24 ASSERT(region != nullptr); 25 LOG_ECMA_MEM(DEBUG) << "Add region:" << region << " to " << ToSpaceTypeName(spaceType_); 26 regionList_.AddNode(region); 27 IncreaseCommitted(region->GetCapacity()); 28 IncreaseObjectSize(region->GetSize()); 29 } 30 RemoveRegion(Region *region)31void Space::RemoveRegion(Region *region) 32 { 33 LOG_ECMA_MEM(DEBUG) << "Remove region:" << region << " to " << ToSpaceTypeName(spaceType_); 34 regionList_.RemoveNode(region); 35 DecreaseCommitted(region->GetCapacity()); 36 DecreaseObjectSize(region->GetSize()); 37 } 38 39 template<class Callback> EnumerateRegions(const Callback &cb, Region *end) const40void Space::EnumerateRegions(const Callback &cb, Region *end) const 41 { 42 Region *current = regionList_.GetFirst(); 43 if (current == nullptr) { 44 return; 45 } 46 if (end == nullptr) { 47 end = regionList_.GetLast(); 48 } 49 while (current != end) { 50 auto next = current->GetNext(); 51 cb(current); 52 current = next; 53 } 54 55 if (current != nullptr) { 56 cb(current); 57 } 58 } 59 60 template<class Callback> EnumerateRegionsWithRecord(const Callback &cb) const61void Space::EnumerateRegionsWithRecord(const Callback &cb) const 62 { 63 if (recordRegion_ != nullptr) { 64 EnumerateRegions(cb, recordRegion_); 65 } 66 } 67 GetRegionFlag() const68RegionSpaceFlag Space::GetRegionFlag() const 69 { 70 RegionSpaceFlag flags = RegionSpaceFlag::UNINITIALIZED; 71 switch (spaceType_) { 72 case MemSpaceType::OLD_SPACE: 73 case MemSpaceType::LOCAL_SPACE: 74 flags = RegionSpaceFlag::IN_OLD_SPACE; 75 break; 76 case MemSpaceType::EDEN_SPACE: 77 flags = RegionSpaceFlag::IN_EDEN_SPACE; 78 break; 79 case MemSpaceType::SEMI_SPACE: 80 flags = RegionSpaceFlag::IN_YOUNG_SPACE; 81 break; 82 case MemSpaceType::HUGE_OBJECT_SPACE: 83 flags = RegionSpaceFlag::IN_HUGE_OBJECT_SPACE; 84 break; 85 case MemSpaceType::MACHINE_CODE_SPACE: 86 flags = RegionSpaceFlag::IN_MACHINE_CODE_SPACE; 87 break; 88 case MemSpaceType::HUGE_MACHINE_CODE_SPACE: 89 flags = RegionSpaceFlag::IN_HUGE_MACHINE_CODE_SPACE; 90 break; 91 case MemSpaceType::NON_MOVABLE: 92 flags = RegionSpaceFlag::IN_NON_MOVABLE_SPACE; 93 break; 94 case MemSpaceType::SNAPSHOT_SPACE: 95 flags = RegionSpaceFlag::IN_SNAPSHOT_SPACE; 96 break; 97 case MemSpaceType::READ_ONLY_SPACE: 98 flags = RegionSpaceFlag::IN_READ_ONLY_SPACE; 99 break; 100 case MemSpaceType::APPSPAWN_SPACE: 101 flags = RegionSpaceFlag::IN_APPSPAWN_SPACE; 102 break; 103 case MemSpaceType::SHARED_APPSPAWN_SPACE: 104 flags = RegionSpaceFlag::IN_SHARED_APPSPAWN_SPACE; 105 break; 106 case MemSpaceType::SHARED_NON_MOVABLE: 107 flags = RegionSpaceFlag::IN_SHARED_NON_MOVABLE; 108 break; 109 case MemSpaceType::SHARED_OLD_SPACE: 110 case MemSpaceType::SHARED_LOCAL_SPACE: 111 case MemSpaceType::SHARED_COMPRESS_SPACE: 112 flags = RegionSpaceFlag::IN_SHARED_OLD_SPACE; 113 break; 114 case MemSpaceType::SHARED_READ_ONLY_SPACE: 115 flags = RegionSpaceFlag::IN_SHARED_READ_ONLY_SPACE; 116 break; 117 case MemSpaceType::SHARED_HUGE_OBJECT_SPACE: 118 flags = RegionSpaceFlag::IN_SHARED_HUGE_OBJECT_SPACE; 119 break; 120 default: 121 LOG_ECMA(FATAL) << "this branch is unreachable"; 122 UNREACHABLE(); 123 break; 124 } 125 return flags; 126 } 127 } // namespace panda::ecmascript 128 #endif // ECMASCRIPT_MEM_SPACE_INL_H 129