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 if (recordRegion_ != nullptr) { 63 EnumerateRegions(cb, recordRegion_); 64 } 65 } 66 GetRegionFlag()67RegionSpaceFlag Space::GetRegionFlag() const 68 { 69 RegionSpaceFlag flags = RegionSpaceFlag::UNINITIALIZED; 70 switch (spaceType_) { 71 case MemSpaceType::OLD_SPACE: 72 case MemSpaceType::LOCAL_SPACE: 73 flags = RegionSpaceFlag::IN_OLD_SPACE; 74 break; 75 case MemSpaceType::SEMI_SPACE: 76 flags = RegionSpaceFlag::IN_YOUNG_SPACE; 77 break; 78 case MemSpaceType::HUGE_OBJECT_SPACE: 79 flags = RegionSpaceFlag::IN_HUGE_OBJECT_SPACE; 80 break; 81 case MemSpaceType::MACHINE_CODE_SPACE: 82 flags = RegionSpaceFlag::IN_MACHINE_CODE_SPACE; 83 break; 84 case MemSpaceType::HUGE_MACHINE_CODE_SPACE: 85 flags = RegionSpaceFlag::IN_HUGE_MACHINE_CODE_SPACE; 86 break; 87 case MemSpaceType::NON_MOVABLE: 88 flags = RegionSpaceFlag::IN_NON_MOVABLE_SPACE; 89 break; 90 case MemSpaceType::SNAPSHOT_SPACE: 91 flags = RegionSpaceFlag::IN_SNAPSHOT_SPACE; 92 break; 93 case MemSpaceType::READ_ONLY_SPACE: 94 flags = RegionSpaceFlag::IN_READ_ONLY_SPACE; 95 break; 96 case MemSpaceType::APPSPAWN_SPACE: 97 flags = RegionSpaceFlag::IN_APPSPAWN_SPACE; 98 break; 99 default: 100 LOG_ECMA(FATAL) << "this branch is unreachable"; 101 UNREACHABLE(); 102 break; 103 } 104 return flags; 105 } 106 } // namespace panda::ecmascript 107 #endif // ECMASCRIPT_MEM_SPACE_INL_H 108