1 /*
2  * Copyright (c) 2023 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 #ifndef ECMASCRIPT_COMPILER_AOT_SNAPSHOT_AOT_SNAPSHOT_H
16 #define ECMASCRIPT_COMPILER_AOT_SNAPSHOT_AOT_SNAPSHOT_H
17 
18 #include "ecmascript/ecma_vm.h"
19 #include "ecmascript/object_factory.h"
20 #include "ecmascript/compiler/aot_snapshot/snapshot_global_data.h"
21 #include "ecmascript/compiler/bytecode_info_collector.h"
22 
23 namespace panda::ecmascript::kungfu {
24 class AOTSnapshot {
25 public:
AOTSnapshot(EcmaVM *vm)26     explicit AOTSnapshot(EcmaVM *vm)
27         : vm_(vm), factory_(vm->GetFactory()), thread_(vm_->GetJSThread()) {}
28 
Iterate(const RootVisitor &v)29     void Iterate(const RootVisitor &v)
30     {
31         snapshotData_.Iterate(v);
32     }
33 
GetSnapshotData() const34     JSTaggedValue GetSnapshotData() const
35     {
36         return snapshotData_.GetData();
37     }
38 
StoreSymbolInfo(JSHandle<TaggedArray> info)39     void StoreSymbolInfo(JSHandle<TaggedArray> info)
40     {
41         snapshotData_.StoreSymbolInfo(info);
42     }
43 
GetSymbolInfo() const44     JSTaggedValue GetSymbolInfo() const
45     {
46         return snapshotData_.GetSymbolInfo();
47     }
48 
StoreHClassInfo(JSHandle<TaggedArray> info)49     void StoreHClassInfo(JSHandle<TaggedArray> info)
50     {
51         snapshotData_.StoreHClassInfo(info);
52     }
53 
StoreArrayInfo(JSHandle<TaggedArray> info)54     void StoreArrayInfo(JSHandle<TaggedArray> info)
55     {
56         snapshotData_.StoreArrayInfo(info);
57     }
58 
StoreProtoTransTableInfo(JSHandle<JSTaggedValue> info)59     void StoreProtoTransTableInfo(JSHandle<JSTaggedValue> info)
60     {
61         snapshotData_.StoreProtoTransTableInfo(info);
62     }
63 
GetArrayInfo()64     JSTaggedValue GetArrayInfo()
65     {
66         return snapshotData_.GetArrayInfo();
67     }
68 
StoreConstantIndexInfo(JSHandle<TaggedArray> info)69     void StoreConstantIndexInfo(JSHandle<TaggedArray> info)
70     {
71         snapshotData_.StoreConstantIndexInfo(info);
72     }
73 
74     void InitSnapshot(uint32_t compileFilesCount);
75 
76     void PUBLIC_API StoreConstantPoolInfo(BytecodeInfoCollector *bcInfoCollector);
77 
ResolveSnapshotData(const CMap<std::pair<std::string, uint32_t>, uint32_t> &methodToEntryIndexMap)78     void ResolveSnapshotData(const CMap<std::pair<std::string, uint32_t>, uint32_t> &methodToEntryIndexMap)
79     {
80         snapshotData_.ResolveSnapshotData(thread_, methodToEntryIndexMap);
81     }
82 
83 private:
84     JSHandle<ConstantPool> NewSnapshotConstantPool(uint32_t cacheSize);
85 
86     void GenerateSnapshotConstantPools(
87         const CMap<int32_t, JSTaggedValue> &allConstantPools, const CString &fileName, uint32_t fileIndex);
88 
89     EcmaVM *vm_ {nullptr};
90     ObjectFactory *factory_ {nullptr};
91     JSThread *thread_ {nullptr};
92     SnapshotGlobalData snapshotData_ {};
93 };
94 }  // panda::ecmascript::kungfu
95 #endif // ECMASCRIPT_COMPILER_AOT_SNAPSHOT_AOT_SNAPSHOT_H
96