14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_JSPANDAFILE_JS_PANDAFILE_MANAGER_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_JSPANDAFILE_JS_PANDAFILE_MANAGER_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/js_pandafile.h" 204514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/panda_file_translator.h" 214514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/debug_info_extractor.h" 224514f5e3Sopenharmony_ci#include "ecmascript/platform/mutex.h" 234514f5e3Sopenharmony_ci 244514f5e3Sopenharmony_cinamespace panda { 254514f5e3Sopenharmony_cinamespace ecmascript { 264514f5e3Sopenharmony_ciclass Program; 274514f5e3Sopenharmony_ci 284514f5e3Sopenharmony_ciclass PUBLIC_API JSPandaFileManager { 294514f5e3Sopenharmony_cipublic: 304514f5e3Sopenharmony_ci static JSPandaFileManager *GetInstance(); 314514f5e3Sopenharmony_ci 324514f5e3Sopenharmony_ci ~JSPandaFileManager(); 334514f5e3Sopenharmony_ci 344514f5e3Sopenharmony_ci JSHandle<Program> GenerateProgram(EcmaVM *vm, const JSPandaFile *jsPandaFile, std::string_view entryPoint); 354514f5e3Sopenharmony_ci 364514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> LoadJSPandaFile(JSThread *thread, const CString &filename, std::string_view entryPoint, 374514f5e3Sopenharmony_ci bool needUpdate = false); 384514f5e3Sopenharmony_ci 394514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> LoadJSPandaFile(JSThread *thread, const CString &filename, std::string_view entryPoint, 404514f5e3Sopenharmony_ci const void *buffer, size_t size, bool needUpdate = false); 414514f5e3Sopenharmony_ci 424514f5e3Sopenharmony_ci // load pandafile from secure mem 434514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> LoadJSPandaFileSecure(JSThread *thread, const CString &filename, 444514f5e3Sopenharmony_ci std::string_view entryPoint, uint8_t *buffer, size_t size, 454514f5e3Sopenharmony_ci bool needUpdate = false); 464514f5e3Sopenharmony_ci 474514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> OpenJSPandaFile(const CString &filename); 484514f5e3Sopenharmony_ci 494514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> OpenJSPandaFile(const CString &filename, const CString &desc); 504514f5e3Sopenharmony_ci 514514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> OpenJSPandaFileFromBuffer(uint8_t *buffer, size_t size, const CString &filename); 524514f5e3Sopenharmony_ci 534514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> NewJSPandaFile(const panda_file::File *pf, const CString &desc); 544514f5e3Sopenharmony_ci 554514f5e3Sopenharmony_ci DebugInfoExtractor *GetJSPtExtractor(const JSPandaFile *jsPandaFile); 564514f5e3Sopenharmony_ci 574514f5e3Sopenharmony_ci DebugInfoExtractor *GetJSPtExtractorAndExtract(const JSPandaFile *jsPandaFile); 584514f5e3Sopenharmony_ci 594514f5e3Sopenharmony_ci DebugInfoExtractor *CpuProfilerGetJSPtExtractor(const JSPandaFile *jsPandaFile); 604514f5e3Sopenharmony_ci 614514f5e3Sopenharmony_ci bool CheckFilePath(JSThread *thread, const CString &fileName); 624514f5e3Sopenharmony_ci 634514f5e3Sopenharmony_ci // for debugger 644514f5e3Sopenharmony_ci template<typename Callback> 654514f5e3Sopenharmony_ci void EnumerateJSPandaFiles(Callback cb) 664514f5e3Sopenharmony_ci { 674514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 684514f5e3Sopenharmony_ci for (const auto &item : loadedJSPandaFiles_) { 694514f5e3Sopenharmony_ci if (!cb(item.second)) { 704514f5e3Sopenharmony_ci return; 714514f5e3Sopenharmony_ci } 724514f5e3Sopenharmony_ci } 734514f5e3Sopenharmony_ci for (const auto &item : oldJSPandaFiles_) { 744514f5e3Sopenharmony_ci if (!cb(item)) { 754514f5e3Sopenharmony_ci return; 764514f5e3Sopenharmony_ci } 774514f5e3Sopenharmony_ci } 784514f5e3Sopenharmony_ci } 794514f5e3Sopenharmony_ci 804514f5e3Sopenharmony_ci template<typename Callback> 814514f5e3Sopenharmony_ci void EnumerateNonVirtualJSPandaFiles(Callback cb) 824514f5e3Sopenharmony_ci { 834514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 844514f5e3Sopenharmony_ci for (const auto &item : loadedJSPandaFiles_) { 854514f5e3Sopenharmony_ci if (!cb(item.second)) { 864514f5e3Sopenharmony_ci return; 874514f5e3Sopenharmony_ci } 884514f5e3Sopenharmony_ci } 894514f5e3Sopenharmony_ci for (const auto &item : oldJSPandaFiles_) { 904514f5e3Sopenharmony_ci if (!cb(item)) { 914514f5e3Sopenharmony_ci return; 924514f5e3Sopenharmony_ci } 934514f5e3Sopenharmony_ci } 944514f5e3Sopenharmony_ci } 954514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> FindJSPandaFileByNormalizedName(const CString &normalizedName); 964514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> FindJSPandaFileByMapBase(uintptr_t mapBase); 974514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> FindJSPandaFile(const CString &filename); 984514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> FindMergedJSPandaFile(); 994514f5e3Sopenharmony_ci void AddJSPandaFile(const std::shared_ptr<JSPandaFile> &jsPandaFile); 1004514f5e3Sopenharmony_ci void RemoveJSPandaFile(const JSPandaFile *jsPandaFile); 1014514f5e3Sopenharmony_ci void ClearNameMap(); 1024514f5e3Sopenharmony_ciprivate: 1034514f5e3Sopenharmony_ci JSPandaFileManager() = default; 1044514f5e3Sopenharmony_ci 1054514f5e3Sopenharmony_ci class JSPandaFileAllocator { 1064514f5e3Sopenharmony_ci public: 1074514f5e3Sopenharmony_ci static void *AllocateBuffer(size_t size); 1084514f5e3Sopenharmony_ci static void FreeBuffer(void *mem); 1094514f5e3Sopenharmony_ci }; 1104514f5e3Sopenharmony_ci 1114514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> GenerateJSPandaFile(JSThread *thread, const panda_file::File *pf, const CString &desc, 1124514f5e3Sopenharmony_ci std::string_view entryPoint); 1134514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> GetJSPandaFile(const panda_file::File *pf); 1144514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> FindJSPandaFileWithChecksum(const CString &filename, uint32_t checksum); 1154514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> FindJSPandaFileUnlocked(const CString &filename); 1164514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> GenerateJSPandafileFromBufferCache(JSThread *thread, 1174514f5e3Sopenharmony_ci const CString &filename, 1184514f5e3Sopenharmony_ci std::string_view entryPoint); 1194514f5e3Sopenharmony_ci void ObsoleteLoadedJSPandaFile(const CString &filename); 1204514f5e3Sopenharmony_ci 1214514f5e3Sopenharmony_ci static void *AllocateBuffer(size_t size); 1224514f5e3Sopenharmony_ci static void FreeBuffer(void *mem); 1234514f5e3Sopenharmony_ci 1244514f5e3Sopenharmony_ci RecursiveMutex jsPandaFileLock_; 1254514f5e3Sopenharmony_ci // JSPandaFile was shared by all vm. 1264514f5e3Sopenharmony_ci std::unordered_map<const CString, std::shared_ptr<JSPandaFile>, CStringHash> loadedJSPandaFiles_; 1274514f5e3Sopenharmony_ci // for plugin update. 1284514f5e3Sopenharmony_ci std::set<std::shared_ptr<JSPandaFile>> oldJSPandaFiles_; 1294514f5e3Sopenharmony_ci std::unordered_map<const JSPandaFile *, std::unique_ptr<DebugInfoExtractor>> extractors_; 1304514f5e3Sopenharmony_ci 1314514f5e3Sopenharmony_ci friend class JSPandaFile; 1324514f5e3Sopenharmony_ci}; 1334514f5e3Sopenharmony_ci} // namespace ecmascript 1344514f5e3Sopenharmony_ci} // namespace panda 1354514f5e3Sopenharmony_ci#endif // ECMASCRIPT_JSPANDAFILE_JS_PANDAFILE_MANAGER_H 136