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 LOG_ECMA_MEM(DEBUG) << "Add region:" << region << " to " << ToSpaceTypeName(spaceType_); 25 regionList_.AddNode(region); 26 IncreaseCommitted(region->GetCapacity()); 27 IncreaseObjectSize(region->GetSize()); 28 } 29 RemoveRegion(Region * region)30void Space::RemoveRegion(Region *region) 31 { 32 LOG_ECMA_MEM(DEBUG) << "Remove region:" << region << " to " << ToSpaceTypeName(spaceType_); 33 regionList_.RemoveNode(region); 34 DecreaseCommitted(region->GetCapacity()); 35 DecreaseObjectSize(region->GetSize()); 36 } 37 38 template<class Callback> EnumerateRegions(const Callback & cb,Region * end)39void Space::EnumerateRegions(const Callback &cb, Region *end) const 40 { 41 Region *current = regionList_.GetFirst(); 42 if (current == nullptr) { 43 return; 44 } 45 if (end == nullptr) { 46 end = regionList_.GetLast(); 47 } 48 while (current != end) { 49 auto next = current->GetNext(); 50 cb(current); 51 current = next; 52 } 53 54 if (current != nullptr) { 55 cb(current); 56 } 57 } 58 59 template<class Callback> EnumerateRegionsWithRecord(const Callback & cb)60void Space::EnumerateRegionsWithRecord(const Callback &cb) const 61 { 62 EnumerateRegions(cb, recordRegion_); 63 } 64 GetRegionFlag()65RegionSpaceFlag Space::GetRegionFlag() const 66 { 67 RegionSpaceFlag flags = RegionSpaceFlag::UNINITIALIZED; 68 switch (spaceType_) { 69 case MemSpaceType::OLD_SPACE: 70 case MemSpaceType::LOCAL_SPACE: 71 flags = RegionSpaceFlag::IN_OLD_SPACE; 72 break; 73 case MemSpaceType::SEMI_SPACE: 74 flags = RegionSpaceFlag::IN_YOUNG_SPACE; 75 break; 76 case MemSpaceType::HUGE_OBJECT_SPACE: 77 flags = RegionSpaceFlag::IN_HUGE_OBJECT_SPACE; 78 break; 79 case MemSpaceType::MACHINE_CODE_SPACE: 80 flags = RegionSpaceFlag::IN_MACHINE_CODE_SPACE; 81 break; 82 case MemSpaceType::NON_MOVABLE: 83 flags = RegionSpaceFlag::IN_NON_MOVABLE_SPACE; 84 break; 85 case MemSpaceType::SNAPSHOT_SPACE: 86 flags = RegionSpaceFlag::IN_SNAPSHOT_SPACE; 87 break; 88 case MemSpaceType::READ_ONLY_SPACE: 89 flags = RegionSpaceFlag::IN_READ_ONLY_SPACE; 90 break; 91 case MemSpaceType::APPSPAWN_SPACE: 92 flags = RegionSpaceFlag::IN_APPSPAWN_SPACE; 93 break; 94 default: 95 UNREACHABLE(); 96 break; 97 } 98 return flags; 99 } 100 } // namespace panda::ecmascript 101 #endif // ECMASCRIPT_MEM_SPACE_INL_H 102