14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2024 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#include "ecmascript/jspandafile/js_pandafile_manager.h" 174514f5e3Sopenharmony_ci 184514f5e3Sopenharmony_ci#include "ecmascript/checkpoint/thread_state_transition.h" 194514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/abc_buffer_cache.h" 204514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/js_pandafile_executor.h" 214514f5e3Sopenharmony_ci#include "ecmascript/module/module_path_helper.h" 224514f5e3Sopenharmony_ci#include "ecmascript/module/module_message_helper.h" 234514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler_manager.h" 244514f5e3Sopenharmony_ci 254514f5e3Sopenharmony_cinamespace panda::ecmascript { 264514f5e3Sopenharmony_ciusing PGOProfilerManager = pgo::PGOProfilerManager; 274514f5e3Sopenharmony_cistatic const size_t MALLOC_SIZE_LIMIT = 2147483648; // Max internal memory used by the VM declared in options 284514f5e3Sopenharmony_ci 294514f5e3Sopenharmony_ciJSPandaFileManager *JSPandaFileManager::GetInstance() 304514f5e3Sopenharmony_ci{ 314514f5e3Sopenharmony_ci static JSPandaFileManager *jsFileManager = new JSPandaFileManager(); 324514f5e3Sopenharmony_ci return jsFileManager; 334514f5e3Sopenharmony_ci} 344514f5e3Sopenharmony_ci 354514f5e3Sopenharmony_ciJSPandaFileManager::~JSPandaFileManager() 364514f5e3Sopenharmony_ci{ 374514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 384514f5e3Sopenharmony_ci extractors_.clear(); 394514f5e3Sopenharmony_ci oldJSPandaFiles_.clear(); 404514f5e3Sopenharmony_ci loadedJSPandaFiles_.clear(); 414514f5e3Sopenharmony_ci} 424514f5e3Sopenharmony_ci 434514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::LoadJSPandaFile(JSThread *thread, const CString &filename, 444514f5e3Sopenharmony_ci std::string_view entryPoint, bool needUpdate) 454514f5e3Sopenharmony_ci{ 464514f5e3Sopenharmony_ci { 474514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 484514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile; 494514f5e3Sopenharmony_ci if (needUpdate) { 504514f5e3Sopenharmony_ci auto pf = panda_file::OpenPandaFileOrZip(filename, panda_file::File::READ_WRITE); 514514f5e3Sopenharmony_ci if (pf == nullptr) { 524514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "open file " << filename << " error"; 534514f5e3Sopenharmony_ci return nullptr; 544514f5e3Sopenharmony_ci } 554514f5e3Sopenharmony_ci jsPandaFile = FindJSPandaFileWithChecksum(filename, pf->GetHeader()->checksum); 564514f5e3Sopenharmony_ci } else { 574514f5e3Sopenharmony_ci jsPandaFile = FindJSPandaFileUnlocked(filename); 584514f5e3Sopenharmony_ci if (jsPandaFile == nullptr) { 594514f5e3Sopenharmony_ci jsPandaFile = GenerateJSPandafileFromBufferCache(thread, filename, entryPoint); 604514f5e3Sopenharmony_ci } 614514f5e3Sopenharmony_ci } 624514f5e3Sopenharmony_ci if (jsPandaFile != nullptr) { 634514f5e3Sopenharmony_ci return jsPandaFile; 644514f5e3Sopenharmony_ci } 654514f5e3Sopenharmony_ci } 664514f5e3Sopenharmony_ci 674514f5e3Sopenharmony_ci EcmaVM *vm = thread->GetEcmaVM(); 684514f5e3Sopenharmony_ci ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager(); 694514f5e3Sopenharmony_ci std::unique_ptr<const panda_file::File> pf; 704514f5e3Sopenharmony_ci if (!vm->IsBundlePack() && moduleManager->GetExecuteMode() == ModuleExecuteMode::ExecuteBufferMode && 714514f5e3Sopenharmony_ci !vm->IsRestrictedWorkerThread()) { 724514f5e3Sopenharmony_ci ResolveBufferCallback resolveBufferCallback = vm->GetResolveBufferCallback(); 734514f5e3Sopenharmony_ci if (resolveBufferCallback == nullptr) { 744514f5e3Sopenharmony_ci#if defined(PANDA_TARGET_WINDOWS) || defined(PANDA_TARGET_MACOS) 754514f5e3Sopenharmony_ci LOG_NO_TAG(ERROR) << "[ArkRuntime Log] Importing shared package is not supported in the Previewer."; 764514f5e3Sopenharmony_ci#endif 774514f5e3Sopenharmony_ci LOG_FULL(FATAL) << "resolveBufferCallback is nullptr"; 784514f5e3Sopenharmony_ci return nullptr; 794514f5e3Sopenharmony_ci } 804514f5e3Sopenharmony_ci std::string hspPath = ModulePathHelper::ParseHapPath(filename); 814514f5e3Sopenharmony_ci if (hspPath.empty()) { 824514f5e3Sopenharmony_ci LOG_FULL(ERROR) << ModuleMessageHelper::VmModuleInfoMessage(thread); 834514f5e3Sopenharmony_ci if (!thread->IsMainThread()) { 844514f5e3Sopenharmony_ci CString msg = "Invalid input hsp path: " + filename; 854514f5e3Sopenharmony_ci THROW_TYPE_ERROR_AND_RETURN(thread, msg.c_str(), nullptr); 864514f5e3Sopenharmony_ci } 874514f5e3Sopenharmony_ci LOG_FULL(FATAL) << "Invalid input hsp path: " << filename; 884514f5e3Sopenharmony_ci return nullptr; 894514f5e3Sopenharmony_ci } 904514f5e3Sopenharmony_ci uint8_t *data = nullptr; 914514f5e3Sopenharmony_ci size_t dataSize = 0; 924514f5e3Sopenharmony_ci std::string errorMsg; 934514f5e3Sopenharmony_ci bool getBuffer = resolveBufferCallback(hspPath, &data, &dataSize, errorMsg); 944514f5e3Sopenharmony_ci if (!getBuffer) { 954514f5e3Sopenharmony_ci#if defined(PANDA_TARGET_WINDOWS) || defined(PANDA_TARGET_MACOS) 964514f5e3Sopenharmony_ci LOG_NO_TAG(INFO) << "[ArkRuntime Log] Importing shared package in the Previewer."; 974514f5e3Sopenharmony_ci#endif 984514f5e3Sopenharmony_ci LOG_FULL(FATAL) << "resolveBufferCallback get hsp buffer failed, hsp path:" << filename 994514f5e3Sopenharmony_ci << ", errorMsg:" << errorMsg; 1004514f5e3Sopenharmony_ci return nullptr; 1014514f5e3Sopenharmony_ci } 1024514f5e3Sopenharmony_ci#if defined(PANDA_TARGET_ANDROID) || defined(PANDA_TARGET_IOS) 1034514f5e3Sopenharmony_ci pf = panda_file::OpenPandaFileFromMemory(data, dataSize); 1044514f5e3Sopenharmony_ci#else 1054514f5e3Sopenharmony_ci pf = panda_file::OpenPandaFileFromSecureMemory(data, dataSize); 1064514f5e3Sopenharmony_ci#endif 1074514f5e3Sopenharmony_ci } else if (vm->IsRestrictedWorkerThread()) { 1084514f5e3Sopenharmony_ci // ReadOnly 1094514f5e3Sopenharmony_ci pf = panda_file::OpenPandaFileOrZip(filename); 1104514f5e3Sopenharmony_ci } else { 1114514f5e3Sopenharmony_ci pf = panda_file::OpenPandaFileOrZip(filename, panda_file::File::READ_WRITE); 1124514f5e3Sopenharmony_ci } 1134514f5e3Sopenharmony_ci 1144514f5e3Sopenharmony_ci if (pf == nullptr) { 1154514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "open file " << filename << " error"; 1164514f5e3Sopenharmony_ci return nullptr; 1174514f5e3Sopenharmony_ci } 1184514f5e3Sopenharmony_ci 1194514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile = GenerateJSPandaFile(thread, pf.release(), filename, entryPoint); 1204514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER) 1214514f5e3Sopenharmony_ci if (thread->GetIsProfiling()) { 1224514f5e3Sopenharmony_ci GetJSPtExtractorAndExtract(jsPandaFile.get()); 1234514f5e3Sopenharmony_ci } 1244514f5e3Sopenharmony_ci#endif 1254514f5e3Sopenharmony_ci return jsPandaFile; 1264514f5e3Sopenharmony_ci} 1274514f5e3Sopenharmony_ci 1284514f5e3Sopenharmony_ci// The security interface needs to be modified accordingly. 1294514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::LoadJSPandaFile(JSThread *thread, const CString &filename, 1304514f5e3Sopenharmony_ci std::string_view entryPoint, const void *buffer, size_t size, bool needUpdate) 1314514f5e3Sopenharmony_ci{ 1324514f5e3Sopenharmony_ci if (buffer == nullptr || size == 0) { 1334514f5e3Sopenharmony_ci LOG_FULL(ERROR) << "Input buffer is empty"; 1344514f5e3Sopenharmony_ci return nullptr; 1354514f5e3Sopenharmony_ci } 1364514f5e3Sopenharmony_ci { 1374514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 1384514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile; 1394514f5e3Sopenharmony_ci if (needUpdate) { 1404514f5e3Sopenharmony_ci auto pf = panda_file::OpenPandaFileFromMemory(buffer, size); 1414514f5e3Sopenharmony_ci if (pf == nullptr) { 1424514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "open file buffer " << filename << " error"; 1434514f5e3Sopenharmony_ci return nullptr; 1444514f5e3Sopenharmony_ci } 1454514f5e3Sopenharmony_ci jsPandaFile = FindJSPandaFileWithChecksum(filename, pf->GetHeader()->checksum); 1464514f5e3Sopenharmony_ci } else { 1474514f5e3Sopenharmony_ci jsPandaFile = FindJSPandaFileUnlocked(filename); 1484514f5e3Sopenharmony_ci } 1494514f5e3Sopenharmony_ci if (jsPandaFile != nullptr) { 1504514f5e3Sopenharmony_ci return jsPandaFile; 1514514f5e3Sopenharmony_ci } 1524514f5e3Sopenharmony_ci } 1534514f5e3Sopenharmony_ci#if defined(PANDA_TARGET_PREVIEW) 1544514f5e3Sopenharmony_ci auto pf = panda_file::OpenPandaFileFromMemory(buffer, size); 1554514f5e3Sopenharmony_ci#else 1564514f5e3Sopenharmony_ci CString tag = ModulePathHelper::ParseFileNameToVMAName(filename); 1574514f5e3Sopenharmony_ci constexpr size_t PR_SET_VMA_ANON_NAME_MAX_LEN = 80; 1584514f5e3Sopenharmony_ci constexpr size_t ANON_FLAG_LEN = 7; // [anon:] 1594514f5e3Sopenharmony_ci if (tag.length() > PR_SET_VMA_ANON_NAME_MAX_LEN - ANON_FLAG_LEN) { 1604514f5e3Sopenharmony_ci tag = CString(ModulePathHelper::VMA_NAME_ARKTS_CODE); 1614514f5e3Sopenharmony_ci } 1624514f5e3Sopenharmony_ci auto pf = panda_file::OpenPandaFileFromMemory(buffer, size, tag.c_str()); 1634514f5e3Sopenharmony_ci#endif 1644514f5e3Sopenharmony_ci if (pf == nullptr) { 1654514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "open file " << filename << " error"; 1664514f5e3Sopenharmony_ci return nullptr; 1674514f5e3Sopenharmony_ci } 1684514f5e3Sopenharmony_ci 1694514f5e3Sopenharmony_ci // JSPandaFile desc cannot be empty, if buffer with empty filename, use pf filename as a descriptor. 1704514f5e3Sopenharmony_ci const CString &desc = filename.empty() ? pf->GetFilename().c_str() : filename; 1714514f5e3Sopenharmony_ci 1724514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile = GenerateJSPandaFile(thread, pf.release(), desc, entryPoint); 1734514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER) 1744514f5e3Sopenharmony_ci if (thread->GetIsProfiling()) { 1754514f5e3Sopenharmony_ci GetJSPtExtractorAndExtract(jsPandaFile.get()); 1764514f5e3Sopenharmony_ci } 1774514f5e3Sopenharmony_ci#endif 1784514f5e3Sopenharmony_ci return jsPandaFile; 1794514f5e3Sopenharmony_ci} 1804514f5e3Sopenharmony_ci 1814514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::LoadJSPandaFileSecure(JSThread *thread, const CString &filename, 1824514f5e3Sopenharmony_ci std::string_view entryPoint, uint8_t *buffer, size_t size, bool needUpdate) 1834514f5e3Sopenharmony_ci{ 1844514f5e3Sopenharmony_ci bool enableESMTrace = thread->GetEcmaVM()->GetJSOptions().EnableESMTrace(); 1854514f5e3Sopenharmony_ci if (enableESMTrace) { 1864514f5e3Sopenharmony_ci ECMA_BYTRACE_START_TRACE(HITRACE_TAG_ARK, "JSPandaFileManager::LoadJSPandaFileSecure"); 1874514f5e3Sopenharmony_ci } 1884514f5e3Sopenharmony_ci if (buffer == nullptr || size == 0) { 1894514f5e3Sopenharmony_ci LOG_FULL(ERROR) << "Input buffer is empty"; 1904514f5e3Sopenharmony_ci return nullptr; 1914514f5e3Sopenharmony_ci } 1924514f5e3Sopenharmony_ci { 1934514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 1944514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile; 1954514f5e3Sopenharmony_ci if (needUpdate) { 1964514f5e3Sopenharmony_ci auto pf = panda_file::OpenPandaFileFromSecureMemory(buffer, size); 1974514f5e3Sopenharmony_ci if (pf == nullptr) { 1984514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "open file buffer " << filename << " error"; 1994514f5e3Sopenharmony_ci return nullptr; 2004514f5e3Sopenharmony_ci } 2014514f5e3Sopenharmony_ci jsPandaFile = FindJSPandaFileWithChecksum(filename, pf->GetHeader()->checksum); 2024514f5e3Sopenharmony_ci } else { 2034514f5e3Sopenharmony_ci jsPandaFile = FindJSPandaFileUnlocked(filename); 2044514f5e3Sopenharmony_ci } 2054514f5e3Sopenharmony_ci if (jsPandaFile != nullptr) { 2064514f5e3Sopenharmony_ci return jsPandaFile; 2074514f5e3Sopenharmony_ci } 2084514f5e3Sopenharmony_ci } 2094514f5e3Sopenharmony_ci 2104514f5e3Sopenharmony_ci auto pf = panda_file::OpenPandaFileFromSecureMemory(buffer, size); 2114514f5e3Sopenharmony_ci if (pf == nullptr) { 2124514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "open file " << filename << " error"; 2134514f5e3Sopenharmony_ci return nullptr; 2144514f5e3Sopenharmony_ci } 2154514f5e3Sopenharmony_ci 2164514f5e3Sopenharmony_ci // JSPandaFile desc cannot be empty, if buffer with empty filename, use pf filename as a descriptor. 2174514f5e3Sopenharmony_ci const CString &desc = filename.empty() ? pf->GetFilename().c_str() : filename; 2184514f5e3Sopenharmony_ci 2194514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile = GenerateJSPandaFile(thread, pf.release(), desc, entryPoint); 2204514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER) 2214514f5e3Sopenharmony_ci if (thread->GetIsProfiling()) { 2224514f5e3Sopenharmony_ci GetJSPtExtractorAndExtract(jsPandaFile.get()); 2234514f5e3Sopenharmony_ci } 2244514f5e3Sopenharmony_ci#endif 2254514f5e3Sopenharmony_ci if (enableESMTrace) { 2264514f5e3Sopenharmony_ci ECMA_BYTRACE_FINISH_TRACE(HITRACE_TAG_ARK); 2274514f5e3Sopenharmony_ci } 2284514f5e3Sopenharmony_ci return jsPandaFile; 2294514f5e3Sopenharmony_ci} 2304514f5e3Sopenharmony_ci 2314514f5e3Sopenharmony_ciJSHandle<Program> JSPandaFileManager::GenerateProgram(EcmaVM *vm, const JSPandaFile *jsPandaFile, 2324514f5e3Sopenharmony_ci std::string_view entryPoint) 2334514f5e3Sopenharmony_ci{ 2344514f5e3Sopenharmony_ci ASSERT(GetJSPandaFile(jsPandaFile->GetPandaFile()) != nullptr); 2354514f5e3Sopenharmony_ci return PandaFileTranslator::GenerateProgram(vm, jsPandaFile, entryPoint); 2364514f5e3Sopenharmony_ci} 2374514f5e3Sopenharmony_ci 2384514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::FindJSPandaFileWithChecksum(const CString &filename, uint32_t checksum) 2394514f5e3Sopenharmony_ci{ 2404514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile = FindJSPandaFileUnlocked(filename); 2414514f5e3Sopenharmony_ci if (jsPandaFile == nullptr) { 2424514f5e3Sopenharmony_ci return nullptr; 2434514f5e3Sopenharmony_ci } 2444514f5e3Sopenharmony_ci 2454514f5e3Sopenharmony_ci if (checksum == jsPandaFile->GetChecksum()) { 2464514f5e3Sopenharmony_ci return jsPandaFile; 2474514f5e3Sopenharmony_ci } 2484514f5e3Sopenharmony_ci 2494514f5e3Sopenharmony_ci LOG_FULL(INFO) << "reload " << filename << " with new checksum"; 2504514f5e3Sopenharmony_ci ObsoleteLoadedJSPandaFile(filename); 2514514f5e3Sopenharmony_ci return nullptr; 2524514f5e3Sopenharmony_ci} 2534514f5e3Sopenharmony_ci 2544514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::FindMergedJSPandaFile() 2554514f5e3Sopenharmony_ci{ 2564514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 2574514f5e3Sopenharmony_ci for (const auto &iter : loadedJSPandaFiles_) { 2584514f5e3Sopenharmony_ci const std::shared_ptr<JSPandaFile> &jsPandafile = iter.second; 2594514f5e3Sopenharmony_ci if (jsPandafile->IsFirstMergedAbc()) { 2604514f5e3Sopenharmony_ci return jsPandafile; 2614514f5e3Sopenharmony_ci } 2624514f5e3Sopenharmony_ci } 2634514f5e3Sopenharmony_ci return nullptr; 2644514f5e3Sopenharmony_ci} 2654514f5e3Sopenharmony_ci 2664514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::FindJSPandaFileUnlocked(const CString &filename) 2674514f5e3Sopenharmony_ci{ 2684514f5e3Sopenharmony_ci if (filename.empty()) { 2694514f5e3Sopenharmony_ci return nullptr; 2704514f5e3Sopenharmony_ci } 2714514f5e3Sopenharmony_ci const auto iter = loadedJSPandaFiles_.find(filename); 2724514f5e3Sopenharmony_ci if (iter == loadedJSPandaFiles_.end()) { 2734514f5e3Sopenharmony_ci return nullptr; 2744514f5e3Sopenharmony_ci } 2754514f5e3Sopenharmony_ci return iter->second; 2764514f5e3Sopenharmony_ci} 2774514f5e3Sopenharmony_ci 2784514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::FindJSPandaFileByNormalizedName(const CString &normalizedName) 2794514f5e3Sopenharmony_ci{ 2804514f5e3Sopenharmony_ci if (normalizedName.empty()) { 2814514f5e3Sopenharmony_ci return nullptr; 2824514f5e3Sopenharmony_ci } 2834514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> result; 2844514f5e3Sopenharmony_ci EnumerateJSPandaFiles([&](const std::shared_ptr<JSPandaFile> &file) -> bool { 2854514f5e3Sopenharmony_ci // normalize path inside and outside sandbox 2864514f5e3Sopenharmony_ci if (file->GetNormalizedFileDesc() == normalizedName) { 2874514f5e3Sopenharmony_ci result = file; 2884514f5e3Sopenharmony_ci return false; 2894514f5e3Sopenharmony_ci } 2904514f5e3Sopenharmony_ci return true; 2914514f5e3Sopenharmony_ci }); 2924514f5e3Sopenharmony_ci return result; 2934514f5e3Sopenharmony_ci} 2944514f5e3Sopenharmony_ci 2954514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::FindJSPandaFileByMapBase(uintptr_t mapBase) 2964514f5e3Sopenharmony_ci{ 2974514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> result; 2984514f5e3Sopenharmony_ci EnumerateJSPandaFiles([&](const std::shared_ptr<JSPandaFile> &file) -> bool { 2994514f5e3Sopenharmony_ci if (reinterpret_cast<uintptr_t>(file->GetHeader()) == mapBase) { 3004514f5e3Sopenharmony_ci result = file; 3014514f5e3Sopenharmony_ci return false; 3024514f5e3Sopenharmony_ci } 3034514f5e3Sopenharmony_ci return true; 3044514f5e3Sopenharmony_ci }); 3054514f5e3Sopenharmony_ci return result; 3064514f5e3Sopenharmony_ci} 3074514f5e3Sopenharmony_ci 3084514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::FindJSPandaFile(const CString &filename) 3094514f5e3Sopenharmony_ci{ 3104514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 3114514f5e3Sopenharmony_ci return FindJSPandaFileUnlocked(filename); 3124514f5e3Sopenharmony_ci} 3134514f5e3Sopenharmony_ci 3144514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::GetJSPandaFile(const panda_file::File *pf) 3154514f5e3Sopenharmony_ci{ 3164514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 3174514f5e3Sopenharmony_ci for (const auto &iter : loadedJSPandaFiles_) { 3184514f5e3Sopenharmony_ci const std::shared_ptr<JSPandaFile> &jsPandafile = iter.second; 3194514f5e3Sopenharmony_ci if (jsPandafile->GetPandaFile() == pf) { 3204514f5e3Sopenharmony_ci return jsPandafile; 3214514f5e3Sopenharmony_ci } 3224514f5e3Sopenharmony_ci } 3234514f5e3Sopenharmony_ci return nullptr; 3244514f5e3Sopenharmony_ci} 3254514f5e3Sopenharmony_ci 3264514f5e3Sopenharmony_civoid JSPandaFileManager::ClearNameMap() 3274514f5e3Sopenharmony_ci{ 3284514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 3294514f5e3Sopenharmony_ci for (const auto &iter : loadedJSPandaFiles_) { 3304514f5e3Sopenharmony_ci iter.second->ClearNameMap(); 3314514f5e3Sopenharmony_ci } 3324514f5e3Sopenharmony_ci} 3334514f5e3Sopenharmony_ci 3344514f5e3Sopenharmony_civoid JSPandaFileManager::AddJSPandaFile(const std::shared_ptr<JSPandaFile> &jsPandaFile) 3354514f5e3Sopenharmony_ci{ 3364514f5e3Sopenharmony_ci const auto &filename = jsPandaFile->GetJSPandaFileDesc(); 3374514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 3384514f5e3Sopenharmony_ci if (loadedJSPandaFiles_.find(filename) != loadedJSPandaFiles_.end()) { 3394514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "add failed, file already exist: " << filename; 3404514f5e3Sopenharmony_ci UNREACHABLE(); 3414514f5e3Sopenharmony_ci } 3424514f5e3Sopenharmony_ci 3434514f5e3Sopenharmony_ci loadedJSPandaFiles_[filename] = std::move(jsPandaFile); 3444514f5e3Sopenharmony_ci JSPandaFileExecutor::BindPandaFileToAot(jsPandaFile.get()); 3454514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "add file: " << filename; 3464514f5e3Sopenharmony_ci} 3474514f5e3Sopenharmony_ci 3484514f5e3Sopenharmony_civoid JSPandaFileManager::RemoveJSPandaFile(const JSPandaFile *jsPandaFile) 3494514f5e3Sopenharmony_ci{ 3504514f5e3Sopenharmony_ci if (jsPandaFile == nullptr) { 3514514f5e3Sopenharmony_ci return; 3524514f5e3Sopenharmony_ci } 3534514f5e3Sopenharmony_ci 3544514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 3554514f5e3Sopenharmony_ci auto iterOld = oldJSPandaFiles_.begin(); 3564514f5e3Sopenharmony_ci while (iterOld != oldJSPandaFiles_.end()) { 3574514f5e3Sopenharmony_ci if (iterOld->get() == jsPandaFile) { 3584514f5e3Sopenharmony_ci extractors_.erase(jsPandaFile); 3594514f5e3Sopenharmony_ci oldJSPandaFiles_.erase(iterOld); 3604514f5e3Sopenharmony_ci return; 3614514f5e3Sopenharmony_ci } 3624514f5e3Sopenharmony_ci iterOld++; 3634514f5e3Sopenharmony_ci } 3644514f5e3Sopenharmony_ci const auto &filename = jsPandaFile->GetJSPandaFileDesc(); 3654514f5e3Sopenharmony_ci auto iter = loadedJSPandaFiles_.find(filename); 3664514f5e3Sopenharmony_ci if (iter != loadedJSPandaFiles_.end()) { 3674514f5e3Sopenharmony_ci extractors_.erase(jsPandaFile); 3684514f5e3Sopenharmony_ci // erase shared_ptr from map, the ref count -1. 3694514f5e3Sopenharmony_ci loadedJSPandaFiles_.erase(iter); 3704514f5e3Sopenharmony_ci } 3714514f5e3Sopenharmony_ci} 3724514f5e3Sopenharmony_ci 3734514f5e3Sopenharmony_civoid JSPandaFileManager::ObsoleteLoadedJSPandaFile(const CString &filename) 3744514f5e3Sopenharmony_ci{ 3754514f5e3Sopenharmony_ci auto iter = loadedJSPandaFiles_.find(filename); 3764514f5e3Sopenharmony_ci ASSERT(iter != loadedJSPandaFiles_.end()); 3774514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> &jsPandaFile = iter->second; 3784514f5e3Sopenharmony_ci if (oldJSPandaFiles_.find(jsPandaFile) == oldJSPandaFiles_.end()) { 3794514f5e3Sopenharmony_ci oldJSPandaFiles_.emplace(jsPandaFile); 3804514f5e3Sopenharmony_ci } 3814514f5e3Sopenharmony_ci loadedJSPandaFiles_.erase(iter); 3824514f5e3Sopenharmony_ci} 3834514f5e3Sopenharmony_ci 3844514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::OpenJSPandaFile(const CString &filename) 3854514f5e3Sopenharmony_ci{ 3864514f5e3Sopenharmony_ci return OpenJSPandaFile(filename, filename); 3874514f5e3Sopenharmony_ci} 3884514f5e3Sopenharmony_ci 3894514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::OpenJSPandaFile(const CString &filename, const CString &desc) 3904514f5e3Sopenharmony_ci{ 3914514f5e3Sopenharmony_ci auto pf = panda_file::OpenPandaFileOrZip(filename, panda_file::File::READ_WRITE); 3924514f5e3Sopenharmony_ci if (pf == nullptr) { 3934514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "open file " << filename << " error"; 3944514f5e3Sopenharmony_ci return nullptr; 3954514f5e3Sopenharmony_ci } 3964514f5e3Sopenharmony_ci 3974514f5e3Sopenharmony_ci return NewJSPandaFile(pf.release(), desc); 3984514f5e3Sopenharmony_ci} 3994514f5e3Sopenharmony_ci 4004514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::OpenJSPandaFileFromBuffer(uint8_t *buffer, 4014514f5e3Sopenharmony_ci size_t size, 4024514f5e3Sopenharmony_ci const CString &filename) 4034514f5e3Sopenharmony_ci{ 4044514f5e3Sopenharmony_ci auto pf = panda_file::OpenPandaFileFromMemory(buffer, size); 4054514f5e3Sopenharmony_ci if (pf == nullptr) { 4064514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "open file " << filename << " error"; 4074514f5e3Sopenharmony_ci return nullptr; 4084514f5e3Sopenharmony_ci } 4094514f5e3Sopenharmony_ci 4104514f5e3Sopenharmony_ci return NewJSPandaFile(pf.release(), filename); 4114514f5e3Sopenharmony_ci} 4124514f5e3Sopenharmony_ci 4134514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::NewJSPandaFile(const panda_file::File *pf, const CString &desc) 4144514f5e3Sopenharmony_ci{ 4154514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile = std::make_shared<JSPandaFile>(pf, desc); 4164514f5e3Sopenharmony_ci PGOProfilerManager::GetInstance()->SamplePandaFileInfo(jsPandaFile->GetChecksum(), 4174514f5e3Sopenharmony_ci jsPandaFile->GetJSPandaFileDesc()); 4184514f5e3Sopenharmony_ci return jsPandaFile; 4194514f5e3Sopenharmony_ci} 4204514f5e3Sopenharmony_ci 4214514f5e3Sopenharmony_ciDebugInfoExtractor *JSPandaFileManager::GetJSPtExtractor(const JSPandaFile *jsPandaFile) 4224514f5e3Sopenharmony_ci{ 4234514f5e3Sopenharmony_ci LOG_ECMA_IF(jsPandaFile == nullptr, FATAL) << "GetJSPtExtractor error, js pandafile is nullptr"; 4244514f5e3Sopenharmony_ci 4254514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 4264514f5e3Sopenharmony_ci const auto &filename = jsPandaFile->GetJSPandaFileDesc(); 4274514f5e3Sopenharmony_ci if (loadedJSPandaFiles_.find(filename) == loadedJSPandaFiles_.end()) { 4284514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "get extractor failed, file not exist: " << filename 4294514f5e3Sopenharmony_ci << " file addr is " << reinterpret_cast<uintptr_t>(jsPandaFile->GetHeader()); 4304514f5e3Sopenharmony_ci UNREACHABLE(); 4314514f5e3Sopenharmony_ci } 4324514f5e3Sopenharmony_ci 4334514f5e3Sopenharmony_ci auto iter = extractors_.find(jsPandaFile); 4344514f5e3Sopenharmony_ci if (iter == extractors_.end()) { 4354514f5e3Sopenharmony_ci auto extractorPtr = std::make_unique<DebugInfoExtractor>(jsPandaFile); 4364514f5e3Sopenharmony_ci DebugInfoExtractor *extractor = extractorPtr.get(); 4374514f5e3Sopenharmony_ci extractors_[jsPandaFile] = std::move(extractorPtr); 4384514f5e3Sopenharmony_ci return extractor; 4394514f5e3Sopenharmony_ci } 4404514f5e3Sopenharmony_ci 4414514f5e3Sopenharmony_ci return iter->second.get(); 4424514f5e3Sopenharmony_ci} 4434514f5e3Sopenharmony_ci 4444514f5e3Sopenharmony_ciDebugInfoExtractor *JSPandaFileManager::GetJSPtExtractorAndExtract(const JSPandaFile *jsPandaFile) 4454514f5e3Sopenharmony_ci{ 4464514f5e3Sopenharmony_ci LOG_ECMA_IF(jsPandaFile == nullptr, FATAL) << "GetJSPtExtractor error, js pandafile is nullptr"; 4474514f5e3Sopenharmony_ci 4484514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 4494514f5e3Sopenharmony_ci const auto &filename = jsPandaFile->GetJSPandaFileDesc(); 4504514f5e3Sopenharmony_ci if (loadedJSPandaFiles_.find(filename) == loadedJSPandaFiles_.end()) { 4514514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "get extractor failed, file not exist: " << filename; 4524514f5e3Sopenharmony_ci UNREACHABLE(); 4534514f5e3Sopenharmony_ci } 4544514f5e3Sopenharmony_ci 4554514f5e3Sopenharmony_ci auto iter = extractors_.find(jsPandaFile); 4564514f5e3Sopenharmony_ci if (iter == extractors_.end()) { 4574514f5e3Sopenharmony_ci auto extractorPtr = std::make_unique<DebugInfoExtractor>(jsPandaFile); 4584514f5e3Sopenharmony_ci DebugInfoExtractor *extractor = extractorPtr.get(); 4594514f5e3Sopenharmony_ci extractor->Extract(); 4604514f5e3Sopenharmony_ci extractors_[jsPandaFile] = std::move(extractorPtr); 4614514f5e3Sopenharmony_ci return extractor; 4624514f5e3Sopenharmony_ci } 4634514f5e3Sopenharmony_ci 4644514f5e3Sopenharmony_ci return iter->second.get(); 4654514f5e3Sopenharmony_ci} 4664514f5e3Sopenharmony_ci 4674514f5e3Sopenharmony_ciDebugInfoExtractor *JSPandaFileManager::CpuProfilerGetJSPtExtractor(const JSPandaFile *jsPandaFile) 4684514f5e3Sopenharmony_ci{ 4694514f5e3Sopenharmony_ci LOG_ECMA_IF(jsPandaFile == nullptr, FATAL) << "GetJSPtExtractor error, js pandafile is nullptr"; 4704514f5e3Sopenharmony_ci 4714514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 4724514f5e3Sopenharmony_ci const auto &filename = jsPandaFile->GetJSPandaFileDesc(); 4734514f5e3Sopenharmony_ci if (loadedJSPandaFiles_.find(filename) == loadedJSPandaFiles_.end()) { 4744514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "get extractor failed, file not exist: " << filename; 4754514f5e3Sopenharmony_ci UNREACHABLE(); 4764514f5e3Sopenharmony_ci } 4774514f5e3Sopenharmony_ci 4784514f5e3Sopenharmony_ci DebugInfoExtractor *extractor = nullptr; 4794514f5e3Sopenharmony_ci auto iter = extractors_.find(jsPandaFile); 4804514f5e3Sopenharmony_ci if (iter == extractors_.end()) { 4814514f5e3Sopenharmony_ci auto extractorPtr = std::make_unique<DebugInfoExtractor>(jsPandaFile); 4824514f5e3Sopenharmony_ci extractor = extractorPtr.get(); 4834514f5e3Sopenharmony_ci extractors_[jsPandaFile] = std::move(extractorPtr); 4844514f5e3Sopenharmony_ci } else { 4854514f5e3Sopenharmony_ci extractor = iter->second.get(); 4864514f5e3Sopenharmony_ci } 4874514f5e3Sopenharmony_ci 4884514f5e3Sopenharmony_ci extractor->Extract(); 4894514f5e3Sopenharmony_ci return extractor; 4904514f5e3Sopenharmony_ci} 4914514f5e3Sopenharmony_ci 4924514f5e3Sopenharmony_cistd::string GetModuleNameFromDesc(const std::string &desc) 4934514f5e3Sopenharmony_ci{ 4944514f5e3Sopenharmony_ci /* 4954514f5e3Sopenharmony_ci handle desc like: 4964514f5e3Sopenharmony_ci case1: /data/storage/el1/bundle/entry/ets/modules.abc -> entry/ets/modules.abc 4974514f5e3Sopenharmony_ci case2: /data/storage/el1/bundle/entry/ets/widgets.abc -> entry/ets/widgets.abc 4984514f5e3Sopenharmony_ci case3: /data/app/el1/bundle/public/com.xx.xx/entry/ets/modules.abc -> entry/ets/modules.abc 4994514f5e3Sopenharmony_ci case4: /data/app/el1/bundle/public/com.xx.xx/entry/ets/widgets.abc -> entry/ets/widgets.abc 5004514f5e3Sopenharmony_ci */ 5014514f5e3Sopenharmony_ci auto lastSlash = desc.rfind("/"); 5024514f5e3Sopenharmony_ci if (lastSlash == std::string::npos) { 5034514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "GetModuleNameFromDesc can't find fisrt /: " << desc; 5044514f5e3Sopenharmony_ci return ""; 5054514f5e3Sopenharmony_ci } 5064514f5e3Sopenharmony_ci ASSERT(lastSlash > 0); 5074514f5e3Sopenharmony_ci auto secondLastSlash = desc.rfind("/", lastSlash - 1); 5084514f5e3Sopenharmony_ci if (secondLastSlash == std::string::npos) { 5094514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "GetModuleNameFromDesc can't find second /: " << desc; 5104514f5e3Sopenharmony_ci return ""; 5114514f5e3Sopenharmony_ci } 5124514f5e3Sopenharmony_ci ASSERT(secondLastSlash > 0); 5134514f5e3Sopenharmony_ci auto thirdLastSlash = desc.rfind("/", secondLastSlash - 1); 5144514f5e3Sopenharmony_ci if (thirdLastSlash == std::string::npos) { 5154514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "GetModuleNameFromDesc can't find third /: " << desc; 5164514f5e3Sopenharmony_ci return ""; 5174514f5e3Sopenharmony_ci } 5184514f5e3Sopenharmony_ci // get moduleName from thirdLastSlash to secondLastSlash 5194514f5e3Sopenharmony_ci return desc.substr(thirdLastSlash + 1, secondLastSlash - thirdLastSlash - 1); 5204514f5e3Sopenharmony_ci} 5214514f5e3Sopenharmony_ci 5224514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::GenerateJSPandaFile(JSThread *thread, const panda_file::File *pf, 5234514f5e3Sopenharmony_ci const CString &desc, std::string_view entryPoint) 5244514f5e3Sopenharmony_ci{ 5254514f5e3Sopenharmony_ci ThreadNativeScope nativeScope(thread); 5264514f5e3Sopenharmony_ci ASSERT(GetJSPandaFile(pf) == nullptr); 5274514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> newJsPandaFile = NewJSPandaFile(pf, desc); 5284514f5e3Sopenharmony_ci EcmaVM *vm = thread->GetEcmaVM(); 5294514f5e3Sopenharmony_ci 5304514f5e3Sopenharmony_ci std::string moduleName = GetModuleNameFromDesc(desc.c_str()); 5314514f5e3Sopenharmony_ci std::string hapPath; 5324514f5e3Sopenharmony_ci SearchHapPathCallBack callback = vm->GetSearchHapPathCallBack(); 5334514f5e3Sopenharmony_ci if (callback) { 5344514f5e3Sopenharmony_ci callback(moduleName, hapPath); 5354514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "SearchHapPathCallBack moduleName: " << moduleName 5364514f5e3Sopenharmony_ci << ", fileName:" << desc << ", hapPath: " << hapPath; 5374514f5e3Sopenharmony_ci newJsPandaFile->SetHapPath(hapPath.c_str()); 5384514f5e3Sopenharmony_ci } 5394514f5e3Sopenharmony_ci 5404514f5e3Sopenharmony_ci CString methodName = entryPoint.data(); 5414514f5e3Sopenharmony_ci if (newJsPandaFile->IsBundlePack()) { 5424514f5e3Sopenharmony_ci // entryPoint maybe is _GLOBAL::func_main_watch to execute func_main_watch 5434514f5e3Sopenharmony_ci auto pos = entryPoint.find_last_of("::"); 5444514f5e3Sopenharmony_ci if (pos != std::string_view::npos) { 5454514f5e3Sopenharmony_ci methodName = entryPoint.substr(pos + 1); 5464514f5e3Sopenharmony_ci } else { 5474514f5e3Sopenharmony_ci // default use func_main_0 as entryPoint 5484514f5e3Sopenharmony_ci methodName = JSPandaFile::ENTRY_FUNCTION_NAME; 5494514f5e3Sopenharmony_ci } 5504514f5e3Sopenharmony_ci } 5514514f5e3Sopenharmony_ci if (newJsPandaFile->IsNewVersion() && vm->IsAsynTranslateClasses()) { 5524514f5e3Sopenharmony_ci newJsPandaFile->TranslateClasses(thread, methodName); 5534514f5e3Sopenharmony_ci } else { 5544514f5e3Sopenharmony_ci PandaFileTranslator::TranslateClasses(thread, newJsPandaFile.get(), methodName); 5554514f5e3Sopenharmony_ci } 5564514f5e3Sopenharmony_ci 5574514f5e3Sopenharmony_ci { 5584514f5e3Sopenharmony_ci LockHolder lock(jsPandaFileLock_); 5594514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile = FindJSPandaFileUnlocked(desc); 5604514f5e3Sopenharmony_ci if (jsPandaFile != nullptr) { 5614514f5e3Sopenharmony_ci newJsPandaFile.reset(); 5624514f5e3Sopenharmony_ci return jsPandaFile; 5634514f5e3Sopenharmony_ci } else { 5644514f5e3Sopenharmony_ci AddJSPandaFile(newJsPandaFile); 5654514f5e3Sopenharmony_ci return newJsPandaFile; 5664514f5e3Sopenharmony_ci } 5674514f5e3Sopenharmony_ci } 5684514f5e3Sopenharmony_ci} 5694514f5e3Sopenharmony_ci 5704514f5e3Sopenharmony_ci/* 5714514f5e3Sopenharmony_ci * Check whether the file path can be loaded into pandafile, excluding bundle packaging and decompression paths 5724514f5e3Sopenharmony_ci */ 5734514f5e3Sopenharmony_cibool JSPandaFileManager::CheckFilePath(JSThread *thread, const CString &fileName) 5744514f5e3Sopenharmony_ci{ 5754514f5e3Sopenharmony_ci std::shared_ptr<JSPandaFile> jsPandaFile = FindJSPandaFileUnlocked(fileName); 5764514f5e3Sopenharmony_ci if (jsPandaFile != nullptr) { 5774514f5e3Sopenharmony_ci return true; 5784514f5e3Sopenharmony_ci } 5794514f5e3Sopenharmony_ci EcmaVM *vm = thread->GetEcmaVM(); 5804514f5e3Sopenharmony_ci ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager(); 5814514f5e3Sopenharmony_ci if (!vm->IsBundlePack() && moduleManager->GetExecuteMode() == ModuleExecuteMode::ExecuteBufferMode) { 5824514f5e3Sopenharmony_ci ResolveBufferCallback resolveBufferCallback = vm->GetResolveBufferCallback(); 5834514f5e3Sopenharmony_ci if (resolveBufferCallback == nullptr) { 5844514f5e3Sopenharmony_ci LOG_FULL(ERROR) << "When checking file path, resolveBufferCallback is nullptr"; 5854514f5e3Sopenharmony_ci return false; 5864514f5e3Sopenharmony_ci } 5874514f5e3Sopenharmony_ci uint8_t *data = nullptr; 5884514f5e3Sopenharmony_ci size_t dataSize = 0; 5894514f5e3Sopenharmony_ci std::string errorMsg; 5904514f5e3Sopenharmony_ci bool getBuffer = resolveBufferCallback(ModulePathHelper::ParseHapPath(fileName), &data, &dataSize, errorMsg); 5914514f5e3Sopenharmony_ci if (!getBuffer) { 5924514f5e3Sopenharmony_ci LOG_FULL(ERROR) 5934514f5e3Sopenharmony_ci << "When checking file path, resolveBufferCallback get buffer failed, errorMsg = " << errorMsg; 5944514f5e3Sopenharmony_ci return false; 5954514f5e3Sopenharmony_ci } 5964514f5e3Sopenharmony_ci } 5974514f5e3Sopenharmony_ci return true; 5984514f5e3Sopenharmony_ci} 5994514f5e3Sopenharmony_ci 6004514f5e3Sopenharmony_cistd::shared_ptr<JSPandaFile> JSPandaFileManager::GenerateJSPandafileFromBufferCache( 6014514f5e3Sopenharmony_ci JSThread *thread, const CString &filename, std::string_view entryPoint) 6024514f5e3Sopenharmony_ci{ 6034514f5e3Sopenharmony_ci AbcBufferInfo bufferInfo = 6044514f5e3Sopenharmony_ci thread->GetCurrentEcmaContext()->GetAbcBufferCache()->FindJSPandaFileInAbcBufferCache(filename); 6054514f5e3Sopenharmony_ci if (bufferInfo.buffer_ == nullptr) { 6064514f5e3Sopenharmony_ci return nullptr; 6074514f5e3Sopenharmony_ci } 6084514f5e3Sopenharmony_ci LOG_FULL(INFO) << "fileName was found in bufferFiles_."; 6094514f5e3Sopenharmony_ci JSPandaFileManager *jsPandaFileManager = JSPandaFileManager::GetInstance(); 6104514f5e3Sopenharmony_ci if (bufferInfo.bufferType_ == AbcBufferType::SECURE_BUFFER) { 6114514f5e3Sopenharmony_ci return jsPandaFileManager->LoadJSPandaFileSecure( 6124514f5e3Sopenharmony_ci thread, filename, entryPoint, reinterpret_cast<uint8_t *>(bufferInfo.buffer_), bufferInfo.size_); 6134514f5e3Sopenharmony_ci } 6144514f5e3Sopenharmony_ci return jsPandaFileManager->LoadJSPandaFile( 6154514f5e3Sopenharmony_ci thread, filename, entryPoint, bufferInfo.buffer_, bufferInfo.size_); 6164514f5e3Sopenharmony_ci} 6174514f5e3Sopenharmony_ci 6184514f5e3Sopenharmony_civoid *JSPandaFileManager::AllocateBuffer(size_t size) 6194514f5e3Sopenharmony_ci{ 6204514f5e3Sopenharmony_ci return JSPandaFileAllocator::AllocateBuffer(size); 6214514f5e3Sopenharmony_ci} 6224514f5e3Sopenharmony_ci 6234514f5e3Sopenharmony_civoid *JSPandaFileManager::JSPandaFileAllocator::AllocateBuffer(size_t size) 6244514f5e3Sopenharmony_ci{ 6254514f5e3Sopenharmony_ci if (size == 0) { 6264514f5e3Sopenharmony_ci LOG_ECMA_MEM(FATAL) << "size must have a size bigger than 0"; 6274514f5e3Sopenharmony_ci UNREACHABLE(); 6284514f5e3Sopenharmony_ci } 6294514f5e3Sopenharmony_ci if (size >= MALLOC_SIZE_LIMIT) { 6304514f5e3Sopenharmony_ci LOG_ECMA_MEM(FATAL) << "size must be less than the maximum"; 6314514f5e3Sopenharmony_ci UNREACHABLE(); 6324514f5e3Sopenharmony_ci } 6334514f5e3Sopenharmony_ci // NOLINTNEXTLINE(cppcoreguidelines-no-malloc) 6344514f5e3Sopenharmony_ci void *ptr = malloc(size); 6354514f5e3Sopenharmony_ci if (ptr == nullptr) { 6364514f5e3Sopenharmony_ci LOG_ECMA_MEM(FATAL) << "malloc failed"; 6374514f5e3Sopenharmony_ci UNREACHABLE(); 6384514f5e3Sopenharmony_ci } 6394514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_ZAP_MEM 6404514f5e3Sopenharmony_ci if (memset_s(ptr, size, INVALID_VALUE, size) != EOK) { 6414514f5e3Sopenharmony_ci LOG_ECMA_MEM(FATAL) << "memset_s failed"; 6424514f5e3Sopenharmony_ci UNREACHABLE(); 6434514f5e3Sopenharmony_ci } 6444514f5e3Sopenharmony_ci#endif 6454514f5e3Sopenharmony_ci return ptr; 6464514f5e3Sopenharmony_ci} 6474514f5e3Sopenharmony_ci 6484514f5e3Sopenharmony_civoid JSPandaFileManager::FreeBuffer(void *mem) 6494514f5e3Sopenharmony_ci{ 6504514f5e3Sopenharmony_ci JSPandaFileAllocator::FreeBuffer(mem); 6514514f5e3Sopenharmony_ci} 6524514f5e3Sopenharmony_ci 6534514f5e3Sopenharmony_civoid JSPandaFileManager::JSPandaFileAllocator::FreeBuffer(void *mem) 6544514f5e3Sopenharmony_ci{ 6554514f5e3Sopenharmony_ci if (mem == nullptr) { 6564514f5e3Sopenharmony_ci return; 6574514f5e3Sopenharmony_ci } 6584514f5e3Sopenharmony_ci // NOLINTNEXTLINE(cppcoreguidelines-no-malloc) 6594514f5e3Sopenharmony_ci free(mem); 6604514f5e3Sopenharmony_ci} 6614514f5e3Sopenharmony_ci} // namespace panda::ecmascript 662