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#include "ecmascript/jspandafile/js_pandafile_executor.h"
174514f5e3Sopenharmony_ci
184514f5e3Sopenharmony_ci#include "ecmascript/js_file_path.h"
194514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/abc_buffer_cache.h"
204514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/program_object.h"
214514f5e3Sopenharmony_ci#include "ecmascript/module/module_path_helper.h"
224514f5e3Sopenharmony_ci#include "ecmascript/checkpoint/thread_state_transition.h"
234514f5e3Sopenharmony_ci
244514f5e3Sopenharmony_cinamespace panda::ecmascript {
254514f5e3Sopenharmony_ciusing PathHelper = base::PathHelper;
264514f5e3Sopenharmony_ci
274514f5e3Sopenharmony_ci// use "@bundle" as ohmurl's rules, will be abandon later
284514f5e3Sopenharmony_cistd::pair<CString, CString> JSPandaFileExecutor::ParseAbcEntryPoint(JSThread *thread, const CString &filename,
294514f5e3Sopenharmony_ci    [[maybe_unused]] std::string_view entryPoint)
304514f5e3Sopenharmony_ci{
314514f5e3Sopenharmony_ci    CString name;
324514f5e3Sopenharmony_ci    CString entry;
334514f5e3Sopenharmony_ci    [[maybe_unused]] EcmaVM *vm = thread->GetEcmaVM();
344514f5e3Sopenharmony_ci#if defined(PANDA_TARGET_LINUX) || defined(OHOS_UNIT_TEST) || defined(PANDA_TARGET_MACOS)
354514f5e3Sopenharmony_ci    return {filename, entryPoint.data()};
364514f5e3Sopenharmony_ci#else
374514f5e3Sopenharmony_ci    CString normalName = PathHelper::NormalizePath(filename);
384514f5e3Sopenharmony_ci    ModulePathHelper::ParseAbcPathAndOhmUrl(vm, normalName, name, entry);
394514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_WINDOWS)
404514f5e3Sopenharmony_ci    if (name.empty()) {
414514f5e3Sopenharmony_ci        name = vm->GetAssetPath();
424514f5e3Sopenharmony_ci    }
434514f5e3Sopenharmony_ci#elif defined(PANDA_TARGET_WINDOWS)
444514f5e3Sopenharmony_ci    CString assetPath = vm->GetAssetPath();
454514f5e3Sopenharmony_ci    name = assetPath + "\\" + JSPandaFile::MERGE_ABC_NAME;
464514f5e3Sopenharmony_ci#else
474514f5e3Sopenharmony_ci    CString assetPath = vm->GetAssetPath();
484514f5e3Sopenharmony_ci    name = assetPath + "/" + JSPandaFile::MERGE_ABC_NAME;
494514f5e3Sopenharmony_ci#endif
504514f5e3Sopenharmony_ci#endif
514514f5e3Sopenharmony_ci    return std::make_pair(name, entry);
524514f5e3Sopenharmony_ci}
534514f5e3Sopenharmony_ci
544514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteFromFile(JSThread *thread, const CString &name,
554514f5e3Sopenharmony_ci    CString entry, bool needUpdate, bool executeFromJob)
564514f5e3Sopenharmony_ci{
574514f5e3Sopenharmony_ci    EcmaVM *vm = thread->GetEcmaVM();
584514f5e3Sopenharmony_ci
594514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile =
604514f5e3Sopenharmony_ci        JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, name, entry, needUpdate);
614514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
624514f5e3Sopenharmony_ci#ifdef FUZZ_TEST
634514f5e3Sopenharmony_ci        CString msg = "jsPandaFile is nullptr";
644514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
654514f5e3Sopenharmony_ci#else
664514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "Load current file's panda file failed. Current file is " << name;
674514f5e3Sopenharmony_ci#endif
684514f5e3Sopenharmony_ci    }
694514f5e3Sopenharmony_ci    // If it is an old record, delete the bundleName and moduleName
704514f5e3Sopenharmony_ci    if (!jsPandaFile->IsBundlePack() && !vm->IsNormalizedOhmUrlPack() && !executeFromJob &&
714514f5e3Sopenharmony_ci        !vm->GetBundleName().empty()) {
724514f5e3Sopenharmony_ci        jsPandaFile->CheckIsRecordWithBundleName(entry);
734514f5e3Sopenharmony_ci        if (!jsPandaFile->IsRecordWithBundleName()) {
744514f5e3Sopenharmony_ci            PathHelper::AdaptOldIsaRecord(entry);
754514f5e3Sopenharmony_ci        }
764514f5e3Sopenharmony_ci    }
774514f5e3Sopenharmony_ci
784514f5e3Sopenharmony_ci    JSRecordInfo *recordInfo = nullptr;
794514f5e3Sopenharmony_ci    bool hasRecord = jsPandaFile->CheckAndGetRecordInfo(entry, &recordInfo);
804514f5e3Sopenharmony_ci    if (!hasRecord) {
814514f5e3Sopenharmony_ci        CString msg = "Cannot find module '" + entry + "' , which is application Entry Point";
824514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
834514f5e3Sopenharmony_ci    }
844514f5e3Sopenharmony_ci    if (jsPandaFile->IsModule(recordInfo)) {
854514f5e3Sopenharmony_ci        ThreadManagedScope managedScope(thread);
864514f5e3Sopenharmony_ci        SharedModuleManager* sharedModuleManager = SharedModuleManager::GetInstance();
874514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> moduleRecord(thread->GlobalConstants()->GetHandledUndefined());
884514f5e3Sopenharmony_ci        if (jsPandaFile->IsBundlePack()) {
894514f5e3Sopenharmony_ci            moduleRecord = sharedModuleManager->ResolveImportedModule(thread, name, executeFromJob);
904514f5e3Sopenharmony_ci        } else {
914514f5e3Sopenharmony_ci            moduleRecord = sharedModuleManager->ResolveImportedModuleWithMerge(thread, name, entry, executeFromJob);
924514f5e3Sopenharmony_ci        }
934514f5e3Sopenharmony_ci
944514f5e3Sopenharmony_ci        SourceTextModule::Instantiate(thread, moduleRecord, executeFromJob);
954514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
964514f5e3Sopenharmony_ci            return Unexpected(false);
974514f5e3Sopenharmony_ci        }
984514f5e3Sopenharmony_ci        JSHandle<SourceTextModule> module = JSHandle<SourceTextModule>::Cast(moduleRecord);
994514f5e3Sopenharmony_ci        module->SetStatus(ModuleStatus::INSTANTIATED);
1004514f5e3Sopenharmony_ci        SourceTextModule::Evaluate(thread, module, nullptr, 0, executeFromJob);
1014514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
1024514f5e3Sopenharmony_ci            return Unexpected(false);
1034514f5e3Sopenharmony_ci        }
1044514f5e3Sopenharmony_ci        return JSTaggedValue::Undefined();
1054514f5e3Sopenharmony_ci    }
1064514f5e3Sopenharmony_ci    return JSPandaFileExecutor::Execute(thread, jsPandaFile.get(), entry.c_str(), executeFromJob);
1074514f5e3Sopenharmony_ci}
1084514f5e3Sopenharmony_ci
1094514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteFromAbsolutePathAbcFile(JSThread *thread,
1104514f5e3Sopenharmony_ci    const CString &filename, std::string_view entryPoint, bool needUpdate, bool executeFromJob)
1114514f5e3Sopenharmony_ci{
1124514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSPandaFileExecutor::ExecuteFromAbsolutePathAbcFile filename " << filename;
1134514f5e3Sopenharmony_ci    CString traceInfo = "JSPandaFileExecutor::ExecuteFromAbsolutePathAbcFile " + filename;
1144514f5e3Sopenharmony_ci    ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, traceInfo.c_str());
1154514f5e3Sopenharmony_ci    CString entry = entryPoint.data();
1164514f5e3Sopenharmony_ci    CString name = filename;
1174514f5e3Sopenharmony_ci
1184514f5e3Sopenharmony_ci    return ExecuteFromFile(thread, name, entry, needUpdate, executeFromJob);
1194514f5e3Sopenharmony_ci}
1204514f5e3Sopenharmony_ci
1214514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteFromAbcFile(JSThread *thread, const CString &filename,
1224514f5e3Sopenharmony_ci    std::string_view entryPoint, bool needUpdate, bool executeFromJob)
1234514f5e3Sopenharmony_ci{
1244514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSPandaFileExecutor::ExecuteFromAbcFile filename " << filename;
1254514f5e3Sopenharmony_ci    CString traceInfo = "JSPandaFileExecutor::ExecuteFromAbcFile " + filename;
1264514f5e3Sopenharmony_ci    ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, traceInfo.c_str());
1274514f5e3Sopenharmony_ci    CString entry;
1284514f5e3Sopenharmony_ci    CString name;
1294514f5e3Sopenharmony_ci    EcmaVM *vm = thread->GetEcmaVM();
1304514f5e3Sopenharmony_ci    if (!vm->IsBundlePack() && !executeFromJob) {
1314514f5e3Sopenharmony_ci        std::tie(name, entry) = ParseAbcEntryPoint(thread, filename, entryPoint);
1324514f5e3Sopenharmony_ci    } else {
1334514f5e3Sopenharmony_ci        name = filename;
1344514f5e3Sopenharmony_ci        entry = entryPoint.data();
1354514f5e3Sopenharmony_ci    }
1364514f5e3Sopenharmony_ci
1374514f5e3Sopenharmony_ci    return ExecuteFromFile(thread, name, entry, needUpdate, executeFromJob);
1384514f5e3Sopenharmony_ci}
1394514f5e3Sopenharmony_ci
1404514f5e3Sopenharmony_ci// The security interface needs to be modified accordingly.
1414514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteFromBuffer(JSThread *thread,
1424514f5e3Sopenharmony_ci    const void *buffer, size_t size, std::string_view entryPoint, const CString &filename, bool needUpdate,
1434514f5e3Sopenharmony_ci    bool executeFromJob)
1444514f5e3Sopenharmony_ci{
1454514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSPandaFileExecutor::ExecuteFromBuffer filename " << filename;
1464514f5e3Sopenharmony_ci    CString traceInfo = "JSPandaFileExecutor::ExecuteFromBuffer " + filename;
1474514f5e3Sopenharmony_ci    ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, traceInfo.c_str());
1484514f5e3Sopenharmony_ci    CString normalName = PathHelper::NormalizePath(filename);
1494514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile =
1504514f5e3Sopenharmony_ci        JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, normalName, entryPoint, buffer, size, needUpdate);
1514514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
1524514f5e3Sopenharmony_ci#ifdef FUZZ_TEST
1534514f5e3Sopenharmony_ci        CString msg = "jsPandaFile is nullptr";
1544514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
1554514f5e3Sopenharmony_ci#else
1564514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "Load current file's panda file failed. Current file is " << normalName;
1574514f5e3Sopenharmony_ci#endif
1584514f5e3Sopenharmony_ci    }
1594514f5e3Sopenharmony_ci    AbcBufferCacheScope bufferScope(thread, normalName, buffer, size, AbcBufferType::NORMAL_BUFFER);
1604514f5e3Sopenharmony_ci    auto vm = thread->GetEcmaVM();
1614514f5e3Sopenharmony_ci
1624514f5e3Sopenharmony_ci    CString entry = entryPoint.data();
1634514f5e3Sopenharmony_ci    if (vm->IsNormalizedOhmUrlPack()) {
1644514f5e3Sopenharmony_ci        entry = ModulePathHelper::TransformToNormalizedOhmUrl(vm, filename, normalName, entry);
1654514f5e3Sopenharmony_ci    }
1664514f5e3Sopenharmony_ci    JSRecordInfo *recordInfo = nullptr;
1674514f5e3Sopenharmony_ci    bool hasRecord = jsPandaFile->CheckAndGetRecordInfo(entry, &recordInfo);
1684514f5e3Sopenharmony_ci    if (!hasRecord) {
1694514f5e3Sopenharmony_ci        CString msg = "Cannot find module '" + entry + "' , which is application Entry Point";
1704514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
1714514f5e3Sopenharmony_ci    }
1724514f5e3Sopenharmony_ci    if (jsPandaFile->IsModule(recordInfo)) {
1734514f5e3Sopenharmony_ci        bool isBundle = jsPandaFile->IsBundlePack();
1744514f5e3Sopenharmony_ci        return CommonExecuteBuffer(thread, isBundle, normalName, entry, buffer, size, executeFromJob);
1754514f5e3Sopenharmony_ci    }
1764514f5e3Sopenharmony_ci    return JSPandaFileExecutor::Execute(thread, jsPandaFile.get(), entry, executeFromJob);
1774514f5e3Sopenharmony_ci}
1784514f5e3Sopenharmony_ci
1794514f5e3Sopenharmony_ci// The security interface needs to be modified accordingly.
1804514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteModuleBuffer(
1814514f5e3Sopenharmony_ci    JSThread *thread, const void *buffer, size_t size, const CString &filename, bool needUpdate)
1824514f5e3Sopenharmony_ci{
1834514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSPandaFileExecutor::ExecuteModuleBuffer filename " << filename;
1844514f5e3Sopenharmony_ci    CString traceInfo = "JSPandaFileExecutor::ExecuteModuleBuffer " + filename;
1854514f5e3Sopenharmony_ci    ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, traceInfo.c_str());
1864514f5e3Sopenharmony_ci    CString name;
1874514f5e3Sopenharmony_ci    CString entry;
1884514f5e3Sopenharmony_ci    EcmaVM *vm = thread->GetEcmaVM();
1894514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_WINDOWS)
1904514f5e3Sopenharmony_ci    name = vm->GetAssetPath();
1914514f5e3Sopenharmony_ci#elif defined(PANDA_TARGET_WINDOWS)
1924514f5e3Sopenharmony_ci    CString assetPath = vm->GetAssetPath();
1934514f5e3Sopenharmony_ci    name = assetPath + "\\" + JSPandaFile::MERGE_ABC_NAME;
1944514f5e3Sopenharmony_ci#else
1954514f5e3Sopenharmony_ci    CString assetPath = vm->GetAssetPath();
1964514f5e3Sopenharmony_ci    name = assetPath + "/" + JSPandaFile::MERGE_ABC_NAME;
1974514f5e3Sopenharmony_ci#endif
1984514f5e3Sopenharmony_ci    CString normalName = PathHelper::NormalizePath(filename);
1994514f5e3Sopenharmony_ci    ModulePathHelper::ParseAbcPathAndOhmUrl(vm, normalName, name, entry);
2004514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile =
2014514f5e3Sopenharmony_ci        JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, name, entry, buffer, size, needUpdate);
2024514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
2034514f5e3Sopenharmony_ci#ifdef FUZZ_TEST
2044514f5e3Sopenharmony_ci        CString msg = "jsPandaFile is nullptr";
2054514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
2064514f5e3Sopenharmony_ci#else
2074514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "Load current file's panda file failed. Current file is " << name;
2084514f5e3Sopenharmony_ci#endif
2094514f5e3Sopenharmony_ci    }
2104514f5e3Sopenharmony_ci    AbcBufferCacheScope bufferScope(thread, name, buffer, size, AbcBufferType::NORMAL_BUFFER);
2114514f5e3Sopenharmony_ci    bool isBundle = jsPandaFile->IsBundlePack();
2124514f5e3Sopenharmony_ci
2134514f5e3Sopenharmony_ci    // realEntry is used to record the original record, which is easy to throw when there are exceptions
2144514f5e3Sopenharmony_ci    const CString realEntry = entry;
2154514f5e3Sopenharmony_ci    if (vm->IsNormalizedOhmUrlPack()) {
2164514f5e3Sopenharmony_ci        entry = ModulePathHelper::TransformToNormalizedOhmUrl(vm, filename, name, entry);
2174514f5e3Sopenharmony_ci    } else if (!isBundle) {
2184514f5e3Sopenharmony_ci        jsPandaFile->CheckIsRecordWithBundleName(entry);
2194514f5e3Sopenharmony_ci        if (!jsPandaFile->IsRecordWithBundleName()) {
2204514f5e3Sopenharmony_ci            PathHelper::AdaptOldIsaRecord(entry);
2214514f5e3Sopenharmony_ci        }
2224514f5e3Sopenharmony_ci    }
2234514f5e3Sopenharmony_ci    JSRecordInfo *recordInfo = nullptr;
2244514f5e3Sopenharmony_ci    bool hasRecord = jsPandaFile->CheckAndGetRecordInfo(entry, &recordInfo);
2254514f5e3Sopenharmony_ci    if (!hasRecord) {
2264514f5e3Sopenharmony_ci        CString msg = "Cannot find module '" + realEntry + "' , which is application Entry Point";
2274514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
2284514f5e3Sopenharmony_ci    }
2294514f5e3Sopenharmony_ci    if (!jsPandaFile->IsModule(recordInfo)) {
2304514f5e3Sopenharmony_ci        LOG_ECMA(FATAL) << "Input file is not esmodule";
2314514f5e3Sopenharmony_ci    }
2324514f5e3Sopenharmony_ci    return CommonExecuteBuffer(thread, isBundle, name, entry, buffer, size);
2334514f5e3Sopenharmony_ci}
2344514f5e3Sopenharmony_ci
2354514f5e3Sopenharmony_ci// The security interface needs to be modified accordingly.
2364514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::CommonExecuteBuffer(JSThread *thread,
2374514f5e3Sopenharmony_ci    bool isBundle, const CString &filename, const CString &entry, const void *buffer, size_t size, bool executeFromJob)
2384514f5e3Sopenharmony_ci{
2394514f5e3Sopenharmony_ci    [[maybe_unused]] EcmaHandleScope scope(thread);
2404514f5e3Sopenharmony_ci    ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
2414514f5e3Sopenharmony_ci    moduleManager->SetExecuteMode(ModuleExecuteMode::ExecuteBufferMode);
2424514f5e3Sopenharmony_ci    JSMutableHandle<JSTaggedValue> moduleRecord(thread, thread->GlobalConstants()->GetUndefined());
2434514f5e3Sopenharmony_ci    if (isBundle) {
2444514f5e3Sopenharmony_ci        moduleRecord.Update(moduleManager->HostResolveImportedModule(buffer, size, filename));
2454514f5e3Sopenharmony_ci    } else {
2464514f5e3Sopenharmony_ci        moduleRecord.Update(moduleManager->HostResolveImportedModuleWithMerge(filename, entry, executeFromJob));
2474514f5e3Sopenharmony_ci    }
2484514f5e3Sopenharmony_ci
2494514f5e3Sopenharmony_ci    SourceTextModule::Instantiate(thread, moduleRecord, executeFromJob);
2504514f5e3Sopenharmony_ci    if (thread->HasPendingException()) {
2514514f5e3Sopenharmony_ci        return Unexpected(false);
2524514f5e3Sopenharmony_ci    }
2534514f5e3Sopenharmony_ci
2544514f5e3Sopenharmony_ci    JSHandle<SourceTextModule> module = JSHandle<SourceTextModule>::Cast(moduleRecord);
2554514f5e3Sopenharmony_ci    module->SetStatus(ModuleStatus::INSTANTIATED);
2564514f5e3Sopenharmony_ci    SourceTextModule::Evaluate(thread, module, buffer, size, executeFromJob);
2574514f5e3Sopenharmony_ci    if (thread->HasPendingException()) {
2584514f5e3Sopenharmony_ci        return Unexpected(false);
2594514f5e3Sopenharmony_ci    }
2604514f5e3Sopenharmony_ci    return JSTaggedValue::Undefined();
2614514f5e3Sopenharmony_ci}
2624514f5e3Sopenharmony_ci
2634514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::Execute(JSThread *thread, const JSPandaFile *jsPandaFile,
2644514f5e3Sopenharmony_ci                                                           std::string_view entryPoint, bool executeFromJob)
2654514f5e3Sopenharmony_ci{
2664514f5e3Sopenharmony_ci    ThreadManagedScope managedScope(thread);
2674514f5e3Sopenharmony_ci    bool enableESMTrace = thread->GetEcmaVM()->GetJSOptions().EnableESMTrace();
2684514f5e3Sopenharmony_ci    if (enableESMTrace) {
2694514f5e3Sopenharmony_ci        CString traceInfo = "FileExecute: " + CString(entryPoint);
2704514f5e3Sopenharmony_ci        ECMA_BYTRACE_START_TRACE(HITRACE_TAG_ARK, traceInfo.c_str());
2714514f5e3Sopenharmony_ci    }
2724514f5e3Sopenharmony_ci    // For Ark application startup
2734514f5e3Sopenharmony_ci    EcmaContext *context = thread->GetCurrentEcmaContext();
2744514f5e3Sopenharmony_ci
2754514f5e3Sopenharmony_ci    Expected<JSTaggedValue, bool> result;
2764514f5e3Sopenharmony_ci
2774514f5e3Sopenharmony_ci    if (context->GetStageOfHotReload() == StageOfHotReload::BEGIN_EXECUTE_PATCHMAIN) {
2784514f5e3Sopenharmony_ci        result = context->InvokeEcmaEntrypointForHotReload(jsPandaFile, entryPoint, executeFromJob);
2794514f5e3Sopenharmony_ci    } else {
2804514f5e3Sopenharmony_ci        QuickFixManager *quickFixManager = thread->GetEcmaVM()->GetQuickFixManager();
2814514f5e3Sopenharmony_ci        quickFixManager->LoadPatchIfNeeded(thread, jsPandaFile);
2824514f5e3Sopenharmony_ci
2834514f5e3Sopenharmony_ci        result = context->InvokeEcmaEntrypoint(jsPandaFile, entryPoint, executeFromJob);
2844514f5e3Sopenharmony_ci    }
2854514f5e3Sopenharmony_ci    if (enableESMTrace) {
2864514f5e3Sopenharmony_ci        ECMA_BYTRACE_FINISH_TRACE(HITRACE_TAG_ARK);
2874514f5e3Sopenharmony_ci    }
2884514f5e3Sopenharmony_ci    return result;
2894514f5e3Sopenharmony_ci}
2904514f5e3Sopenharmony_ci
2914514f5e3Sopenharmony_civoid JSPandaFileExecutor::BindPreloadedPandaFilesToAOT(EcmaVM *vm, const std::string &moduleName)
2924514f5e3Sopenharmony_ci{
2934514f5e3Sopenharmony_ci    ASSERT(vm->GetJSThread()->IsMainThread());
2944514f5e3Sopenharmony_ci    if (!vm->GetJSOptions().GetEnableAsmInterpreter()) {
2954514f5e3Sopenharmony_ci        return;
2964514f5e3Sopenharmony_ci    }
2974514f5e3Sopenharmony_ci    // run not via command line
2984514f5e3Sopenharmony_ci    if (vm->GetJSOptions().WasAOTOutputFileSet()) {
2994514f5e3Sopenharmony_ci        return;
3004514f5e3Sopenharmony_ci    }
3014514f5e3Sopenharmony_ci    ASSERT(!moduleName.empty());
3024514f5e3Sopenharmony_ci    // bind pandafiles loaded in appspawn
3034514f5e3Sopenharmony_ci    vm->GetAOTFileManager()->BindPreloadedPandaFilesInAotFile(moduleName);
3044514f5e3Sopenharmony_ci}
3054514f5e3Sopenharmony_ci
3064514f5e3Sopenharmony_civoid JSPandaFileExecutor::BindPandaFileToAot(JSPandaFile *jsPandaFile)
3074514f5e3Sopenharmony_ci{
3084514f5e3Sopenharmony_ci    EcmaVM *vm = Runtime::GetInstance()->GetMainThread()->GetEcmaVM();
3094514f5e3Sopenharmony_ci    if (vm->GetJSOptions().GetEnableAsmInterpreter()) {
3104514f5e3Sopenharmony_ci        std::string aotFileBaseName(vm->GetModuleName());
3114514f5e3Sopenharmony_ci        auto *aotFM = vm->GetAOTFileManager();
3124514f5e3Sopenharmony_ci        if (vm->GetJSOptions().WasAOTOutputFileSet()) {
3134514f5e3Sopenharmony_ci            std::string aotFilename = vm->GetJSOptions().GetAOTOutputFile();
3144514f5e3Sopenharmony_ci            aotFileBaseName = JSFilePath::GetBaseName(aotFilename);
3154514f5e3Sopenharmony_ci        }
3164514f5e3Sopenharmony_ci        aotFM->BindPandaFileInAotFile(aotFileBaseName, jsPandaFile);
3174514f5e3Sopenharmony_ci    }
3184514f5e3Sopenharmony_ci}
3194514f5e3Sopenharmony_ci
3204514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteFromBufferSecure(JSThread *thread, uint8_t *buffer,
3214514f5e3Sopenharmony_ci    size_t size, std::string_view entryPoint, const CString &filename, bool needUpdate)
3224514f5e3Sopenharmony_ci{
3234514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSPandaFileExecutor::ExecuteFromBufferSecure with secure buffer filename " << filename;
3244514f5e3Sopenharmony_ci    CString traceInfo = "JSPandaFileExecutor::ExecuteFromBufferSecure " + filename;
3254514f5e3Sopenharmony_ci    ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, traceInfo.c_str());
3264514f5e3Sopenharmony_ci    CString normalName = PathHelper::NormalizePath(filename);
3274514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile = JSPandaFileManager::GetInstance()->
3284514f5e3Sopenharmony_ci        LoadJSPandaFileSecure(thread, normalName, entryPoint, buffer, size, needUpdate);
3294514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
3304514f5e3Sopenharmony_ci#ifdef FUZZ_TEST
3314514f5e3Sopenharmony_ci        CString msg = "jsPandaFile is nullptr";
3324514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
3334514f5e3Sopenharmony_ci#else
3344514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "Load current file's panda file failed. Current file is " << normalName;
3354514f5e3Sopenharmony_ci#endif
3364514f5e3Sopenharmony_ci    }
3374514f5e3Sopenharmony_ci    AbcBufferCacheScope bufferScope(thread, normalName, buffer, size, AbcBufferType::SECURE_BUFFER);
3384514f5e3Sopenharmony_ci    auto vm = thread->GetEcmaVM();
3394514f5e3Sopenharmony_ci
3404514f5e3Sopenharmony_ci    CString entry = entryPoint.data();
3414514f5e3Sopenharmony_ci    if (vm->IsNormalizedOhmUrlPack()) {
3424514f5e3Sopenharmony_ci        entry = ModulePathHelper::TransformToNormalizedOhmUrl(vm, filename, normalName, entry);
3434514f5e3Sopenharmony_ci    }
3444514f5e3Sopenharmony_ci    JSRecordInfo *recordInfo = nullptr;
3454514f5e3Sopenharmony_ci    bool hasRecord = jsPandaFile->CheckAndGetRecordInfo(entry, &recordInfo);
3464514f5e3Sopenharmony_ci    if (!hasRecord) {
3474514f5e3Sopenharmony_ci        CString msg = "Cannot find module '" + entry + "' , which is application Entry Point";
3484514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
3494514f5e3Sopenharmony_ci    }
3504514f5e3Sopenharmony_ci    if (jsPandaFile->IsModule(recordInfo)) {
3514514f5e3Sopenharmony_ci        return CommonExecuteBuffer(thread, normalName, entry, jsPandaFile.get());
3524514f5e3Sopenharmony_ci    }
3534514f5e3Sopenharmony_ci    return JSPandaFileExecutor::Execute(thread, jsPandaFile.get(), entry);
3544514f5e3Sopenharmony_ci}
3554514f5e3Sopenharmony_ci
3564514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::CommonExecuteBuffer(JSThread *thread, const CString &filename,
3574514f5e3Sopenharmony_ci    const CString &entry, const JSPandaFile *jsPandaFile)
3584514f5e3Sopenharmony_ci{
3594514f5e3Sopenharmony_ci    [[maybe_unused]] EcmaHandleScope scope(thread);
3604514f5e3Sopenharmony_ci    ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
3614514f5e3Sopenharmony_ci    moduleManager->SetExecuteMode(ModuleExecuteMode::ExecuteBufferMode);
3624514f5e3Sopenharmony_ci    JSMutableHandle<JSTaggedValue> moduleRecord(thread, thread->GlobalConstants()->GetUndefined());
3634514f5e3Sopenharmony_ci    if (jsPandaFile->IsBundlePack()) {
3644514f5e3Sopenharmony_ci        moduleRecord.Update(moduleManager->HostResolveImportedModule(jsPandaFile, filename));
3654514f5e3Sopenharmony_ci    } else {
3664514f5e3Sopenharmony_ci        moduleRecord.Update(moduleManager->HostResolveImportedModuleWithMerge(filename, entry));
3674514f5e3Sopenharmony_ci    }
3684514f5e3Sopenharmony_ci
3694514f5e3Sopenharmony_ci    SourceTextModule::Instantiate(thread, moduleRecord);
3704514f5e3Sopenharmony_ci    if (thread->HasPendingException()) {
3714514f5e3Sopenharmony_ci        return Unexpected(false);
3724514f5e3Sopenharmony_ci    }
3734514f5e3Sopenharmony_ci
3744514f5e3Sopenharmony_ci    JSHandle<SourceTextModule> module = JSHandle<SourceTextModule>::Cast(moduleRecord);
3754514f5e3Sopenharmony_ci    module->SetStatus(ModuleStatus::INSTANTIATED);
3764514f5e3Sopenharmony_ci    SourceTextModule::Evaluate(thread, module, nullptr, 0);
3774514f5e3Sopenharmony_ci    if (thread->HasPendingException()) {
3784514f5e3Sopenharmony_ci        return Unexpected(false);
3794514f5e3Sopenharmony_ci    }
3804514f5e3Sopenharmony_ci    return JSTaggedValue::Undefined();
3814514f5e3Sopenharmony_ci}
3824514f5e3Sopenharmony_ci
3834514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteModuleBufferSecure(JSThread *thread, uint8_t *buffer,
3844514f5e3Sopenharmony_ci    size_t size, const CString &filename, bool needUpdate)
3854514f5e3Sopenharmony_ci{
3864514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSPandaFileExecutor::ExecuteModuleBufferSecure with secure buffer filename " << filename;
3874514f5e3Sopenharmony_ci    CString traceInfo = "JSPandaFileExecutor::ExecuteModuleBufferSecure " + filename;
3884514f5e3Sopenharmony_ci    ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, traceInfo.c_str());
3894514f5e3Sopenharmony_ci    CString name;
3904514f5e3Sopenharmony_ci    EcmaVM *vm = thread->GetEcmaVM();
3914514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_WINDOWS)
3924514f5e3Sopenharmony_ci    name = vm->GetAssetPath();
3934514f5e3Sopenharmony_ci#elif defined(PANDA_TARGET_WINDOWS)
3944514f5e3Sopenharmony_ci    CString assetPath = vm->GetAssetPath();
3954514f5e3Sopenharmony_ci    name = assetPath + "\\" + JSPandaFile::MERGE_ABC_NAME;
3964514f5e3Sopenharmony_ci#else
3974514f5e3Sopenharmony_ci    CString assetPath = vm->GetAssetPath();
3984514f5e3Sopenharmony_ci    name = assetPath + "/" + JSPandaFile::MERGE_ABC_NAME;
3994514f5e3Sopenharmony_ci#endif
4004514f5e3Sopenharmony_ci    CString entry;
4014514f5e3Sopenharmony_ci    CString normalName = PathHelper::NormalizePath(filename);
4024514f5e3Sopenharmony_ci    ModulePathHelper::ParseAbcPathAndOhmUrl(vm, normalName, name, entry);
4034514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile = JSPandaFileManager::GetInstance()->
4044514f5e3Sopenharmony_ci        LoadJSPandaFileSecure(thread, name, entry, buffer, size, needUpdate);
4054514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
4064514f5e3Sopenharmony_ci#ifdef FUZZ_TEST
4074514f5e3Sopenharmony_ci        CString msg = "jsPandaFile is nullptr";
4084514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
4094514f5e3Sopenharmony_ci#else
4104514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "Load current file's panda file failed. Current file is " << name;
4114514f5e3Sopenharmony_ci#endif
4124514f5e3Sopenharmony_ci    }
4134514f5e3Sopenharmony_ci    AbcBufferCacheScope bufferScope(thread, name, buffer, size, AbcBufferType::SECURE_BUFFER);
4144514f5e3Sopenharmony_ci    // realEntry is used to record the original record, which is easy to throw when there are exceptions
4154514f5e3Sopenharmony_ci    const CString realEntry = entry;
4164514f5e3Sopenharmony_ci    if (vm->IsNormalizedOhmUrlPack()) {
4174514f5e3Sopenharmony_ci        entry = ModulePathHelper::TransformToNormalizedOhmUrl(vm, filename, name, entry);
4184514f5e3Sopenharmony_ci    } else if (!jsPandaFile->IsBundlePack()) {
4194514f5e3Sopenharmony_ci        jsPandaFile->CheckIsRecordWithBundleName(entry);
4204514f5e3Sopenharmony_ci        if (!jsPandaFile->IsRecordWithBundleName()) {
4214514f5e3Sopenharmony_ci            PathHelper::AdaptOldIsaRecord(entry);
4224514f5e3Sopenharmony_ci        }
4234514f5e3Sopenharmony_ci    }
4244514f5e3Sopenharmony_ci
4254514f5e3Sopenharmony_ci    // will be refactored, temporarily use the function IsModule to verify realEntry
4264514f5e3Sopenharmony_ci    JSRecordInfo *recordInfo = nullptr;
4274514f5e3Sopenharmony_ci    bool hasRecord = jsPandaFile->CheckAndGetRecordInfo(entry, &recordInfo);
4284514f5e3Sopenharmony_ci    if (!hasRecord) {
4294514f5e3Sopenharmony_ci        CString msg = "Cannot find module '" + realEntry + "' , which is application Entry Point";
4304514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
4314514f5e3Sopenharmony_ci    }
4324514f5e3Sopenharmony_ci    if (!jsPandaFile->IsModule(recordInfo)) {
4334514f5e3Sopenharmony_ci        LOG_ECMA(FATAL) << "Input file is not esmodule";
4344514f5e3Sopenharmony_ci    }
4354514f5e3Sopenharmony_ci    return CommonExecuteBuffer(thread, name, entry, jsPandaFile.get());
4364514f5e3Sopenharmony_ci}
4374514f5e3Sopenharmony_ci
4384514f5e3Sopenharmony_ci/*
4394514f5e3Sopenharmony_ci * filename: data/storage/el1/bundle/moduleName/ets/modules.abc
4404514f5e3Sopenharmony_ci * Ohmurl:   1. @bundle:bundleName/moduleName@namespace/ets/pages/Index
4414514f5e3Sopenharmony_ci *           2. @package:pkg_modules/.ohpm/pkgName/pkg_modules/pkgName/xxx/xxx
4424514f5e3Sopenharmony_ci *           3. @normalized:N&moduleName&bundleName&entryPath&version
4434514f5e3Sopenharmony_ci *           4. @normalized:N&moduleName&bundleName&entryPath&
4444514f5e3Sopenharmony_ci */
4454514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteSecureWithOhmUrl(JSThread *thread, uint8_t *buffer,
4464514f5e3Sopenharmony_ci    size_t size, const CString &filename, const CString &entryPoint)
4474514f5e3Sopenharmony_ci{
4484514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSPandaFileExecutor::ExecuteSecureWithOhmUrl with secure buffer filename:" << filename <<
4494514f5e3Sopenharmony_ci                        ", entryPoint:" << entryPoint;
4504514f5e3Sopenharmony_ci    CString traceInfo = "JSPandaFileExecutor::ExecuteSecureWithOhmUrl " + filename;
4514514f5e3Sopenharmony_ci    ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, traceInfo.c_str());
4524514f5e3Sopenharmony_ci
4534514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile = JSPandaFileManager::GetInstance()->
4544514f5e3Sopenharmony_ci        LoadJSPandaFileSecure(thread, filename, entryPoint, buffer, size);
4554514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
4564514f5e3Sopenharmony_ci#ifdef FUZZ_TEST
4574514f5e3Sopenharmony_ci        CString msg = "jsPandaFile is nullptr";
4584514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
4594514f5e3Sopenharmony_ci#else
4604514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "Load current file's panda file failed. Current file is " << filename <<
4614514f5e3Sopenharmony_ci                           ", entrypoint is:" << entryPoint;
4624514f5e3Sopenharmony_ci#endif
4634514f5e3Sopenharmony_ci    }
4644514f5e3Sopenharmony_ci    AbcBufferCacheScope bufferScope(thread, filename, buffer, size, AbcBufferType::SECURE_BUFFER);
4654514f5e3Sopenharmony_ci    JSRecordInfo *recordInfo = nullptr;
4664514f5e3Sopenharmony_ci    bool hasRecord = jsPandaFile->CheckAndGetRecordInfo(entryPoint, &recordInfo);
4674514f5e3Sopenharmony_ci    if (!hasRecord) {
4684514f5e3Sopenharmony_ci        CString msg = "Cannot find module '" + entryPoint + "' , which is application Entry Point";
4694514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
4704514f5e3Sopenharmony_ci    }
4714514f5e3Sopenharmony_ci    return CommonExecuteBuffer(thread, filename, entryPoint, jsPandaFile.get());
4724514f5e3Sopenharmony_ci}
4734514f5e3Sopenharmony_ci
4744514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::ExecuteSpecialModule(JSThread *thread, const CString &recordName,
4754514f5e3Sopenharmony_ci    const CString &filename, const JSPandaFile *jsPandaFile, const JSRecordInfo* recordInfo)
4764514f5e3Sopenharmony_ci{
4774514f5e3Sopenharmony_ci    ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
4784514f5e3Sopenharmony_ci
4794514f5e3Sopenharmony_ci    if (jsPandaFile->IsCjs(recordInfo)) {
4804514f5e3Sopenharmony_ci        moduleManager->ExecuteCjsModule(thread, recordName, jsPandaFile);
4814514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, Unexpected(false));
4824514f5e3Sopenharmony_ci        return JSTaggedValue::Undefined();
4834514f5e3Sopenharmony_ci    }
4844514f5e3Sopenharmony_ci    if (jsPandaFile->IsJson(recordInfo)) {
4854514f5e3Sopenharmony_ci        moduleManager->ExecuteJsonModule(thread, recordName, filename, jsPandaFile);
4864514f5e3Sopenharmony_ci        return JSTaggedValue::Undefined();
4874514f5e3Sopenharmony_ci    }
4884514f5e3Sopenharmony_ci    UNREACHABLE();
4894514f5e3Sopenharmony_ci    LOG_FULL(FATAL) << "this branch is unreachable";
4904514f5e3Sopenharmony_ci}
4914514f5e3Sopenharmony_ci
4924514f5e3Sopenharmony_ci// RecordName is the ohmurl-path of js files.
4934514f5e3Sopenharmony_ci// The first js file executed could be json, cjs, native so or esm.
4944514f5e3Sopenharmony_ciExpected<JSTaggedValue, bool> JSPandaFileExecutor::LazyExecuteModule(
4954514f5e3Sopenharmony_ci    JSThread *thread, CString &recordName, const CString &filename, bool isMergedAbc)
4964514f5e3Sopenharmony_ci{
4974514f5e3Sopenharmony_ci    LOG_FULL(INFO) << "recordName : " << recordName << ", in abc : " << filename;
4984514f5e3Sopenharmony_ci    CString traceInfo = "JSPandaFileExecutor::LazyExecuteModule " + filename;
4994514f5e3Sopenharmony_ci    ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, traceInfo.c_str());
5004514f5e3Sopenharmony_ci    CString newFileName = filename;
5014514f5e3Sopenharmony_ci    if (newFileName.empty()) {
5024514f5e3Sopenharmony_ci        newFileName = filename;
5034514f5e3Sopenharmony_ci    }
5044514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile =
5054514f5e3Sopenharmony_ci        JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, newFileName, recordName);
5064514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
5074514f5e3Sopenharmony_ci#ifdef FUZZ_TEST
5084514f5e3Sopenharmony_ci        CString msg = "jsPandaFile is nullptr";
5094514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
5104514f5e3Sopenharmony_ci#else
5114514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "Load file with filename '" << newFileName << "' failed, ";
5124514f5e3Sopenharmony_ci#endif
5134514f5e3Sopenharmony_ci    }
5144514f5e3Sopenharmony_ci
5154514f5e3Sopenharmony_ci    // resolve native module
5164514f5e3Sopenharmony_ci    auto [isNative, moduleType] = SourceTextModule::CheckNativeModule(recordName);
5174514f5e3Sopenharmony_ci    ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
5184514f5e3Sopenharmony_ci    if (isNative) {
5194514f5e3Sopenharmony_ci        moduleManager->ExecuteNativeModule(thread, recordName);
5204514f5e3Sopenharmony_ci        return JSTaggedValue::Undefined();
5214514f5e3Sopenharmony_ci    }
5224514f5e3Sopenharmony_ci
5234514f5e3Sopenharmony_ci    if (isMergedAbc && !jsPandaFile->HasRecord(recordName)) {
5244514f5e3Sopenharmony_ci        CString msg = "cannot find record '" + recordName + "', in lazy load abc: " + newFileName;
5254514f5e3Sopenharmony_ci        THROW_REFERENCE_ERROR_AND_RETURN(thread, msg.c_str(), Unexpected(false));
5264514f5e3Sopenharmony_ci    }
5274514f5e3Sopenharmony_ci
5284514f5e3Sopenharmony_ci    const JSRecordInfo* recordInfo = jsPandaFile->GetRecordInfo(recordName);
5294514f5e3Sopenharmony_ci    if (!jsPandaFile->IsModule(recordInfo)) {
5304514f5e3Sopenharmony_ci        return JSPandaFileExecutor::ExecuteSpecialModule(thread, recordName, newFileName, jsPandaFile.get(),
5314514f5e3Sopenharmony_ci            recordInfo);
5324514f5e3Sopenharmony_ci    }
5334514f5e3Sopenharmony_ci    [[maybe_unused]] EcmaHandleScope scope(thread);
5344514f5e3Sopenharmony_ci    // The first js file should execute at current vm.
5354514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> moduleRecord(thread->GlobalConstants()->GetHandledUndefined());
5364514f5e3Sopenharmony_ci    if (isMergedAbc) {
5374514f5e3Sopenharmony_ci        moduleRecord = moduleManager->HostResolveImportedModuleWithMerge(newFileName, recordName);
5384514f5e3Sopenharmony_ci    } else {
5394514f5e3Sopenharmony_ci        moduleRecord = moduleManager->HostResolveImportedModule(newFileName);
5404514f5e3Sopenharmony_ci    }
5414514f5e3Sopenharmony_ci    SourceTextModule::Instantiate(thread, moduleRecord);
5424514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, Unexpected(false));
5434514f5e3Sopenharmony_ci    JSHandle<SourceTextModule> module = JSHandle<SourceTextModule>::Cast(moduleRecord);
5444514f5e3Sopenharmony_ci    SourceTextModule::Evaluate(thread, module, nullptr, 0);
5454514f5e3Sopenharmony_ci    return JSTaggedValue::Undefined();
5464514f5e3Sopenharmony_ci}
5474514f5e3Sopenharmony_ci
5484514f5e3Sopenharmony_ciint JSPandaFileExecutor::ExecuteAbcFileWithSingletonPatternFlag(JSThread *thread,
5494514f5e3Sopenharmony_ci    [[maybe_unused]] const CString &bundleName, const CString &moduleName, const CString &entry,
5504514f5e3Sopenharmony_ci    bool isSingletonPattern)
5514514f5e3Sopenharmony_ci{
5524514f5e3Sopenharmony_ci    CString abcFilePath = ModulePathHelper::ConcatPandaFilePath(moduleName);
5534514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile =
5544514f5e3Sopenharmony_ci        JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, abcFilePath, entry);
5554514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
5564514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "When the route jump, loading panda file failed. Current file is " << abcFilePath;
5574514f5e3Sopenharmony_ci        return ROUTE_URI_ERROR;
5584514f5e3Sopenharmony_ci    }
5594514f5e3Sopenharmony_ci    CString entryPoint = ModulePathHelper::ConcatFileNameWithMerge(thread, jsPandaFile.get(),
5604514f5e3Sopenharmony_ci        abcFilePath, "", entry);
5614514f5e3Sopenharmony_ci    JSRecordInfo *recordInfo = nullptr;
5624514f5e3Sopenharmony_ci    bool hasRecord = jsPandaFile->CheckAndGetRecordInfo(entryPoint, &recordInfo);
5634514f5e3Sopenharmony_ci    if (!hasRecord) {
5644514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "When the route jump, Cannot find module '" << entryPoint << "'";
5654514f5e3Sopenharmony_ci        return ROUTE_URI_ERROR;
5664514f5e3Sopenharmony_ci    }
5674514f5e3Sopenharmony_ci    ASSERT(jsPandaFile->IsModule(recordInfo));
5684514f5e3Sopenharmony_ci    [[maybe_unused]] EcmaHandleScope scope(thread);
5694514f5e3Sopenharmony_ci    ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
5704514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> moduleRecord(thread->GlobalConstants()->GetHandledUndefined());
5714514f5e3Sopenharmony_ci    ASSERT(!jsPandaFile->IsBundlePack());
5724514f5e3Sopenharmony_ci    moduleRecord = moduleManager->HostResolveImportedModuleWithMerge(abcFilePath, entryPoint);
5734514f5e3Sopenharmony_ci    SourceTextModule::Instantiate(thread, moduleRecord);
5744514f5e3Sopenharmony_ci    if (thread->HasPendingException()) {
5754514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, ROUTE_INTERNAL_ERROR);
5764514f5e3Sopenharmony_ci    }
5774514f5e3Sopenharmony_ci    JSHandle<SourceTextModule> module = JSHandle<SourceTextModule>::Cast(moduleRecord);
5784514f5e3Sopenharmony_ci    if (!isSingletonPattern) {
5794514f5e3Sopenharmony_ci        LOG_ECMA(INFO) << "Route jump to non-singleton page: " << entryPoint;
5804514f5e3Sopenharmony_ci        module->SetStatus(ModuleStatus::INSTANTIATED);
5814514f5e3Sopenharmony_ci    } else {
5824514f5e3Sopenharmony_ci        LOG_ECMA(INFO) << "Route jump to singleton page: " << entryPoint;
5834514f5e3Sopenharmony_ci    }
5844514f5e3Sopenharmony_ci    SourceTextModule::Evaluate(thread, module, nullptr, 0);
5854514f5e3Sopenharmony_ci    if (thread->HasPendingException()) {
5864514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, ROUTE_INTERNAL_ERROR);
5874514f5e3Sopenharmony_ci    }
5884514f5e3Sopenharmony_ci    return ROUTE_SUCCESS;
5894514f5e3Sopenharmony_ci}
5904514f5e3Sopenharmony_ci
5914514f5e3Sopenharmony_cibool JSPandaFileExecutor::IsExecuteModuleInAbcFile(JSThread *thread, [[maybe_unused]] const CString &bundleName,
5924514f5e3Sopenharmony_ci    const CString &moduleName, const CString &entry)
5934514f5e3Sopenharmony_ci{
5944514f5e3Sopenharmony_ci    CString abcFilePath = ModulePathHelper::ConcatPandaFilePath(moduleName);
5954514f5e3Sopenharmony_ci    bool isValid = JSPandaFileManager::GetInstance()->CheckFilePath(thread, abcFilePath);
5964514f5e3Sopenharmony_ci    if (!isValid) {
5974514f5e3Sopenharmony_ci        return false;
5984514f5e3Sopenharmony_ci    }
5994514f5e3Sopenharmony_ci    std::shared_ptr<JSPandaFile> jsPandaFile =
6004514f5e3Sopenharmony_ci        JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, abcFilePath, entry);
6014514f5e3Sopenharmony_ci    if (jsPandaFile == nullptr) {
6024514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "When checking if module is in abc file, loading panda file failed. Current file is " <<
6034514f5e3Sopenharmony_ci            abcFilePath;
6044514f5e3Sopenharmony_ci        return false;
6054514f5e3Sopenharmony_ci    }
6064514f5e3Sopenharmony_ci    CString entryPoint = ModulePathHelper::ConcatFileNameWithMerge(thread, jsPandaFile.get(),
6074514f5e3Sopenharmony_ci        abcFilePath, "", entry);
6084514f5e3Sopenharmony_ci    JSRecordInfo *recordInfo = nullptr;
6094514f5e3Sopenharmony_ci    bool hasRecord = jsPandaFile->CheckAndGetRecordInfo(entryPoint, &recordInfo);
6104514f5e3Sopenharmony_ci    if (!hasRecord) {
6114514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "When checking if module is in abc file, Cannot find module '" << entryPoint << "'";
6124514f5e3Sopenharmony_ci        return false;
6134514f5e3Sopenharmony_ci    }
6144514f5e3Sopenharmony_ci    return true;
6154514f5e3Sopenharmony_ci}
6164514f5e3Sopenharmony_ci}  // namespace panda::ecmascript
617