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