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)22 void 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)31 void 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) const40 void 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) const61 void Space::EnumerateRegionsWithRecord(const Callback &cb) const
62 {
63     if (recordRegion_ != nullptr) {
64         EnumerateRegions(cb, recordRegion_);
65     }
66 }
67 
GetRegionFlag() const68 RegionSpaceFlag 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