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 LOG_ECMA_MEM(DEBUG) << "EnumerateRegions with " << ToSpaceTypeName(spaceType_) << " space"; 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)61void Space::EnumerateRegionsWithRecord(const Callback &cb) const 62 { 63 if (recordRegion_ != nullptr) { 64 EnumerateRegions(cb, recordRegion_); 65 } 66 } 67 GetRegionFlag()68RegionSpaceFlag 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::SEMI_SPACE: 77 flags = RegionSpaceFlag::IN_YOUNG_SPACE; 78 break; 79 case MemSpaceType::HUGE_OBJECT_SPACE: 80 flags = RegionSpaceFlag::IN_HUGE_OBJECT_SPACE; 81 break; 82 case MemSpaceType::MACHINE_CODE_SPACE: 83 flags = RegionSpaceFlag::IN_MACHINE_CODE_SPACE; 84 break; 85 case MemSpaceType::NON_MOVABLE: 86 flags = RegionSpaceFlag::IN_NON_MOVABLE_SPACE; 87 break; 88 case MemSpaceType::SNAPSHOT_SPACE: 89 flags = RegionSpaceFlag::IN_SNAPSHOT_SPACE; 90 break; 91 case MemSpaceType::READ_ONLY_SPACE: 92 flags = RegionSpaceFlag::IN_READ_ONLY_SPACE; 93 break; 94 case MemSpaceType::APPSPAWN_SPACE: 95 flags = RegionSpaceFlag::IN_APPSPAWN_SPACE; 96 break; 97 default: 98 LOG_ECMA(FATAL) << "this branch is unreachable"; 99 UNREACHABLE(); 100 break; 101 } 102 return flags; 103 } 104 } // namespace panda::ecmascript 105 #endif // ECMASCRIPT_MEM_SPACE_INL_H 106