• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021-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 #ifndef PANDA_RUNTIME_PANDA_VM_H_
16 #define PANDA_RUNTIME_PANDA_VM_H_
17 
18 #include "include/coretypes/string.h"
19 #include "include/runtime_options.h"
20 #include "runtime/include/mem/panda_containers.h"
21 #include "runtime/include/mem/panda_string.h"
22 #include "runtime/include/method.h"
23 #include "runtime/include/runtime.h"
24 #include "runtime/mem/gc/gc_phase.h"
25 
26 #include "libpandabase/utils/expected.h"
27 
28 namespace panda {
29 
30 class ManagedThread;
31 class StringTable;
32 class ThreadManager;
33 
34 namespace compiler {
35 class RuntimeInterface;
36 }  // namespace compiler
37 
38 namespace mem {
39 class HeapManager;
40 class GC;
41 class GCTrigger;
42 class ReferenceProcessor;
43 }  // namespace mem
44 
45 enum class PandaVMType : size_t { ECMA_VM };  // Deprecated. Only for Compability with ets_runtime.
46 
47 class PandaVM {
48 public:
49     static PandaVM *Create(Runtime *runtime, const RuntimeOptions &options, std::string_view runtime_type);
50 
51     PandaVM() = default;
52     virtual ~PandaVM() = default;
53 
GetCurrent()54     static PandaVM *GetCurrent()
55     {
56         ASSERT(Thread::GetCurrent() != nullptr);
57         return Thread::GetCurrent()->GetVM();
58     }
59 
ResolveString(const panda_file::File & pf,panda_file::File::EntityId id)60     virtual coretypes::String *ResolveString([[maybe_unused]] const panda_file::File &pf,
61                                              [[maybe_unused]] panda_file::File::EntityId id)
62     {
63         return nullptr;
64     }
65     virtual bool Initialize() = 0;
66     virtual bool InitializeFinish() = 0;
67     virtual void PreStartup() = 0;
68     virtual void PreZygoteFork() = 0;
69     virtual void PostZygoteFork() = 0;
70     virtual void InitializeGC() = 0;
71     virtual void StartGC() = 0;
72     virtual void StopGC() = 0;
73     virtual void VisitVmRoots(const GCRootVisitor &visitor) = 0;
74     virtual void UpdateVmRefs() = 0;
75     virtual void UninitializeThreads() = 0;
76 
77     virtual Expected<int, Runtime::Error> InvokeEntrypoint(Method *entrypoint, const std::vector<std::string> &args);
78 
79     // NOLINTNEXTLINE(performance-unnecessary-value-param)
HandleReferences(const GCTask & task,const mem::GC::ReferenceClearPredicateT & pred)80     virtual void HandleReferences([[maybe_unused]] const GCTask &task,
81                                   [[maybe_unused]] const mem::GC::ReferenceClearPredicateT &pred)
82     {
83     }
HandleEnqueueReferences()84     virtual void HandleEnqueueReferences() {}
HandleGCFinished()85     virtual void HandleGCFinished() {}
86     virtual void HandleLdaStr(Frame *frame, BytecodeId string_id);
HandleReturnFrame()87     virtual void HandleReturnFrame() {}
88 
89     virtual mem::GCStats *GetGCStats() const = 0;
90     virtual mem::HeapManager *GetHeapManager() const = 0;
91     virtual mem::GC *GetGC() const = 0;
92     virtual mem::GCTrigger *GetGCTrigger() const = 0;
93     virtual const RuntimeOptions &GetOptions() const = 0;
94     virtual ManagedThread *GetAssociatedThread() const = 0;
95     virtual StringTable *GetStringTable() const = 0;
96     virtual mem::MemStatsType *GetMemStats() const = 0;
97     virtual Rendezvous *GetRendezvous() const = 0;
98     virtual mem::GlobalObjectStorage *GetGlobalObjectStorage() const = 0;
99     virtual MonitorPool *GetMonitorPool() const = 0;
100     virtual ThreadManager *GetThreadManager() const = 0;
GetCompilerRuntimeInterface()101     virtual compiler::RuntimeInterface *GetCompilerRuntimeInterface() const
102     {
103         return nullptr;
104     }
VisitStringTable(const StringTable::StringVisitor & visitor,mem::VisitGCRootFlags flags)105     virtual void VisitStringTable(const StringTable::StringVisitor &visitor, mem::VisitGCRootFlags flags)
106     {
107         GetStringTable()->VisitRoots(visitor, flags);
108     }
109 
SweepStringTable(const GCObjectVisitor & gc_object_visitor)110     virtual void SweepStringTable(const GCObjectVisitor &gc_object_visitor)
111     {
112         GetStringTable()->Sweep(gc_object_visitor);
113     }
114 
UpdateMovedStrings()115     virtual bool UpdateMovedStrings()
116     {
117         return GetStringTable()->UpdateMoved();
118     }
119 
120     // TODO(maksenov): remove this method after fixing interpreter performance
GetPandaVMType()121     virtual PandaVMType GetPandaVMType() const
122     {
123         // Deprecated. Only for Compability with ets_runtime.
124         return PandaVMType::ECMA_VM;
125     }
126 
127     virtual LanguageContext GetLanguageContext() const = 0;
128     virtual CompilerInterface *GetCompiler() const = 0;
129 
130     virtual panda::mem::ReferenceProcessor *GetReferenceProcessor() const = 0;
131 
132     virtual ObjectHeader *GetOOMErrorObject() = 0;
133 
RegisterSignalHandlers()134     virtual void RegisterSignalHandlers() {};
135 
DumpForSigQuit(std::ostream & os)136     virtual void DumpForSigQuit([[maybe_unused]] std::ostream &os) const {};
137 
138     virtual std::unique_ptr<const panda_file::File> OpenPandaFile(std::string_view location);
139 
ResolveStringFromCompiledCode(const panda_file::File & pf,panda_file::File::EntityId id)140     virtual coretypes::String *ResolveStringFromCompiledCode(const panda_file::File &pf, panda_file::File::EntityId id)
141     {
142         return ResolveString(pf, id);
143     }
144 
145     virtual coretypes::String *GetNonMovableString(const panda_file::File &pf, panda_file::File::EntityId id) const;
146 
GetFrameExtSize()147     uint32_t GetFrameExtSize() const
148     {
149         return frame_ext_size;
150     }
151 
152     virtual bool ShouldEnableDebug();
153 
LoadDebuggerAgent()154     void LoadDebuggerAgent()
155     {
156         debugger_agent_ = CreateDebuggerAgent();
157     }
158 
UnloadDebuggerAgent()159     void UnloadDebuggerAgent()
160     {
161         debugger_agent_.reset();
162     }
163 
164     NO_MOVE_SEMANTIC(PandaVM);
165     NO_COPY_SEMANTIC(PandaVM);
166 
167 protected:
168     virtual bool CheckEntrypointSignature(Method *entrypoint) = 0;
169     virtual Expected<int, Runtime::Error> InvokeEntrypointImpl(Method *entrypoint,
170                                                                const std::vector<std::string> &args) = 0;
171     virtual void HandleUncaughtException() = 0;
172 
SetFrameExtSize(uint32_t size)173     void SetFrameExtSize(uint32_t size)
174     {
175         frame_ext_size = size;
176     }
177 
178     virtual LoadableAgentHandle CreateDebuggerAgent();
179 
180 private:
181     uint32_t frame_ext_size {EmptyExtFrameDataSize};
182     LoadableAgentHandle debugger_agent_;
183 };
184 
185 }  // namespace panda
186 
187 #endif  // PANDA_RUNTIME_PANDA_VM_H_
188