• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     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)30 void 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)39 void 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)60 void Space::EnumerateRegionsWithRecord(const Callback &cb) const
61 {
62     if (recordRegion_ != nullptr) {
63         EnumerateRegions(cb, recordRegion_);
64     }
65 }
66 
GetRegionFlag()67 RegionSpaceFlag 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