14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2022-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#ifndef ECMASCRIPT_JSPANDAFILE_JS_PANDAFILE_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_JSPANDAFILE_JS_PANDAFILE_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include "ecmascript/common.h" 204514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/constpool_value.h" 214514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/method_literal.h" 224514f5e3Sopenharmony_ci#include "ecmascript/log_wrapper.h" 234514f5e3Sopenharmony_ci#include "ecmascript/mem/c_containers.h" 244514f5e3Sopenharmony_ci#include "ecmascript/platform/mutex.h" 254514f5e3Sopenharmony_ci#include "ecmascript/taskpool/task.h" 264514f5e3Sopenharmony_ci 274514f5e3Sopenharmony_ci#include "libpandafile/file-inl.h" 284514f5e3Sopenharmony_ci#include "libpandafile/file_items.h" 294514f5e3Sopenharmony_ci#include "libpandafile/literal_data_accessor.h" 304514f5e3Sopenharmony_ci 314514f5e3Sopenharmony_cinamespace panda { 324514f5e3Sopenharmony_cinamespace ecmascript { 334514f5e3Sopenharmony_ciclass JSPandaFile { 344514f5e3Sopenharmony_cipublic: 354514f5e3Sopenharmony_ci struct JSRecordInfo { 364514f5e3Sopenharmony_ci uint32_t mainMethodIndex {0}; 374514f5e3Sopenharmony_ci bool isCjs {false}; 384514f5e3Sopenharmony_ci bool isJson {false}; 394514f5e3Sopenharmony_ci bool isSharedModule {false}; 404514f5e3Sopenharmony_ci int jsonStringId {-1}; 414514f5e3Sopenharmony_ci CUnorderedSet<const EcmaVM *> vmListOfParsedConstPool; 424514f5e3Sopenharmony_ci int moduleRecordIdx {-1}; 434514f5e3Sopenharmony_ci bool hasTopLevelAwait {false}; 444514f5e3Sopenharmony_ci CUnorderedMap<uint32_t, uint64_t> constpoolMap; 454514f5e3Sopenharmony_ci uint32_t lazyImportIdx {0}; 464514f5e3Sopenharmony_ci uint32_t classId {CLASSID_OFFSET_NOT_FOUND}; 474514f5e3Sopenharmony_ci CString npmPackageName; 484514f5e3Sopenharmony_ci 494514f5e3Sopenharmony_ci void SetParsedConstpoolVM(const EcmaVM *vm) 504514f5e3Sopenharmony_ci { 514514f5e3Sopenharmony_ci vmListOfParsedConstPool.insert(vm); 524514f5e3Sopenharmony_ci } 534514f5e3Sopenharmony_ci 544514f5e3Sopenharmony_ci bool IsParsedConstpoolOfCurrentVM(const EcmaVM *vm) const 554514f5e3Sopenharmony_ci { 564514f5e3Sopenharmony_ci auto iter = vmListOfParsedConstPool.find(vm); 574514f5e3Sopenharmony_ci if (iter != vmListOfParsedConstPool.end()) { 584514f5e3Sopenharmony_ci return true; 594514f5e3Sopenharmony_ci } 604514f5e3Sopenharmony_ci return false; 614514f5e3Sopenharmony_ci } 624514f5e3Sopenharmony_ci }; 634514f5e3Sopenharmony_ci static constexpr char ENTRY_FUNCTION_NAME[] = "func_main_0"; 644514f5e3Sopenharmony_ci static constexpr char ENTRY_MAIN_FUNCTION[] = "_GLOBAL::func_main_0"; 654514f5e3Sopenharmony_ci static constexpr char PATCH_MAIN_FUNCTION[] = "_GLOBAL::patch_main_0"; 664514f5e3Sopenharmony_ci static constexpr char PATCH_FUNCTION_NAME_0[] = "patch_main_0"; 674514f5e3Sopenharmony_ci static constexpr char PATCH_FUNCTION_NAME_1[] = "patch_main_1"; 684514f5e3Sopenharmony_ci 694514f5e3Sopenharmony_ci static constexpr char MODULE_CLASS[] = "L_ESModuleRecord;"; 704514f5e3Sopenharmony_ci static constexpr char COMMONJS_CLASS[] = "L_CommonJsRecord;"; 714514f5e3Sopenharmony_ci static constexpr char HASTLA_CLASS[] = "L_HasTopLevelAwait;"; 724514f5e3Sopenharmony_ci 734514f5e3Sopenharmony_ci static constexpr char IS_COMMON_JS[] = "isCommonjs"; 744514f5e3Sopenharmony_ci static constexpr char IS_JSON_CONTENT[] = "jsonFileContent"; 754514f5e3Sopenharmony_ci static constexpr char MODULE_RECORD_IDX[] = "moduleRecordIdx"; 764514f5e3Sopenharmony_ci static constexpr char IS_SHARED_MODULE[] = "isSharedModule"; 774514f5e3Sopenharmony_ci static constexpr char HAS_TOP_LEVEL_AWAIT[] = "hasTopLevelAwait"; 784514f5e3Sopenharmony_ci static constexpr char LAZY_IMPORT[] = "moduleRequestPhaseIdx"; 794514f5e3Sopenharmony_ci static constexpr char PACKAGE_NAME[] = "pkgName@"; 804514f5e3Sopenharmony_ci static constexpr char MERGE_ABC_NAME[] = "modules.abc"; 814514f5e3Sopenharmony_ci static constexpr char NPM_PATH_SEGMENT[] = "node_modules"; 824514f5e3Sopenharmony_ci static constexpr char PACKAGE_PATH_SEGMENT[] = "pkg_modules"; 834514f5e3Sopenharmony_ci static constexpr char BUNDLE_INSTALL_PATH[] = "/data/storage/el1/bundle/"; 844514f5e3Sopenharmony_ci static constexpr int PACKAGE_NAME_LEN = 8; 854514f5e3Sopenharmony_ci static constexpr int TYPE_SUMMARY_OFFSET_NOT_FOUND = 0; 864514f5e3Sopenharmony_ci static constexpr int CLASSID_OFFSET_NOT_FOUND = 0; 874514f5e3Sopenharmony_ci static constexpr int32_t PF_OFFSET = 0; 884514f5e3Sopenharmony_ci 894514f5e3Sopenharmony_ci JSPandaFile(const panda_file::File *pf, const CString &descriptor); 904514f5e3Sopenharmony_ci ~JSPandaFile(); 914514f5e3Sopenharmony_ci 924514f5e3Sopenharmony_ci class TranslateClassesTask : public Task { 934514f5e3Sopenharmony_ci public: 944514f5e3Sopenharmony_ci TranslateClassesTask(int32_t id, JSThread *thread, JSPandaFile *jsPandaFile, 954514f5e3Sopenharmony_ci const std::shared_ptr<CString> &methodNamePtr) 964514f5e3Sopenharmony_ci : Task(id), thread_(thread), jsPandaFile_(jsPandaFile), methodNamePtr_(methodNamePtr) {}; 974514f5e3Sopenharmony_ci ~TranslateClassesTask() override = default; 984514f5e3Sopenharmony_ci bool Run(uint32_t threadIndex) override; 994514f5e3Sopenharmony_ci 1004514f5e3Sopenharmony_ci NO_COPY_SEMANTIC(TranslateClassesTask); 1014514f5e3Sopenharmony_ci NO_MOVE_SEMANTIC(TranslateClassesTask); 1024514f5e3Sopenharmony_ci 1034514f5e3Sopenharmony_ci private: 1044514f5e3Sopenharmony_ci JSThread *thread_ {nullptr}; 1054514f5e3Sopenharmony_ci JSPandaFile *jsPandaFile_ {nullptr}; 1064514f5e3Sopenharmony_ci std::shared_ptr<CString> methodNamePtr_; 1074514f5e3Sopenharmony_ci }; 1084514f5e3Sopenharmony_ci 1094514f5e3Sopenharmony_ci const CString &GetJSPandaFileDesc() const 1104514f5e3Sopenharmony_ci { 1114514f5e3Sopenharmony_ci return desc_; 1124514f5e3Sopenharmony_ci } 1134514f5e3Sopenharmony_ci 1144514f5e3Sopenharmony_ci CString PUBLIC_API GetNormalizedFileDesc() const; 1154514f5e3Sopenharmony_ci 1164514f5e3Sopenharmony_ci void SetHapPath(const CString &hapPath) 1174514f5e3Sopenharmony_ci { 1184514f5e3Sopenharmony_ci hapPath_ = hapPath; 1194514f5e3Sopenharmony_ci } 1204514f5e3Sopenharmony_ci 1214514f5e3Sopenharmony_ci const CString &GetJSPandaFileHapPath() const 1224514f5e3Sopenharmony_ci { 1234514f5e3Sopenharmony_ci return hapPath_; 1244514f5e3Sopenharmony_ci } 1254514f5e3Sopenharmony_ci 1264514f5e3Sopenharmony_ci static CString PUBLIC_API GetNormalizedFileDesc(const CString &desc); 1274514f5e3Sopenharmony_ci 1284514f5e3Sopenharmony_ci uint32_t GetChecksum() const 1294514f5e3Sopenharmony_ci { 1304514f5e3Sopenharmony_ci return checksum_; 1314514f5e3Sopenharmony_ci } 1324514f5e3Sopenharmony_ci 1334514f5e3Sopenharmony_ci const panda_file::File *GetPandaFile() const 1344514f5e3Sopenharmony_ci { 1354514f5e3Sopenharmony_ci return pf_; 1364514f5e3Sopenharmony_ci } 1374514f5e3Sopenharmony_ci 1384514f5e3Sopenharmony_ci std::pair<std::string_view, bool> GetMethodName(EntityId methodId); 1394514f5e3Sopenharmony_ci std::pair<std::string_view, bool> GetCpuProfilerMethodName(EntityId methodId) const; 1404514f5e3Sopenharmony_ci CString GetRecordName(EntityId methodId); 1414514f5e3Sopenharmony_ci CString PUBLIC_API GetRecordNameWithBundlePack(EntityId methodIdx); 1424514f5e3Sopenharmony_ci 1434514f5e3Sopenharmony_ci MethodLiteral* GetMethodLiterals() const 1444514f5e3Sopenharmony_ci { 1454514f5e3Sopenharmony_ci return methodLiterals_; 1464514f5e3Sopenharmony_ci } 1474514f5e3Sopenharmony_ci 1484514f5e3Sopenharmony_ci void SetMethodLiteralToMap(MethodLiteral *methodLiteral) 1494514f5e3Sopenharmony_ci { 1504514f5e3Sopenharmony_ci ASSERT(methodLiteral != nullptr); 1514514f5e3Sopenharmony_ci methodLiteralMap_.emplace(methodLiteral->GetMethodId().GetOffset(), methodLiteral); 1524514f5e3Sopenharmony_ci } 1534514f5e3Sopenharmony_ci 1544514f5e3Sopenharmony_ci const CUnorderedMap<uint32_t, MethodLiteral *> &GetMethodLiteralMap() const 1554514f5e3Sopenharmony_ci { 1564514f5e3Sopenharmony_ci return methodLiteralMap_; 1574514f5e3Sopenharmony_ci } 1584514f5e3Sopenharmony_ci 1594514f5e3Sopenharmony_ci MethodLiteral *GetMethodLiteralByIndex(uint32_t index) const 1604514f5e3Sopenharmony_ci { 1614514f5e3Sopenharmony_ci auto info = methodLiteralMap_.find(index); 1624514f5e3Sopenharmony_ci if (info != methodLiteralMap_.end()) { 1634514f5e3Sopenharmony_ci return info->second; 1644514f5e3Sopenharmony_ci } 1654514f5e3Sopenharmony_ci return nullptr; 1664514f5e3Sopenharmony_ci } 1674514f5e3Sopenharmony_ci 1684514f5e3Sopenharmony_ci uint32_t GetNumMethods() const 1694514f5e3Sopenharmony_ci { 1704514f5e3Sopenharmony_ci return numMethods_; 1714514f5e3Sopenharmony_ci } 1724514f5e3Sopenharmony_ci 1734514f5e3Sopenharmony_ci uint32_t GetConstpoolIndex() const 1744514f5e3Sopenharmony_ci { 1754514f5e3Sopenharmony_ci return constpoolIndex_; 1764514f5e3Sopenharmony_ci } 1774514f5e3Sopenharmony_ci 1784514f5e3Sopenharmony_ci uint32_t GetMainMethodIndex(const CString &recordName = ENTRY_FUNCTION_NAME, bool isNewVersion = false) const 1794514f5e3Sopenharmony_ci { 1804514f5e3Sopenharmony_ci if (IsBundlePack()) { 1814514f5e3Sopenharmony_ci return jsRecordInfo_.begin()->second->mainMethodIndex; 1824514f5e3Sopenharmony_ci } 1834514f5e3Sopenharmony_ci auto info = jsRecordInfo_.find(recordName); 1844514f5e3Sopenharmony_ci if (info != jsRecordInfo_.end()) { 1854514f5e3Sopenharmony_ci return info->second->mainMethodIndex; 1864514f5e3Sopenharmony_ci } 1874514f5e3Sopenharmony_ci 1884514f5e3Sopenharmony_ci if (isNewVersion) { 1894514f5e3Sopenharmony_ci for (auto recordInfo : jsRecordInfo_) { 1904514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "All current record info: " << recordInfo.first; 1914514f5e3Sopenharmony_ci } 1924514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "can not get main method index: " << recordName; 1934514f5e3Sopenharmony_ci UNREACHABLE(); 1944514f5e3Sopenharmony_ci } 1954514f5e3Sopenharmony_ci 1964514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "can not get main method index: " << recordName; 1974514f5e3Sopenharmony_ci return 0; 1984514f5e3Sopenharmony_ci } 1994514f5e3Sopenharmony_ci 2004514f5e3Sopenharmony_ci const CUnorderedMap<uint32_t, uint64_t> *GetConstpoolMapByReocrd(const CString &recordName) const 2014514f5e3Sopenharmony_ci { 2024514f5e3Sopenharmony_ci auto info = jsRecordInfo_.find(recordName); 2034514f5e3Sopenharmony_ci if (info != jsRecordInfo_.end()) { 2044514f5e3Sopenharmony_ci return &info->second->constpoolMap; 2054514f5e3Sopenharmony_ci } 2064514f5e3Sopenharmony_ci LOG_FULL(FATAL) << "find entryPoint failed: " << recordName; 2074514f5e3Sopenharmony_ci UNREACHABLE(); 2084514f5e3Sopenharmony_ci } 2094514f5e3Sopenharmony_ci 2104514f5e3Sopenharmony_ci const CUnorderedMap<uint32_t, uint64_t> &GetConstpoolMap() const 2114514f5e3Sopenharmony_ci { 2124514f5e3Sopenharmony_ci return constpoolMap_; 2134514f5e3Sopenharmony_ci } 2144514f5e3Sopenharmony_ci 2154514f5e3Sopenharmony_ci uint32_t PUBLIC_API GetOrInsertConstantPool(ConstPoolType type, uint32_t offset, 2164514f5e3Sopenharmony_ci const CUnorderedMap<uint32_t, uint64_t> *constpoolMap = nullptr); 2174514f5e3Sopenharmony_ci 2184514f5e3Sopenharmony_ci void UpdateMainMethodIndex(uint32_t mainMethodIndex, const CString &recordName = ENTRY_FUNCTION_NAME) 2194514f5e3Sopenharmony_ci { 2204514f5e3Sopenharmony_ci LockHolder lock(jsRecordInfoMutex_); 2214514f5e3Sopenharmony_ci if (IsBundlePack()) { 2224514f5e3Sopenharmony_ci jsRecordInfo_.begin()->second->mainMethodIndex = mainMethodIndex; 2234514f5e3Sopenharmony_ci } else { 2244514f5e3Sopenharmony_ci auto info = jsRecordInfo_.find(recordName); 2254514f5e3Sopenharmony_ci if (info != jsRecordInfo_.end()) { 2264514f5e3Sopenharmony_ci info->second->mainMethodIndex = mainMethodIndex; 2274514f5e3Sopenharmony_ci } 2284514f5e3Sopenharmony_ci } 2294514f5e3Sopenharmony_ci } 2304514f5e3Sopenharmony_ci 2314514f5e3Sopenharmony_ci PUBLIC_API MethodLiteral *FindMethodLiteral(uint32_t offset) const; 2324514f5e3Sopenharmony_ci 2334514f5e3Sopenharmony_ci int GetModuleRecordIdx(const CString &recordName = ENTRY_FUNCTION_NAME) const 2344514f5e3Sopenharmony_ci { 2354514f5e3Sopenharmony_ci if (IsBundlePack()) { 2364514f5e3Sopenharmony_ci return jsRecordInfo_.begin()->second->moduleRecordIdx; 2374514f5e3Sopenharmony_ci } 2384514f5e3Sopenharmony_ci auto info = jsRecordInfo_.find(recordName); 2394514f5e3Sopenharmony_ci if (info != jsRecordInfo_.end()) { 2404514f5e3Sopenharmony_ci return info->second->moduleRecordIdx; 2414514f5e3Sopenharmony_ci } 2424514f5e3Sopenharmony_ci // The array subscript will not have a negative number, and returning -1 means the search failed 2434514f5e3Sopenharmony_ci return -1; 2444514f5e3Sopenharmony_ci } 2454514f5e3Sopenharmony_ci 2464514f5e3Sopenharmony_ci int GetHasTopLevelAwait(const CString &recordName = ENTRY_FUNCTION_NAME) const 2474514f5e3Sopenharmony_ci { 2484514f5e3Sopenharmony_ci if (IsBundlePack()) { 2494514f5e3Sopenharmony_ci return jsRecordInfo_.begin()->second->hasTopLevelAwait; 2504514f5e3Sopenharmony_ci } 2514514f5e3Sopenharmony_ci auto info = jsRecordInfo_.find(recordName); 2524514f5e3Sopenharmony_ci if (info != jsRecordInfo_.end()) { 2534514f5e3Sopenharmony_ci return info->second->hasTopLevelAwait; 2544514f5e3Sopenharmony_ci } 2554514f5e3Sopenharmony_ci return false; 2564514f5e3Sopenharmony_ci } 2574514f5e3Sopenharmony_ci 2584514f5e3Sopenharmony_ci Span<const uint32_t> GetClasses() const 2594514f5e3Sopenharmony_ci { 2604514f5e3Sopenharmony_ci return pf_->GetClasses(); 2614514f5e3Sopenharmony_ci } 2624514f5e3Sopenharmony_ci 2634514f5e3Sopenharmony_ci inline bool IsExternal(panda_file::File::EntityId id) const 2644514f5e3Sopenharmony_ci { 2654514f5e3Sopenharmony_ci return pf_->IsExternal(id); 2664514f5e3Sopenharmony_ci } 2674514f5e3Sopenharmony_ci 2684514f5e3Sopenharmony_ci inline bool Contain(uint8_t *data) const 2694514f5e3Sopenharmony_ci { 2704514f5e3Sopenharmony_ci uintptr_t header = ToUintPtr(GetHeader()); 2714514f5e3Sopenharmony_ci uintptr_t dataPointer = ToUintPtr(data); 2724514f5e3Sopenharmony_ci if (header < dataPointer && dataPointer < (header + GetFileSize())) { 2734514f5e3Sopenharmony_ci return true; 2744514f5e3Sopenharmony_ci } 2754514f5e3Sopenharmony_ci return false; 2764514f5e3Sopenharmony_ci } 2774514f5e3Sopenharmony_ci 2784514f5e3Sopenharmony_ci inline panda_file::File::StringData GetStringData(panda_file::File::EntityId id) const 2794514f5e3Sopenharmony_ci { 2804514f5e3Sopenharmony_ci return pf_->GetStringData(id); 2814514f5e3Sopenharmony_ci } 2824514f5e3Sopenharmony_ci 2834514f5e3Sopenharmony_ci panda_file::File::EntityId ResolveMethodIndex(panda_file::File::EntityId id, uint16_t idx) const 2844514f5e3Sopenharmony_ci { 2854514f5e3Sopenharmony_ci return pf_->ResolveMethodIndex(id, idx); 2864514f5e3Sopenharmony_ci } 2874514f5e3Sopenharmony_ci 2884514f5e3Sopenharmony_ci panda_file::LiteralDataAccessor GetLiteralDataAccessor() const 2894514f5e3Sopenharmony_ci { 2904514f5e3Sopenharmony_ci EntityId literalArraysId = pf_->GetLiteralArraysId(); 2914514f5e3Sopenharmony_ci panda_file::LiteralDataAccessor lda(*pf_, literalArraysId); 2924514f5e3Sopenharmony_ci return lda; 2934514f5e3Sopenharmony_ci } 2944514f5e3Sopenharmony_ci 2954514f5e3Sopenharmony_ci uint32_t GetConstpoolNum() const 2964514f5e3Sopenharmony_ci { 2974514f5e3Sopenharmony_ci return pf_->GetHeader()->num_indexes; 2984514f5e3Sopenharmony_ci } 2994514f5e3Sopenharmony_ci 3004514f5e3Sopenharmony_ci Span<const panda_file::File::EntityId> GetMethodIndex(const panda_file::File::IndexHeader *indexHeader) const 3014514f5e3Sopenharmony_ci { 3024514f5e3Sopenharmony_ci return pf_->GetMethodIndex(indexHeader); 3034514f5e3Sopenharmony_ci } 3044514f5e3Sopenharmony_ci 3054514f5e3Sopenharmony_ci const void *GetHeader() const 3064514f5e3Sopenharmony_ci { 3074514f5e3Sopenharmony_ci return static_cast<const void *>(pf_->GetHeader()); 3084514f5e3Sopenharmony_ci } 3094514f5e3Sopenharmony_ci 3104514f5e3Sopenharmony_ci uint32_t GetFileSize() const 3114514f5e3Sopenharmony_ci { 3124514f5e3Sopenharmony_ci return pf_->GetHeader()->file_size; 3134514f5e3Sopenharmony_ci } 3144514f5e3Sopenharmony_ci 3154514f5e3Sopenharmony_ci bool CheckAndGetRecordInfo(const CString &recordName, JSRecordInfo **recordInfo) const; 3164514f5e3Sopenharmony_ci 3174514f5e3Sopenharmony_ci const JSRecordInfo* GetRecordInfo(const CString &recordName); 3184514f5e3Sopenharmony_ci 3194514f5e3Sopenharmony_ci CString GetJsonStringId(const JSRecordInfo &jsRecordInfo) const; 3204514f5e3Sopenharmony_ci 3214514f5e3Sopenharmony_ci bool PUBLIC_API IsModule(const JSRecordInfo *jsRecordInfo) const 3224514f5e3Sopenharmony_ci { 3234514f5e3Sopenharmony_ci return jsRecordInfo->moduleRecordIdx != -1; 3244514f5e3Sopenharmony_ci } 3254514f5e3Sopenharmony_ci 3264514f5e3Sopenharmony_ci bool IsCjs(const JSRecordInfo *jsRecordInfo) const 3274514f5e3Sopenharmony_ci { 3284514f5e3Sopenharmony_ci return jsRecordInfo->isCjs; 3294514f5e3Sopenharmony_ci } 3304514f5e3Sopenharmony_ci 3314514f5e3Sopenharmony_ci bool IsJson(const JSRecordInfo *jsRecordInfo) const 3324514f5e3Sopenharmony_ci { 3334514f5e3Sopenharmony_ci return jsRecordInfo->isJson; 3344514f5e3Sopenharmony_ci } 3354514f5e3Sopenharmony_ci 3364514f5e3Sopenharmony_ci bool IsSharedModule(const JSRecordInfo *jsRecordInfo) const 3374514f5e3Sopenharmony_ci { 3384514f5e3Sopenharmony_ci return jsRecordInfo->isSharedModule; 3394514f5e3Sopenharmony_ci } 3404514f5e3Sopenharmony_ci 3414514f5e3Sopenharmony_ci bool IsBundlePack() const 3424514f5e3Sopenharmony_ci { 3434514f5e3Sopenharmony_ci return isBundlePack_; 3444514f5e3Sopenharmony_ci } 3454514f5e3Sopenharmony_ci 3464514f5e3Sopenharmony_ci bool IsLoadedAOT() const 3474514f5e3Sopenharmony_ci { 3484514f5e3Sopenharmony_ci return (GetAOTFileInfoIndex() != INVALID_INDEX); 3494514f5e3Sopenharmony_ci } 3504514f5e3Sopenharmony_ci 3514514f5e3Sopenharmony_ci uint32_t GetFileUniqId() const 3524514f5e3Sopenharmony_ci { 3534514f5e3Sopenharmony_ci return static_cast<uint32_t>(GetPandaFile()->GetUniqId()); 3544514f5e3Sopenharmony_ci } 3554514f5e3Sopenharmony_ci 3564514f5e3Sopenharmony_ci bool IsNewVersion() const 3574514f5e3Sopenharmony_ci { 3584514f5e3Sopenharmony_ci return isNewVersion_; 3594514f5e3Sopenharmony_ci } 3604514f5e3Sopenharmony_ci 3614514f5e3Sopenharmony_ci bool HasRecord(const CString &recordName) const 3624514f5e3Sopenharmony_ci { 3634514f5e3Sopenharmony_ci return jsRecordInfo_.find(recordName) != jsRecordInfo_.end(); 3644514f5e3Sopenharmony_ci } 3654514f5e3Sopenharmony_ci 3664514f5e3Sopenharmony_ci JSRecordInfo &FindRecordInfo(const CString &recordName) 3674514f5e3Sopenharmony_ci { 3684514f5e3Sopenharmony_ci auto info = jsRecordInfo_.find(recordName); 3694514f5e3Sopenharmony_ci // check entry name, fix framework abc find recordName fail bug 3704514f5e3Sopenharmony_ci if (recordName == "_GLOBAL") { 3714514f5e3Sopenharmony_ci info = jsRecordInfo_.find(ENTRY_FUNCTION_NAME); 3724514f5e3Sopenharmony_ci } 3734514f5e3Sopenharmony_ci if (info == jsRecordInfo_.end()) { 3744514f5e3Sopenharmony_ci LOG_FULL(FATAL) << "find recordName failed: " << recordName; 3754514f5e3Sopenharmony_ci UNREACHABLE(); 3764514f5e3Sopenharmony_ci } 3774514f5e3Sopenharmony_ci return *(info->second); 3784514f5e3Sopenharmony_ci } 3794514f5e3Sopenharmony_ci 3804514f5e3Sopenharmony_ci // note : it only uses in TDD 3814514f5e3Sopenharmony_ci void InsertJSRecordInfo(const CString &recordName) 3824514f5e3Sopenharmony_ci { 3834514f5e3Sopenharmony_ci JSRecordInfo* info = new JSRecordInfo(); 3844514f5e3Sopenharmony_ci jsRecordInfo_.insert({recordName, info}); 3854514f5e3Sopenharmony_ci } 3864514f5e3Sopenharmony_ci 3874514f5e3Sopenharmony_ci const CUnorderedMap<CString, JSRecordInfo*> &GetJSRecordInfo() const 3884514f5e3Sopenharmony_ci { 3894514f5e3Sopenharmony_ci return jsRecordInfo_; 3904514f5e3Sopenharmony_ci } 3914514f5e3Sopenharmony_ci 3924514f5e3Sopenharmony_ci static CString ParseEntryPoint(const CString &desc) 3934514f5e3Sopenharmony_ci { 3944514f5e3Sopenharmony_ci return desc.substr(1, desc.size() - 2); // 2 : skip symbol "L" and ";" 3954514f5e3Sopenharmony_ci } 3964514f5e3Sopenharmony_ci 3974514f5e3Sopenharmony_ci void CheckIsBundlePack(); 3984514f5e3Sopenharmony_ci void CheckIsRecordWithBundleName(const CString &entry); 3994514f5e3Sopenharmony_ci bool IsRecordWithBundleName() const 4004514f5e3Sopenharmony_ci { 4014514f5e3Sopenharmony_ci return isRecordWithBundleName_; 4024514f5e3Sopenharmony_ci } 4034514f5e3Sopenharmony_ci CString GetEntryPoint(const CString &recordName) const; 4044514f5e3Sopenharmony_ci CString GetRecordName(const CString &entryPoint) const; 4054514f5e3Sopenharmony_ci bool FindOhmUrlInPF(const CString &recordName, CString &entryPoint) const; 4064514f5e3Sopenharmony_ci uint32_t GetAOTFileInfoIndex() const 4074514f5e3Sopenharmony_ci { 4084514f5e3Sopenharmony_ci return anFileInfoIndex_; 4094514f5e3Sopenharmony_ci } 4104514f5e3Sopenharmony_ci 4114514f5e3Sopenharmony_ci void SetAOTFileInfoIndex(uint32_t index) 4124514f5e3Sopenharmony_ci { 4134514f5e3Sopenharmony_ci if (IsLoadedAOT()) { 4144514f5e3Sopenharmony_ci LOG_ECMA(ERROR) << "Set Aot file info index failed. desc: " << GetJSPandaFileDesc() 4154514f5e3Sopenharmony_ci << ", anFileIndex: " << anFileInfoIndex_ << " vs " << index; 4164514f5e3Sopenharmony_ci return; 4174514f5e3Sopenharmony_ci } 4184514f5e3Sopenharmony_ci anFileInfoIndex_ = index; 4194514f5e3Sopenharmony_ci } 4204514f5e3Sopenharmony_ci 4214514f5e3Sopenharmony_ci static bool IsEntryOrPatch(const CString &name) 4224514f5e3Sopenharmony_ci { 4234514f5e3Sopenharmony_ci return (name == PATCH_FUNCTION_NAME_0) || (name == ENTRY_FUNCTION_NAME); 4244514f5e3Sopenharmony_ci } 4254514f5e3Sopenharmony_ci 4264514f5e3Sopenharmony_ci void DeleteParsedConstpoolVM(const EcmaVM *vm) 4274514f5e3Sopenharmony_ci { 4284514f5e3Sopenharmony_ci for (auto &recordInfo : jsRecordInfo_) { 4294514f5e3Sopenharmony_ci recordInfo.second->vmListOfParsedConstPool.erase(vm); 4304514f5e3Sopenharmony_ci } 4314514f5e3Sopenharmony_ci } 4324514f5e3Sopenharmony_ci static FunctionKind PUBLIC_API GetFunctionKind(panda_file::FunctionKind funcKind); 4334514f5e3Sopenharmony_ci static FunctionKind GetFunctionKind(ConstPoolType type); 4344514f5e3Sopenharmony_ci static bool PUBLIC_API IsSendableFunctionKind(panda_file::FunctionKind funcKind) 4354514f5e3Sopenharmony_ci { 4364514f5e3Sopenharmony_ci return (static_cast<uint32_t>(funcKind) & SENDABLE_FUNCTION_MASK) != 0; 4374514f5e3Sopenharmony_ci } 4384514f5e3Sopenharmony_ci 4394514f5e3Sopenharmony_ci bool PUBLIC_API IsFirstMergedAbc() const; 4404514f5e3Sopenharmony_ci const void *GetBase() const 4414514f5e3Sopenharmony_ci { 4424514f5e3Sopenharmony_ci return static_cast<const void *>(pf_->GetBase()); 4434514f5e3Sopenharmony_ci } 4444514f5e3Sopenharmony_ci 4454514f5e3Sopenharmony_ci void ClearNameMap(); 4464514f5e3Sopenharmony_ci 4474514f5e3Sopenharmony_ci void TranslateClasses(JSThread *thread, const CString &methodName); 4484514f5e3Sopenharmony_ci 4494514f5e3Sopenharmony_ciprivate: 4504514f5e3Sopenharmony_ci void InitializeUnMergedPF(); 4514514f5e3Sopenharmony_ci void InitializeMergedPF(); 4524514f5e3Sopenharmony_ci 4534514f5e3Sopenharmony_ci void WaitTranslateClassTaskFinished(); 4544514f5e3Sopenharmony_ci 4554514f5e3Sopenharmony_ci void NotifyTranslateClassTaskCompleted(); 4564514f5e3Sopenharmony_ci 4574514f5e3Sopenharmony_ci void IncreaseTaskCount(); 4584514f5e3Sopenharmony_ci 4594514f5e3Sopenharmony_ci void TranslateClass(JSThread *thread, const CString &methodName); 4604514f5e3Sopenharmony_ci 4614514f5e3Sopenharmony_ci void PostInitializeMethodTask(JSThread *thread, const std::shared_ptr<CString> &methodNamePtr); 4624514f5e3Sopenharmony_ci 4634514f5e3Sopenharmony_ci void ReduceTaskCount(); 4644514f5e3Sopenharmony_ci 4654514f5e3Sopenharmony_ci void SetAllMethodLiteralToMap(); 4664514f5e3Sopenharmony_ci 4674514f5e3Sopenharmony_ci size_t GetClassAndMethodIndex(size_t *methodIdx); 4684514f5e3Sopenharmony_ci 4694514f5e3Sopenharmony_ci static constexpr size_t VERSION_SIZE = 4; 4704514f5e3Sopenharmony_ci static constexpr std::array<uint8_t, VERSION_SIZE> OLD_VERSION {0, 0, 0, 2}; 4714514f5e3Sopenharmony_ci static constexpr uint32_t SENDABLE_FUNCTION_MASK = 1 << 3; 4724514f5e3Sopenharmony_ci 4734514f5e3Sopenharmony_ci // please add member after *pf_. static constexpr int32_t PF_OFFSET = 0. 4744514f5e3Sopenharmony_ci const panda_file::File *pf_ {nullptr}; 4754514f5e3Sopenharmony_ci CString hapPath_; 4764514f5e3Sopenharmony_ci uint32_t constpoolIndex_ {0}; 4774514f5e3Sopenharmony_ci uint32_t checksum_ {0}; 4784514f5e3Sopenharmony_ci CUnorderedMap<uint32_t, MethodLiteral *> methodLiteralMap_; 4794514f5e3Sopenharmony_ci CUnorderedMap<uint32_t, panda_file::File::StringData> methodNameMap_; 4804514f5e3Sopenharmony_ci CUnorderedMap<uint32_t, CString> recordNameMap_; 4814514f5e3Sopenharmony_ci Mutex methodNameMapMutex_; 4824514f5e3Sopenharmony_ci Mutex recordNameMapMutex_; 4834514f5e3Sopenharmony_ci Mutex waitTranslateClassFinishedMutex_; 4844514f5e3Sopenharmony_ci Mutex classIndexMutex_; 4854514f5e3Sopenharmony_ci Mutex jsRecordInfoMutex_; 4864514f5e3Sopenharmony_ci ConditionVariable waitTranslateClassFinishedCV_; 4874514f5e3Sopenharmony_ci uint32_t runningTaskCount_ {0}; 4884514f5e3Sopenharmony_ci size_t classIndex_ {0}; 4894514f5e3Sopenharmony_ci size_t methodIndex_ {0}; 4904514f5e3Sopenharmony_ci 4914514f5e3Sopenharmony_ci CUnorderedMap<uint32_t, uint64_t> constpoolMap_; 4924514f5e3Sopenharmony_ci uint32_t numMethods_ {0}; 4934514f5e3Sopenharmony_ci uint32_t numClasses_ {0}; 4944514f5e3Sopenharmony_ci MethodLiteral *methodLiterals_ {nullptr}; 4954514f5e3Sopenharmony_ci CString desc_; 4964514f5e3Sopenharmony_ci uint32_t anFileInfoIndex_ {INVALID_INDEX}; 4974514f5e3Sopenharmony_ci bool isNewVersion_ {false}; 4984514f5e3Sopenharmony_ci 4994514f5e3Sopenharmony_ci // marge abc 5004514f5e3Sopenharmony_ci bool isBundlePack_ {true}; // isBundlePack means app compile mode is JSBundle 5014514f5e3Sopenharmony_ci CUnorderedMap<CString, JSRecordInfo*> jsRecordInfo_; 5024514f5e3Sopenharmony_ci CUnorderedMap<CString, CString> npmEntries_; 5034514f5e3Sopenharmony_ci bool isRecordWithBundleName_ {true}; 5044514f5e3Sopenharmony_ci static bool loadedFirstPandaFile; 5054514f5e3Sopenharmony_ci bool isFirstPandafile_{false}; 5064514f5e3Sopenharmony_ci}; 5074514f5e3Sopenharmony_ci} // namespace ecmascript 5084514f5e3Sopenharmony_ci} // namespace panda 5094514f5e3Sopenharmony_ci#endif // ECMASCRIPT_JSPANDAFILE_JS_PANDAFILE_H 510