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