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