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
21namespace panda::ecmascript {
22void 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
31void 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
39template<class Callback>
40void 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
60template<class Callback>
61void Space::EnumerateRegionsWithRecord(const Callback &cb) const
62{
63    if (recordRegion_ != nullptr) {
64        EnumerateRegions(cb, recordRegion_);
65    }
66}
67
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::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