13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci#include "pandagen.h"
173af6ab5fSopenharmony_ci
183af6ab5fSopenharmony_ci#include "varbinder/varbinder.h"
193af6ab5fSopenharmony_ci#include "checker/checker.h"
203af6ab5fSopenharmony_ci#include "checker/types/globalTypesHolder.h"
213af6ab5fSopenharmony_ci#include "util/helpers.h"
223af6ab5fSopenharmony_ci#include "varbinder/scope.h"
233af6ab5fSopenharmony_ci#include "varbinder/variable.h"
243af6ab5fSopenharmony_ci#include "compiler/base/catchTable.h"
253af6ab5fSopenharmony_ci#include "compiler/base/lexenv.h"
263af6ab5fSopenharmony_ci#include "compiler/base/literals.h"
273af6ab5fSopenharmony_ci#include "public/public.h"
283af6ab5fSopenharmony_ci#include "compiler/core/labelTarget.h"
293af6ab5fSopenharmony_ci#include "compiler/core/regAllocator.h"
303af6ab5fSopenharmony_ci#include "compiler/function/asyncFunctionBuilder.h"
313af6ab5fSopenharmony_ci#include "compiler/function/asyncGeneratorFunctionBuilder.h"
323af6ab5fSopenharmony_ci#include "compiler/function/functionBuilder.h"
333af6ab5fSopenharmony_ci#include "compiler/function/generatorFunctionBuilder.h"
343af6ab5fSopenharmony_ci#include "es2panda.h"
353af6ab5fSopenharmony_ci#include "generated/isa.h"
363af6ab5fSopenharmony_ci#include "ir/base/scriptFunction.h"
373af6ab5fSopenharmony_ci#include "ir/base/spreadElement.h"
383af6ab5fSopenharmony_ci#include "ir/statement.h"
393af6ab5fSopenharmony_ci#include "ir/expressions/identifier.h"
403af6ab5fSopenharmony_ci#include "ir/expressions/literals/numberLiteral.h"
413af6ab5fSopenharmony_ci#include "ir/expressions/literals/stringLiteral.h"
423af6ab5fSopenharmony_ci
433af6ab5fSopenharmony_cinamespace ark::es2panda::compiler {
443af6ab5fSopenharmony_ci
453af6ab5fSopenharmony_ci#ifndef PANDA_WITH_ECMASCRIPT
463af6ab5fSopenharmony_ciclass EcmaDisabled : public IRNode {
473af6ab5fSopenharmony_cipublic:
483af6ab5fSopenharmony_ci    template <typename... Args>
493af6ab5fSopenharmony_ci    explicit EcmaDisabled(const ir::AstNode *node, [[maybe_unused]] Args &&...args) : IRNode(node)
503af6ab5fSopenharmony_ci    {
513af6ab5fSopenharmony_ci        UNREACHABLE();
523af6ab5fSopenharmony_ci    }
533af6ab5fSopenharmony_ci
543af6ab5fSopenharmony_ci    Formats GetFormats() const override
553af6ab5fSopenharmony_ci    {
563af6ab5fSopenharmony_ci        UNREACHABLE();
573af6ab5fSopenharmony_ci    }
583af6ab5fSopenharmony_ci
593af6ab5fSopenharmony_ci    size_t Registers([[maybe_unused]] std::array<VReg *, MAX_REG_OPERAND> *regs) override
603af6ab5fSopenharmony_ci    {
613af6ab5fSopenharmony_ci        UNREACHABLE();
623af6ab5fSopenharmony_ci    }
633af6ab5fSopenharmony_ci
643af6ab5fSopenharmony_ci    size_t Registers([[maybe_unused]] std::array<const VReg *, MAX_REG_OPERAND> *regs) const override
653af6ab5fSopenharmony_ci    {
663af6ab5fSopenharmony_ci        UNREACHABLE();
673af6ab5fSopenharmony_ci    }
683af6ab5fSopenharmony_ci
693af6ab5fSopenharmony_ci    size_t OutRegisters([[maybe_unused]] std::array<OutVReg, MAX_REG_OPERAND> *regs) const override
703af6ab5fSopenharmony_ci    {
713af6ab5fSopenharmony_ci        UNREACHABLE();
723af6ab5fSopenharmony_ci    }
733af6ab5fSopenharmony_ci
743af6ab5fSopenharmony_ci    void Transform([[maybe_unused]] pandasm::Ins *ins, [[maybe_unused]] ProgramElement *programElement,
753af6ab5fSopenharmony_ci                   [[maybe_unused]] uint32_t totalRegs) const override
763af6ab5fSopenharmony_ci    {
773af6ab5fSopenharmony_ci        UNREACHABLE();
783af6ab5fSopenharmony_ci    }
793af6ab5fSopenharmony_ci};
803af6ab5fSopenharmony_ci
813af6ab5fSopenharmony_ciusing EcmaLdhole = EcmaDisabled;
823af6ab5fSopenharmony_ciusing EcmaLdnan = EcmaDisabled;
833af6ab5fSopenharmony_ciusing EcmaLdinfinity = EcmaDisabled;
843af6ab5fSopenharmony_ciusing EcmaLdglobal = EcmaDisabled;
853af6ab5fSopenharmony_ciusing EcmaLdundefined = EcmaDisabled;
863af6ab5fSopenharmony_ciusing EcmaLdsymbol = EcmaDisabled;
873af6ab5fSopenharmony_ciusing EcmaLdnull = EcmaDisabled;
883af6ab5fSopenharmony_ciusing EcmaLdtrue = EcmaDisabled;
893af6ab5fSopenharmony_ciusing EcmaLdfalse = EcmaDisabled;
903af6ab5fSopenharmony_ciusing EcmaTryldglobalbyname = EcmaDisabled;
913af6ab5fSopenharmony_ciusing EcmaTrystglobalbyname = EcmaDisabled;
923af6ab5fSopenharmony_ciusing EcmaLdobjbyname = EcmaDisabled;
933af6ab5fSopenharmony_ciusing EcmaStobjbyname = EcmaDisabled;
943af6ab5fSopenharmony_ciusing EcmaLdobjbyindex = EcmaDisabled;
953af6ab5fSopenharmony_ciusing EcmaLdobjbyvalue = EcmaDisabled;
963af6ab5fSopenharmony_ciusing EcmaStobjbyvalue = EcmaDisabled;
973af6ab5fSopenharmony_ciusing EcmaStobjbyindex = EcmaDisabled;
983af6ab5fSopenharmony_ciusing EcmaStownbyname = EcmaDisabled;
993af6ab5fSopenharmony_ciusing EcmaStownbyvalue = EcmaDisabled;
1003af6ab5fSopenharmony_ciusing EcmaStownbyindex = EcmaDisabled;
1013af6ab5fSopenharmony_ciusing EcmaDelobjprop = EcmaDisabled;
1023af6ab5fSopenharmony_ciusing EcmaLdglobalvar = EcmaDisabled;
1033af6ab5fSopenharmony_ciusing EcmaStglobalvar = EcmaDisabled;
1043af6ab5fSopenharmony_ciusing EcmaLdbigint = EcmaDisabled;
1053af6ab5fSopenharmony_ciusing EcmaEqdyn = EcmaDisabled;
1063af6ab5fSopenharmony_ciusing EcmaNoteqdyn = EcmaDisabled;
1073af6ab5fSopenharmony_ciusing EcmaStricteqdyn = EcmaDisabled;
1083af6ab5fSopenharmony_ciusing EcmaStrictnoteqdyn = EcmaDisabled;
1093af6ab5fSopenharmony_ciusing EcmaLessdyn = EcmaDisabled;
1103af6ab5fSopenharmony_ciusing EcmaLesseqdyn = EcmaDisabled;
1113af6ab5fSopenharmony_ciusing EcmaGreaterdyn = EcmaDisabled;
1123af6ab5fSopenharmony_ciusing EcmaGreatereqdyn = EcmaDisabled;
1133af6ab5fSopenharmony_ciusing EcmaTonumber = EcmaDisabled;
1143af6ab5fSopenharmony_ciusing EcmaNegdyn = EcmaDisabled;
1153af6ab5fSopenharmony_ciusing EcmaNotdyn = EcmaDisabled;
1163af6ab5fSopenharmony_ciusing EcmaNegate = EcmaDisabled;
1173af6ab5fSopenharmony_ciusing EcmaIncdyn = EcmaDisabled;
1183af6ab5fSopenharmony_ciusing EcmaDecdyn = EcmaDisabled;
1193af6ab5fSopenharmony_ciusing EcmaEqdyn = EcmaDisabled;
1203af6ab5fSopenharmony_ciusing EcmaNoteqdyn = EcmaDisabled;
1213af6ab5fSopenharmony_ciusing EcmaStricteqdyn = EcmaDisabled;
1223af6ab5fSopenharmony_ciusing EcmaStrictnoteqdyn = EcmaDisabled;
1233af6ab5fSopenharmony_ciusing EcmaLessdyn = EcmaDisabled;
1243af6ab5fSopenharmony_ciusing EcmaLesseqdyn = EcmaDisabled;
1253af6ab5fSopenharmony_ciusing EcmaGreaterdyn = EcmaDisabled;
1263af6ab5fSopenharmony_ciusing EcmaGreatereqdyn = EcmaDisabled;
1273af6ab5fSopenharmony_ciusing EcmaAdd2dyn = EcmaDisabled;
1283af6ab5fSopenharmony_ciusing EcmaSub2dyn = EcmaDisabled;
1293af6ab5fSopenharmony_ciusing EcmaMul2dyn = EcmaDisabled;
1303af6ab5fSopenharmony_ciusing EcmaDiv2dyn = EcmaDisabled;
1313af6ab5fSopenharmony_ciusing EcmaMod2dyn = EcmaDisabled;
1323af6ab5fSopenharmony_ciusing EcmaExpdyn = EcmaDisabled;
1333af6ab5fSopenharmony_ciusing EcmaShl2dyn = EcmaDisabled;
1343af6ab5fSopenharmony_ciusing EcmaShr2dyn = EcmaDisabled;
1353af6ab5fSopenharmony_ciusing EcmaAshr2dyn = EcmaDisabled;
1363af6ab5fSopenharmony_ciusing EcmaAnd2dyn = EcmaDisabled;
1373af6ab5fSopenharmony_ciusing EcmaOr2dyn = EcmaDisabled;
1383af6ab5fSopenharmony_ciusing EcmaXor2dyn = EcmaDisabled;
1393af6ab5fSopenharmony_ciusing EcmaIsindyn = EcmaDisabled;
1403af6ab5fSopenharmony_ciusing EcmaInstanceofdyn = EcmaDisabled;
1413af6ab5fSopenharmony_ciusing EcmaIsundefined = EcmaDisabled;
1423af6ab5fSopenharmony_ciusing EcmaIsundefined = EcmaDisabled;
1433af6ab5fSopenharmony_ciusing EcmaJtrue = EcmaDisabled;
1443af6ab5fSopenharmony_ciusing EcmaIstrue = EcmaDisabled;
1453af6ab5fSopenharmony_ciusing EcmaJfalse = EcmaDisabled;
1463af6ab5fSopenharmony_ciusing EcmaIscoercible = EcmaDisabled;
1473af6ab5fSopenharmony_ciusing EcmaThrowdyn = EcmaDisabled;
1483af6ab5fSopenharmony_ciusing EcmaRethrowdyn = EcmaDisabled;
1493af6ab5fSopenharmony_ciusing EcmaReturnDyn = EcmaDisabled;
1503af6ab5fSopenharmony_ciusing EcmaReturnundefined = EcmaDisabled;
1513af6ab5fSopenharmony_ciusing EcmaCall0thisdyn = EcmaDisabled;
1523af6ab5fSopenharmony_ciusing EcmaCall1thisdyn = EcmaDisabled;
1533af6ab5fSopenharmony_ciusing EcmaCall0dyn = EcmaDisabled;
1543af6ab5fSopenharmony_ciusing EcmaCall1thisdyn = EcmaDisabled;
1553af6ab5fSopenharmony_ciusing EcmaCall1dyn = EcmaDisabled;
1563af6ab5fSopenharmony_ciusing EcmaCall2thisdyn = EcmaDisabled;
1573af6ab5fSopenharmony_ciusing EcmaCall2dyn = EcmaDisabled;
1583af6ab5fSopenharmony_ciusing EcmaCall3thisdyn = EcmaDisabled;
1593af6ab5fSopenharmony_ciusing EcmaCall3dyn = EcmaDisabled;
1603af6ab5fSopenharmony_ciusing EcmaCallithisrangedyn = EcmaDisabled;
1613af6ab5fSopenharmony_ciusing EcmaCallirangedyn = EcmaDisabled;
1623af6ab5fSopenharmony_ciusing EcmaCall1thisdyn = EcmaDisabled;
1633af6ab5fSopenharmony_ciusing EcmaCall1dyn = EcmaDisabled;
1643af6ab5fSopenharmony_ciusing EcmaCall2thisdyn = EcmaDisabled;
1653af6ab5fSopenharmony_ciusing EcmaCall2dyn = EcmaDisabled;
1663af6ab5fSopenharmony_ciusing EcmaCall3thisdyn = EcmaDisabled;
1673af6ab5fSopenharmony_ciusing EcmaCall3dyn = EcmaDisabled;
1683af6ab5fSopenharmony_ciusing EcmaCallithisrangedyn = EcmaDisabled;
1693af6ab5fSopenharmony_ciusing EcmaCallirangedyn = EcmaDisabled;
1703af6ab5fSopenharmony_ciusing EcmaSupercall = EcmaDisabled;
1713af6ab5fSopenharmony_ciusing EcmaSupercallspread = EcmaDisabled;
1723af6ab5fSopenharmony_ciusing EcmaNewobjdynrange = EcmaDisabled;
1733af6ab5fSopenharmony_ciusing EcmaLdhomeobject = EcmaDisabled;
1743af6ab5fSopenharmony_ciusing EcmaDefinemethod = EcmaDisabled;
1753af6ab5fSopenharmony_ciusing EcmaDefineasyncgeneratorfunc = EcmaDisabled;
1763af6ab5fSopenharmony_ciusing EcmaDefineasyncfunc = EcmaDisabled;
1773af6ab5fSopenharmony_ciusing EcmaDefinegeneratorfunc = EcmaDisabled;
1783af6ab5fSopenharmony_ciusing EcmaDefinencfuncdyn = EcmaDisabled;
1793af6ab5fSopenharmony_ciusing EcmaDefinefuncdyn = EcmaDisabled;
1803af6ab5fSopenharmony_ciusing EcmaTypeofdyn = EcmaDisabled;
1813af6ab5fSopenharmony_ciusing EcmaCallspreaddyn = EcmaDisabled;
1823af6ab5fSopenharmony_ciusing EcmaNewobjspreaddyn = EcmaDisabled;
1833af6ab5fSopenharmony_ciusing EcmaGetunmappedargs = EcmaDisabled;
1843af6ab5fSopenharmony_ciusing EcmaNegate = EcmaDisabled;
1853af6ab5fSopenharmony_ciusing EcmaToboolean = EcmaDisabled;
1863af6ab5fSopenharmony_ciusing EcmaTonumber = EcmaDisabled;
1873af6ab5fSopenharmony_ciusing EcmaGetmethod = EcmaDisabled;
1883af6ab5fSopenharmony_ciusing EcmaCreategeneratorobj = EcmaDisabled;
1893af6ab5fSopenharmony_ciusing EcmaCreateasyncgeneratorobj = EcmaDisabled;
1903af6ab5fSopenharmony_ciusing EcmaCreateiterresultobj = EcmaDisabled;
1913af6ab5fSopenharmony_ciusing EcmaSuspendgenerator = EcmaDisabled;
1923af6ab5fSopenharmony_ciusing EcmaSuspendasyncgenerator = EcmaDisabled;
1933af6ab5fSopenharmony_ciusing EcmaSetgeneratorstate = EcmaDisabled;
1943af6ab5fSopenharmony_ciusing EcmaSetgeneratorstate = EcmaDisabled;
1953af6ab5fSopenharmony_ciusing EcmaResumegenerator = EcmaDisabled;
1963af6ab5fSopenharmony_ciusing EcmaGetresumemode = EcmaDisabled;
1973af6ab5fSopenharmony_ciusing EcmaAsyncfunctionenter = EcmaDisabled;
1983af6ab5fSopenharmony_ciusing EcmaAsyncfunctionawait = EcmaDisabled;
1993af6ab5fSopenharmony_ciusing EcmaAsyncfunctionresolve = EcmaDisabled;
2003af6ab5fSopenharmony_ciusing EcmaAsyncfunctionreject = EcmaDisabled;
2013af6ab5fSopenharmony_ciusing EcmaAsyncgeneratorresolve = EcmaDisabled;
2023af6ab5fSopenharmony_ciusing EcmaAsyncgeneratorreject = EcmaDisabled;
2033af6ab5fSopenharmony_ciusing EcmaGettemplateobject = EcmaDisabled;
2043af6ab5fSopenharmony_ciusing EcmaCopyrestargs = EcmaDisabled;
2053af6ab5fSopenharmony_ciusing EcmaGetpropiterator = EcmaDisabled;
2063af6ab5fSopenharmony_ciusing EcmaGetnextpropname = EcmaDisabled;
2073af6ab5fSopenharmony_ciusing EcmaCreateemptyobject = EcmaDisabled;
2083af6ab5fSopenharmony_ciusing EcmaCreateobjectwithbuffer = EcmaDisabled;
2093af6ab5fSopenharmony_ciusing EcmaCreateobjecthavingmethod = EcmaDisabled;
2103af6ab5fSopenharmony_ciusing EcmaSetobjectwithproto = EcmaDisabled;
2113af6ab5fSopenharmony_ciusing EcmaCopydataproperties = EcmaDisabled;
2123af6ab5fSopenharmony_ciusing EcmaDefinegettersetterbyvalue = EcmaDisabled;
2133af6ab5fSopenharmony_ciusing EcmaCreateemptyarray = EcmaDisabled;
2143af6ab5fSopenharmony_ciusing EcmaCreatearraywithbuffer = EcmaDisabled;
2153af6ab5fSopenharmony_ciusing EcmaStarrayspread = EcmaDisabled;
2163af6ab5fSopenharmony_ciusing EcmaCreateregexpwithliteral = EcmaDisabled;
2173af6ab5fSopenharmony_ciusing EcmaThrowifnotobject = EcmaDisabled;
2183af6ab5fSopenharmony_ciusing EcmaThrowthrownotexists = EcmaDisabled;
2193af6ab5fSopenharmony_ciusing EcmaGetiterator = EcmaDisabled;
2203af6ab5fSopenharmony_ciusing EcmaGetasynciterator = EcmaDisabled;
2213af6ab5fSopenharmony_ciusing EcmaCreateobjectwithexcludedkeys = EcmaDisabled;
2223af6ab5fSopenharmony_ciusing EcmaThrowpatternnoncoercible = EcmaDisabled;
2233af6ab5fSopenharmony_ciusing EcmaCloseiterator = EcmaDisabled;
2243af6ab5fSopenharmony_ciusing EcmaImportmodule = EcmaDisabled;
2253af6ab5fSopenharmony_ciusing EcmaSetclasscomputedfields = EcmaDisabled;
2263af6ab5fSopenharmony_ciusing EcmaDefineclasswithbuffer = EcmaDisabled;
2273af6ab5fSopenharmony_ciusing EcmaLoadclasscomputedinstancefields = EcmaDisabled;
2283af6ab5fSopenharmony_ciusing EcmaDefineclassprivatefields = EcmaDisabled;
2293af6ab5fSopenharmony_ciusing EcmaClassfieldadd = EcmaDisabled;
2303af6ab5fSopenharmony_ciusing EcmaClassprivatefieldadd = EcmaDisabled;
2313af6ab5fSopenharmony_ciusing EcmaClassprivatemethodoraccessoradd = EcmaDisabled;
2323af6ab5fSopenharmony_ciusing EcmaClassprivatefieldget = EcmaDisabled;
2333af6ab5fSopenharmony_ciusing EcmaClassprivatefieldset = EcmaDisabled;
2343af6ab5fSopenharmony_ciusing EcmaClassprivatefieldin = EcmaDisabled;
2353af6ab5fSopenharmony_ciusing EcmaLdmodvarbyname = EcmaDisabled;
2363af6ab5fSopenharmony_ciusing EcmaStmodulevar = EcmaDisabled;
2373af6ab5fSopenharmony_ciusing EcmaCopymodule = EcmaDisabled;
2383af6ab5fSopenharmony_ciusing EcmaStsuperbyname = EcmaDisabled;
2393af6ab5fSopenharmony_ciusing EcmaLdsuperbyname = EcmaDisabled;
2403af6ab5fSopenharmony_ciusing EcmaStsuperbyvalue = EcmaDisabled;
2413af6ab5fSopenharmony_ciusing EcmaLdsuperbyvalue = EcmaDisabled;
2423af6ab5fSopenharmony_ciusing EcmaLdlexvardyn = EcmaDisabled;
2433af6ab5fSopenharmony_ciusing EcmaLdlexdyn = EcmaDisabled;
2443af6ab5fSopenharmony_ciusing EcmaStlexvardyn = EcmaDisabled;
2453af6ab5fSopenharmony_ciusing EcmaStlexdyn = EcmaDisabled;
2463af6ab5fSopenharmony_ciusing EcmaThrowifsupernotcorrectcall = EcmaDisabled;
2473af6ab5fSopenharmony_ciusing EcmaThrowtdz = EcmaDisabled;
2483af6ab5fSopenharmony_ciusing EcmaThrowconstassignment = EcmaDisabled;
2493af6ab5fSopenharmony_ciusing EcmaPoplexenvdyn = EcmaDisabled;
2503af6ab5fSopenharmony_ciusing EcmaCopylexenvdyn = EcmaDisabled;
2513af6ab5fSopenharmony_ciusing EcmaNewlexenvdyn = EcmaDisabled;
2523af6ab5fSopenharmony_ciusing EcmaLdlexenvdyn = EcmaDisabled;
2533af6ab5fSopenharmony_ciusing EcmaLdevalvar = EcmaDisabled;
2543af6ab5fSopenharmony_ciusing EcmaStevalvar = EcmaDisabled;
2553af6ab5fSopenharmony_ciusing EcmaLdevalbindings = EcmaDisabled;
2563af6ab5fSopenharmony_ciusing EcmaDirecteval = EcmaDisabled;
2573af6ab5fSopenharmony_ci#endif
2583af6ab5fSopenharmony_ci
2593af6ab5fSopenharmony_ciPandaGen::PandaGen(ArenaAllocator *const allocator, RegSpiller *const spiller, public_lib::Context *const context,
2603af6ab5fSopenharmony_ci                   std::tuple<varbinder::FunctionScope *, ProgramElement *, AstCompiler *> toCompile)
2613af6ab5fSopenharmony_ci    : CodeGen(allocator, spiller, context, toCompile)
2623af6ab5fSopenharmony_ci{
2633af6ab5fSopenharmony_ci    Function::Compile(this);
2643af6ab5fSopenharmony_ci}
2653af6ab5fSopenharmony_ci
2663af6ab5fSopenharmony_ciFunctionBuilder *PandaGen::FuncBuilder() const noexcept
2673af6ab5fSopenharmony_ci{
2683af6ab5fSopenharmony_ci    return builder_;
2693af6ab5fSopenharmony_ci}
2703af6ab5fSopenharmony_ci
2713af6ab5fSopenharmony_ciEnvScope *PandaGen::GetEnvScope() const noexcept
2723af6ab5fSopenharmony_ci{
2733af6ab5fSopenharmony_ci    return envScope_;
2743af6ab5fSopenharmony_ci}
2753af6ab5fSopenharmony_ci
2763af6ab5fSopenharmony_civoid PandaGen::OptionalChainCheck(const bool optional, const VReg obj) const
2773af6ab5fSopenharmony_ci{
2783af6ab5fSopenharmony_ci    if (optional && optionalChain_ != nullptr) {
2793af6ab5fSopenharmony_ci        optionalChain_->Check(obj);
2803af6ab5fSopenharmony_ci    }
2813af6ab5fSopenharmony_ci}
2823af6ab5fSopenharmony_ci
2833af6ab5fSopenharmony_civoid PandaGen::FunctionInit(CatchTable *catchTable)
2843af6ab5fSopenharmony_ci{
2853af6ab5fSopenharmony_ci    if (RootNode()->IsProgram()) {
2863af6ab5fSopenharmony_ci        builder_ = Allocator()->New<FunctionBuilder>(this, catchTable);
2873af6ab5fSopenharmony_ci        return;
2883af6ab5fSopenharmony_ci    }
2893af6ab5fSopenharmony_ci
2903af6ab5fSopenharmony_ci    const ir::ScriptFunction *func = RootNode()->AsScriptFunction();
2913af6ab5fSopenharmony_ci
2923af6ab5fSopenharmony_ci    if (func->IsAsyncFunc()) {
2933af6ab5fSopenharmony_ci        if (func->IsGenerator()) {
2943af6ab5fSopenharmony_ci            builder_ = Allocator()->New<AsyncGeneratorFunctionBuilder>(this, catchTable);
2953af6ab5fSopenharmony_ci            return;
2963af6ab5fSopenharmony_ci        }
2973af6ab5fSopenharmony_ci
2983af6ab5fSopenharmony_ci        builder_ = Allocator()->New<AsyncFunctionBuilder>(this, catchTable);
2993af6ab5fSopenharmony_ci        return;
3003af6ab5fSopenharmony_ci    }
3013af6ab5fSopenharmony_ci
3023af6ab5fSopenharmony_ci    if (func->IsGenerator()) {
3033af6ab5fSopenharmony_ci        builder_ = Allocator()->New<GeneratorFunctionBuilder>(this, catchTable);
3043af6ab5fSopenharmony_ci        return;
3053af6ab5fSopenharmony_ci    }
3063af6ab5fSopenharmony_ci
3073af6ab5fSopenharmony_ci    builder_ = Allocator()->New<FunctionBuilder>(this, catchTable);
3083af6ab5fSopenharmony_ci}
3093af6ab5fSopenharmony_ci
3103af6ab5fSopenharmony_cibool PandaGen::FunctionHasFinalizer() const
3113af6ab5fSopenharmony_ci{
3123af6ab5fSopenharmony_ci    if (RootNode()->IsProgram()) {
3133af6ab5fSopenharmony_ci        return false;
3143af6ab5fSopenharmony_ci    }
3153af6ab5fSopenharmony_ci
3163af6ab5fSopenharmony_ci    const ir::ScriptFunction *func = RootNode()->AsScriptFunction();
3173af6ab5fSopenharmony_ci
3183af6ab5fSopenharmony_ci    return func->IsAsyncFunc() || func->IsGenerator();
3193af6ab5fSopenharmony_ci}
3203af6ab5fSopenharmony_ci
3213af6ab5fSopenharmony_civoid PandaGen::FunctionEnter()
3223af6ab5fSopenharmony_ci{
3233af6ab5fSopenharmony_ci    builder_->Prepare(RootNode()->AsScriptFunction());
3243af6ab5fSopenharmony_ci}
3253af6ab5fSopenharmony_ci
3263af6ab5fSopenharmony_civoid PandaGen::FunctionExit()
3273af6ab5fSopenharmony_ci{
3283af6ab5fSopenharmony_ci    builder_->CleanUp(RootNode()->AsScriptFunction());
3293af6ab5fSopenharmony_ci}
3303af6ab5fSopenharmony_ci
3313af6ab5fSopenharmony_civoid PandaGen::StoreAccumulator(const ir::AstNode *node, VReg vreg)
3323af6ab5fSopenharmony_ci{
3333af6ab5fSopenharmony_ci    Ra().Emit<StaDyn>(node, vreg);
3343af6ab5fSopenharmony_ci}
3353af6ab5fSopenharmony_ci
3363af6ab5fSopenharmony_civoid PandaGen::LoadAccumulator(const ir::AstNode *node, VReg reg)
3373af6ab5fSopenharmony_ci{
3383af6ab5fSopenharmony_ci    Ra().Emit<LdaDyn>(node, reg);
3393af6ab5fSopenharmony_ci}
3403af6ab5fSopenharmony_ci
3413af6ab5fSopenharmony_ciIRNode *PandaGen::AllocMov(const ir::AstNode *node, const VReg vd, const VReg vs)
3423af6ab5fSopenharmony_ci{
3433af6ab5fSopenharmony_ci    return Allocator()->New<MovDyn>(node, vd, vs);
3443af6ab5fSopenharmony_ci}
3453af6ab5fSopenharmony_ci
3463af6ab5fSopenharmony_ciIRNode *PandaGen::AllocMov(const ir::AstNode *node, OutVReg vd, const VReg vs)
3473af6ab5fSopenharmony_ci{
3483af6ab5fSopenharmony_ci    ASSERT(vd.type == OperandType::ANY);
3493af6ab5fSopenharmony_ci    return Allocator()->New<MovDyn>(node, *vd.reg, vs);
3503af6ab5fSopenharmony_ci}
3513af6ab5fSopenharmony_ci
3523af6ab5fSopenharmony_civoid PandaGen::MoveVreg(const ir::AstNode *node, VReg vd, VReg vs)
3533af6ab5fSopenharmony_ci{
3543af6ab5fSopenharmony_ci    Ra().Emit<MovDyn>(node, vd, vs);
3553af6ab5fSopenharmony_ci}
3563af6ab5fSopenharmony_ci
3573af6ab5fSopenharmony_civoid PandaGen::LoadAccumulatorDouble(const ir::AstNode *node, double num)
3583af6ab5fSopenharmony_ci{
3593af6ab5fSopenharmony_ci    Sa().Emit<FldaiDyn>(node, num);
3603af6ab5fSopenharmony_ci}
3613af6ab5fSopenharmony_ci
3623af6ab5fSopenharmony_civoid PandaGen::LoadAccumulatorInt(const ir::AstNode *node, size_t num)
3633af6ab5fSopenharmony_ci{
3643af6ab5fSopenharmony_ci    Sa().Emit<LdaiDyn>(node, static_cast<int64_t>(num));
3653af6ab5fSopenharmony_ci}
3663af6ab5fSopenharmony_ci
3673af6ab5fSopenharmony_civoid PandaGen::StoreConst(const ir::AstNode *node, VReg reg, Constant id)
3683af6ab5fSopenharmony_ci{
3693af6ab5fSopenharmony_ci    LoadConst(node, id);
3703af6ab5fSopenharmony_ci    StoreAccumulator(node, reg);
3713af6ab5fSopenharmony_ci}
3723af6ab5fSopenharmony_ci
3733af6ab5fSopenharmony_civoid PandaGen::LoadConst(const ir::AstNode *node, Constant id)
3743af6ab5fSopenharmony_ci{
3753af6ab5fSopenharmony_ci    switch (id) {
3763af6ab5fSopenharmony_ci        case Constant::JS_HOLE: {
3773af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdhole>(node);
3783af6ab5fSopenharmony_ci            break;
3793af6ab5fSopenharmony_ci        }
3803af6ab5fSopenharmony_ci        case Constant::JS_NAN: {
3813af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdnan>(node);
3823af6ab5fSopenharmony_ci            break;
3833af6ab5fSopenharmony_ci        }
3843af6ab5fSopenharmony_ci        case Constant::JS_INFINITY: {
3853af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdinfinity>(node);
3863af6ab5fSopenharmony_ci            break;
3873af6ab5fSopenharmony_ci        }
3883af6ab5fSopenharmony_ci        case Constant::JS_GLOBAL: {
3893af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdglobal>(node);
3903af6ab5fSopenharmony_ci            break;
3913af6ab5fSopenharmony_ci        }
3923af6ab5fSopenharmony_ci        case Constant::JS_UNDEFINED: {
3933af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdundefined>(node);
3943af6ab5fSopenharmony_ci            break;
3953af6ab5fSopenharmony_ci        }
3963af6ab5fSopenharmony_ci        case Constant::JS_SYMBOL: {
3973af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdsymbol>(node);
3983af6ab5fSopenharmony_ci            break;
3993af6ab5fSopenharmony_ci        }
4003af6ab5fSopenharmony_ci        case Constant::JS_NULL: {
4013af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdnull>(node);
4023af6ab5fSopenharmony_ci            break;
4033af6ab5fSopenharmony_ci        }
4043af6ab5fSopenharmony_ci        case Constant::JS_TRUE: {
4053af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdtrue>(node);
4063af6ab5fSopenharmony_ci            break;
4073af6ab5fSopenharmony_ci        }
4083af6ab5fSopenharmony_ci        case Constant::JS_FALSE: {
4093af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdfalse>(node);
4103af6ab5fSopenharmony_ci            break;
4113af6ab5fSopenharmony_ci        }
4123af6ab5fSopenharmony_ci        default: {
4133af6ab5fSopenharmony_ci            UNREACHABLE();
4143af6ab5fSopenharmony_ci        }
4153af6ab5fSopenharmony_ci    }
4163af6ab5fSopenharmony_ci}
4173af6ab5fSopenharmony_ci
4183af6ab5fSopenharmony_civoid PandaGen::GetFunctionObject(const ir::AstNode *node)
4193af6ab5fSopenharmony_ci{
4203af6ab5fSopenharmony_ci    LoadAccFromLexEnv(node, Scope()->Find(varbinder::VarBinder::MANDATORY_PARAM_FUNC));
4213af6ab5fSopenharmony_ci}
4223af6ab5fSopenharmony_ci
4233af6ab5fSopenharmony_civoid PandaGen::GetNewTarget(const ir::AstNode *node)
4243af6ab5fSopenharmony_ci{
4253af6ab5fSopenharmony_ci    LoadAccFromLexEnv(node, Scope()->Find(varbinder::VarBinder::MANDATORY_PARAM_NEW_TARGET));
4263af6ab5fSopenharmony_ci}
4273af6ab5fSopenharmony_ci
4283af6ab5fSopenharmony_civoid PandaGen::GetThis(const ir::AstNode *node)
4293af6ab5fSopenharmony_ci{
4303af6ab5fSopenharmony_ci    LoadAccFromLexEnv(node, Scope()->Find(varbinder::VarBinder::MANDATORY_PARAM_THIS));
4313af6ab5fSopenharmony_ci}
4323af6ab5fSopenharmony_ci
4333af6ab5fSopenharmony_civoid PandaGen::SetThis(const ir::AstNode *node)
4343af6ab5fSopenharmony_ci{
4353af6ab5fSopenharmony_ci    StoreAccToLexEnv(node, Scope()->Find(varbinder::VarBinder::MANDATORY_PARAM_THIS), true);
4363af6ab5fSopenharmony_ci}
4373af6ab5fSopenharmony_ci
4383af6ab5fSopenharmony_civoid PandaGen::LoadVar(const ir::Identifier *node, const varbinder::ConstScopeFindResult &result)
4393af6ab5fSopenharmony_ci{
4403af6ab5fSopenharmony_ci    auto *var = result.variable;
4413af6ab5fSopenharmony_ci
4423af6ab5fSopenharmony_ci    if (var == nullptr) {
4433af6ab5fSopenharmony_ci        TryLoadGlobalByName(node, result.name);
4443af6ab5fSopenharmony_ci        return;
4453af6ab5fSopenharmony_ci    }
4463af6ab5fSopenharmony_ci
4473af6ab5fSopenharmony_ci    if (var->IsGlobalVariable()) {
4483af6ab5fSopenharmony_ci        LoadGlobalVar(node, var->Name());
4493af6ab5fSopenharmony_ci        return;
4503af6ab5fSopenharmony_ci    }
4513af6ab5fSopenharmony_ci
4523af6ab5fSopenharmony_ci    if (var->IsModuleVariable()) {
4533af6ab5fSopenharmony_ci        LoadModuleVariable(node, var->AsModuleVariable()->ModuleReg(), var->AsModuleVariable()->ExoticName());
4543af6ab5fSopenharmony_ci        return;
4553af6ab5fSopenharmony_ci    }
4563af6ab5fSopenharmony_ci
4573af6ab5fSopenharmony_ci    ASSERT(var->IsLocalVariable());
4583af6ab5fSopenharmony_ci    LoadAccFromLexEnv(node, result);
4593af6ab5fSopenharmony_ci}
4603af6ab5fSopenharmony_ci
4613af6ab5fSopenharmony_civoid PandaGen::StoreVar(const ir::AstNode *node, const varbinder::ConstScopeFindResult &result, bool isDeclaration)
4623af6ab5fSopenharmony_ci{
4633af6ab5fSopenharmony_ci    varbinder::Variable *var = result.variable;
4643af6ab5fSopenharmony_ci
4653af6ab5fSopenharmony_ci    if (var == nullptr) {
4663af6ab5fSopenharmony_ci        if (IsDirectEval()) {
4673af6ab5fSopenharmony_ci            StoreEvalVariable(node, result.name);
4683af6ab5fSopenharmony_ci        } else {
4693af6ab5fSopenharmony_ci            TryStoreGlobalByName(node, result.name);
4703af6ab5fSopenharmony_ci        }
4713af6ab5fSopenharmony_ci        return;
4723af6ab5fSopenharmony_ci    }
4733af6ab5fSopenharmony_ci
4743af6ab5fSopenharmony_ci    if (var->IsGlobalVariable()) {
4753af6ab5fSopenharmony_ci        StoreGlobalVar(node, var->Name());
4763af6ab5fSopenharmony_ci        return;
4773af6ab5fSopenharmony_ci    }
4783af6ab5fSopenharmony_ci
4793af6ab5fSopenharmony_ci    if (var->IsModuleVariable()) {
4803af6ab5fSopenharmony_ci        ThrowConstAssignment(node, var->Name());
4813af6ab5fSopenharmony_ci        return;
4823af6ab5fSopenharmony_ci    }
4833af6ab5fSopenharmony_ci
4843af6ab5fSopenharmony_ci    ASSERT(var->IsLocalVariable());
4853af6ab5fSopenharmony_ci    StoreAccToLexEnv(node, result, isDeclaration);
4863af6ab5fSopenharmony_ci}
4873af6ab5fSopenharmony_ci
4883af6ab5fSopenharmony_civoid PandaGen::LoadAccFromArgs(const ir::AstNode *node)
4893af6ab5fSopenharmony_ci{
4903af6ab5fSopenharmony_ci    if (!Scope()->HasFlag(varbinder::ScopeFlags::USE_ARGS)) {
4913af6ab5fSopenharmony_ci        return;
4923af6ab5fSopenharmony_ci    }
4933af6ab5fSopenharmony_ci
4943af6ab5fSopenharmony_ci    auto res = Scope()->Find(varbinder::VarBinder::FUNCTION_ARGUMENTS);
4953af6ab5fSopenharmony_ci    ASSERT(res.scope);
4963af6ab5fSopenharmony_ci
4973af6ab5fSopenharmony_ci    GetUnmappedArgs(node);
4983af6ab5fSopenharmony_ci    StoreAccToLexEnv(node, res, true);
4993af6ab5fSopenharmony_ci}
5003af6ab5fSopenharmony_ci
5013af6ab5fSopenharmony_civoid PandaGen::LoadObjProperty(const ir::AstNode *node, const Operand &prop)
5023af6ab5fSopenharmony_ci{
5033af6ab5fSopenharmony_ci    if (std::holds_alternative<VReg>(prop)) {
5043af6ab5fSopenharmony_ci        LoadObjByValue(node, std::get<VReg>(prop));
5053af6ab5fSopenharmony_ci        return;
5063af6ab5fSopenharmony_ci    }
5073af6ab5fSopenharmony_ci
5083af6ab5fSopenharmony_ci    if (std::holds_alternative<int64_t>(prop)) {
5093af6ab5fSopenharmony_ci        LoadObjByIndex(node, std::get<int64_t>(prop));
5103af6ab5fSopenharmony_ci        return;
5113af6ab5fSopenharmony_ci    }
5123af6ab5fSopenharmony_ci
5133af6ab5fSopenharmony_ci    ASSERT(std::holds_alternative<util::StringView>(prop));
5143af6ab5fSopenharmony_ci    LoadObjByName(node, std::get<util::StringView>(prop));
5153af6ab5fSopenharmony_ci}
5163af6ab5fSopenharmony_ci
5173af6ab5fSopenharmony_civoid PandaGen::StoreObjProperty(const ir::AstNode *node, VReg obj, const Operand &prop)
5183af6ab5fSopenharmony_ci{
5193af6ab5fSopenharmony_ci    if (std::holds_alternative<VReg>(prop)) {
5203af6ab5fSopenharmony_ci        StoreObjByValue(node, obj, std::get<VReg>(prop));
5213af6ab5fSopenharmony_ci        return;
5223af6ab5fSopenharmony_ci    }
5233af6ab5fSopenharmony_ci
5243af6ab5fSopenharmony_ci    if (std::holds_alternative<int64_t>(prop)) {
5253af6ab5fSopenharmony_ci        StoreObjByIndex(node, obj, std::get<int64_t>(prop));
5263af6ab5fSopenharmony_ci        return;
5273af6ab5fSopenharmony_ci    }
5283af6ab5fSopenharmony_ci
5293af6ab5fSopenharmony_ci    ASSERT(std::holds_alternative<util::StringView>(prop));
5303af6ab5fSopenharmony_ci    StoreObjByName(node, obj, std::get<util::StringView>(prop));
5313af6ab5fSopenharmony_ci}
5323af6ab5fSopenharmony_ci
5333af6ab5fSopenharmony_civoid PandaGen::StoreOwnProperty(const ir::AstNode *node, VReg obj, const Operand &prop)
5343af6ab5fSopenharmony_ci{
5353af6ab5fSopenharmony_ci    if (std::holds_alternative<VReg>(prop)) {
5363af6ab5fSopenharmony_ci        StOwnByValue(node, obj, std::get<VReg>(prop));
5373af6ab5fSopenharmony_ci        return;
5383af6ab5fSopenharmony_ci    }
5393af6ab5fSopenharmony_ci
5403af6ab5fSopenharmony_ci    if (std::holds_alternative<int64_t>(prop)) {
5413af6ab5fSopenharmony_ci        StOwnByIndex(node, obj, std::get<int64_t>(prop));
5423af6ab5fSopenharmony_ci        return;
5433af6ab5fSopenharmony_ci    }
5443af6ab5fSopenharmony_ci
5453af6ab5fSopenharmony_ci    ASSERT(std::holds_alternative<util::StringView>(prop));
5463af6ab5fSopenharmony_ci    StOwnByName(node, obj, std::get<util::StringView>(prop));
5473af6ab5fSopenharmony_ci}
5483af6ab5fSopenharmony_ci
5493af6ab5fSopenharmony_civoid PandaGen::TryLoadGlobalByName(const ir::AstNode *node, const util::StringView &name)
5503af6ab5fSopenharmony_ci{
5513af6ab5fSopenharmony_ci    Sa().Emit<EcmaTryldglobalbyname>(node, name);
5523af6ab5fSopenharmony_ci}
5533af6ab5fSopenharmony_ci
5543af6ab5fSopenharmony_civoid PandaGen::TryStoreGlobalByName(const ir::AstNode *node, const util::StringView &name)
5553af6ab5fSopenharmony_ci{
5563af6ab5fSopenharmony_ci    Sa().Emit<EcmaTrystglobalbyname>(node, name);
5573af6ab5fSopenharmony_ci}
5583af6ab5fSopenharmony_ci
5593af6ab5fSopenharmony_civoid PandaGen::LoadObjByName(const ir::AstNode *node, const util::StringView &prop)
5603af6ab5fSopenharmony_ci{
5613af6ab5fSopenharmony_ci    Ra().Emit<EcmaLdobjbyname>(node, prop);
5623af6ab5fSopenharmony_ci}
5633af6ab5fSopenharmony_ci
5643af6ab5fSopenharmony_civoid PandaGen::StoreObjByName(const ir::AstNode *node, VReg obj, const util::StringView &prop)
5653af6ab5fSopenharmony_ci{
5663af6ab5fSopenharmony_ci    Ra().Emit<EcmaStobjbyname>(node, prop, obj);
5673af6ab5fSopenharmony_ci}
5683af6ab5fSopenharmony_ci
5693af6ab5fSopenharmony_civoid PandaGen::LoadObjByIndex(const ir::AstNode *node, int64_t index)
5703af6ab5fSopenharmony_ci{
5713af6ab5fSopenharmony_ci    Ra().Emit<EcmaLdobjbyindex>(node, index);
5723af6ab5fSopenharmony_ci}
5733af6ab5fSopenharmony_ci
5743af6ab5fSopenharmony_civoid PandaGen::LoadObjByValue(const ir::AstNode *node, VReg obj)
5753af6ab5fSopenharmony_ci{
5763af6ab5fSopenharmony_ci    Ra().Emit<EcmaLdobjbyvalue>(node, obj);
5773af6ab5fSopenharmony_ci}
5783af6ab5fSopenharmony_ci
5793af6ab5fSopenharmony_civoid PandaGen::StoreObjByValue(const ir::AstNode *node, VReg obj, VReg prop)
5803af6ab5fSopenharmony_ci{
5813af6ab5fSopenharmony_ci    Ra().Emit<EcmaStobjbyvalue>(node, obj, prop);
5823af6ab5fSopenharmony_ci}
5833af6ab5fSopenharmony_ci
5843af6ab5fSopenharmony_civoid PandaGen::StoreObjByIndex(const ir::AstNode *node, VReg obj, int64_t index)
5853af6ab5fSopenharmony_ci{
5863af6ab5fSopenharmony_ci    Ra().Emit<EcmaStobjbyindex>(node, index, obj);
5873af6ab5fSopenharmony_ci}
5883af6ab5fSopenharmony_ci
5893af6ab5fSopenharmony_civoid PandaGen::StOwnByName(const ir::AstNode *node, VReg obj, const util::StringView &prop)
5903af6ab5fSopenharmony_ci{
5913af6ab5fSopenharmony_ci    Ra().Emit<EcmaStownbyname>(node, prop, obj);
5923af6ab5fSopenharmony_ci}
5933af6ab5fSopenharmony_ci
5943af6ab5fSopenharmony_civoid PandaGen::StOwnByValue(const ir::AstNode *node, VReg obj, VReg prop)
5953af6ab5fSopenharmony_ci{
5963af6ab5fSopenharmony_ci    Ra().Emit<EcmaStownbyvalue>(node, obj, prop);
5973af6ab5fSopenharmony_ci}
5983af6ab5fSopenharmony_ci
5993af6ab5fSopenharmony_civoid PandaGen::StOwnByIndex(const ir::AstNode *node, VReg obj, int64_t index)
6003af6ab5fSopenharmony_ci{
6013af6ab5fSopenharmony_ci    Ra().Emit<EcmaStownbyindex>(node, index, obj);
6023af6ab5fSopenharmony_ci}
6033af6ab5fSopenharmony_ci
6043af6ab5fSopenharmony_civoid PandaGen::DeleteObjProperty(const ir::AstNode *node, VReg obj, VReg prop)
6053af6ab5fSopenharmony_ci{
6063af6ab5fSopenharmony_ci    Ra().Emit<EcmaDelobjprop>(node, obj, prop);
6073af6ab5fSopenharmony_ci}
6083af6ab5fSopenharmony_ci
6093af6ab5fSopenharmony_civoid PandaGen::LoadGlobalVar(const ir::AstNode *node, const util::StringView &name)
6103af6ab5fSopenharmony_ci{
6113af6ab5fSopenharmony_ci    Sa().Emit<EcmaLdglobalvar>(node, name);
6123af6ab5fSopenharmony_ci}
6133af6ab5fSopenharmony_ci
6143af6ab5fSopenharmony_civoid PandaGen::StoreGlobalVar(const ir::AstNode *node, const util::StringView &name)
6153af6ab5fSopenharmony_ci{
6163af6ab5fSopenharmony_ci    Sa().Emit<EcmaStglobalvar>(node, name);
6173af6ab5fSopenharmony_ci}
6183af6ab5fSopenharmony_ci
6193af6ab5fSopenharmony_ciVReg PandaGen::LexEnv() const noexcept
6203af6ab5fSopenharmony_ci{
6213af6ab5fSopenharmony_ci    return envScope_->LexEnv();
6223af6ab5fSopenharmony_ci}
6233af6ab5fSopenharmony_ci
6243af6ab5fSopenharmony_civoid PandaGen::LoadAccFromLexEnv(const ir::AstNode *node, const varbinder::ConstScopeFindResult &result)
6253af6ab5fSopenharmony_ci{
6263af6ab5fSopenharmony_ci    VirtualLoadVar::Expand(this, node, result);
6273af6ab5fSopenharmony_ci}
6283af6ab5fSopenharmony_ci
6293af6ab5fSopenharmony_civoid PandaGen::StoreAccToLexEnv(const ir::AstNode *node, const varbinder::ConstScopeFindResult &result,
6303af6ab5fSopenharmony_ci                                bool isDeclaration)
6313af6ab5fSopenharmony_ci{
6323af6ab5fSopenharmony_ci    VirtualStoreVar::Expand(this, node, result, isDeclaration);
6333af6ab5fSopenharmony_ci}
6343af6ab5fSopenharmony_ci
6353af6ab5fSopenharmony_civoid PandaGen::LoadAccumulatorBigInt(const ir::AstNode *node, const util::StringView &bigInt)
6363af6ab5fSopenharmony_ci{
6373af6ab5fSopenharmony_ci    Sa().Emit<EcmaLdbigint>(node, bigInt);
6383af6ab5fSopenharmony_ci}
6393af6ab5fSopenharmony_ci
6403af6ab5fSopenharmony_civoid PandaGen::Condition(const ir::AstNode *node, lexer::TokenType op, VReg lhs, Label *ifFalse)
6413af6ab5fSopenharmony_ci{
6423af6ab5fSopenharmony_ci    switch (op) {
6433af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_EQUAL: {
6443af6ab5fSopenharmony_ci            Ra().Emit<EcmaEqdyn>(node, lhs);
6453af6ab5fSopenharmony_ci            break;
6463af6ab5fSopenharmony_ci        }
6473af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_NOT_EQUAL: {
6483af6ab5fSopenharmony_ci            Ra().Emit<EcmaNoteqdyn>(node, lhs);
6493af6ab5fSopenharmony_ci            break;
6503af6ab5fSopenharmony_ci        }
6513af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_STRICT_EQUAL: {
6523af6ab5fSopenharmony_ci            Ra().Emit<EcmaStricteqdyn>(node, lhs);
6533af6ab5fSopenharmony_ci            break;
6543af6ab5fSopenharmony_ci        }
6553af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_NOT_STRICT_EQUAL: {
6563af6ab5fSopenharmony_ci            Ra().Emit<EcmaStrictnoteqdyn>(node, lhs);
6573af6ab5fSopenharmony_ci            break;
6583af6ab5fSopenharmony_ci        }
6593af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_LESS_THAN: {
6603af6ab5fSopenharmony_ci            Ra().Emit<EcmaLessdyn>(node, lhs);
6613af6ab5fSopenharmony_ci            break;
6623af6ab5fSopenharmony_ci        }
6633af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_LESS_THAN_EQUAL: {
6643af6ab5fSopenharmony_ci            Ra().Emit<EcmaLesseqdyn>(node, lhs);
6653af6ab5fSopenharmony_ci            break;
6663af6ab5fSopenharmony_ci        }
6673af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_GREATER_THAN: {
6683af6ab5fSopenharmony_ci            Ra().Emit<EcmaGreaterdyn>(node, lhs);
6693af6ab5fSopenharmony_ci            break;
6703af6ab5fSopenharmony_ci        }
6713af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_GREATER_THAN_EQUAL: {
6723af6ab5fSopenharmony_ci            Ra().Emit<EcmaGreatereqdyn>(node, lhs);
6733af6ab5fSopenharmony_ci            break;
6743af6ab5fSopenharmony_ci        }
6753af6ab5fSopenharmony_ci        default: {
6763af6ab5fSopenharmony_ci            UNREACHABLE();
6773af6ab5fSopenharmony_ci        }
6783af6ab5fSopenharmony_ci    }
6793af6ab5fSopenharmony_ci
6803af6ab5fSopenharmony_ci    BranchIfFalse(node, ifFalse);
6813af6ab5fSopenharmony_ci}
6823af6ab5fSopenharmony_ci
6833af6ab5fSopenharmony_civoid PandaGen::Unary(const ir::AstNode *node, lexer::TokenType op, VReg operand)
6843af6ab5fSopenharmony_ci{
6853af6ab5fSopenharmony_ci    switch (op) {
6863af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_PLUS: {
6873af6ab5fSopenharmony_ci            Ra().Emit<EcmaTonumber>(node, operand);
6883af6ab5fSopenharmony_ci            break;
6893af6ab5fSopenharmony_ci        }
6903af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_MINUS: {
6913af6ab5fSopenharmony_ci            Ra().Emit<EcmaNegdyn>(node, operand);
6923af6ab5fSopenharmony_ci            break;
6933af6ab5fSopenharmony_ci        }
6943af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_TILDE: {
6953af6ab5fSopenharmony_ci            Ra().Emit<EcmaNotdyn>(node, operand);
6963af6ab5fSopenharmony_ci            break;
6973af6ab5fSopenharmony_ci        }
6983af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_EXCLAMATION_MARK: {
6993af6ab5fSopenharmony_ci            Sa().Emit<EcmaNegate>(node);
7003af6ab5fSopenharmony_ci            break;
7013af6ab5fSopenharmony_ci        }
7023af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_PLUS_PLUS: {
7033af6ab5fSopenharmony_ci            Ra().Emit<EcmaIncdyn>(node, operand);
7043af6ab5fSopenharmony_ci            break;
7053af6ab5fSopenharmony_ci        }
7063af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_MINUS_MINUS: {
7073af6ab5fSopenharmony_ci            Ra().Emit<EcmaDecdyn>(node, operand);
7083af6ab5fSopenharmony_ci            break;
7093af6ab5fSopenharmony_ci        }
7103af6ab5fSopenharmony_ci        case lexer::TokenType::KEYW_VOID:
7113af6ab5fSopenharmony_ci        case lexer::TokenType::KEYW_DELETE: {
7123af6ab5fSopenharmony_ci            LoadConst(node, Constant::JS_UNDEFINED);
7133af6ab5fSopenharmony_ci            break;
7143af6ab5fSopenharmony_ci        }
7153af6ab5fSopenharmony_ci        default: {
7163af6ab5fSopenharmony_ci            UNREACHABLE();
7173af6ab5fSopenharmony_ci        }
7183af6ab5fSopenharmony_ci    }
7193af6ab5fSopenharmony_ci}
7203af6ab5fSopenharmony_ci
7213af6ab5fSopenharmony_civoid PandaGen::Binary(const ir::AstNode *node, lexer::TokenType op, VReg lhs)
7223af6ab5fSopenharmony_ci{
7233af6ab5fSopenharmony_ci    switch (op) {
7243af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_EQUAL: {
7253af6ab5fSopenharmony_ci            Ra().Emit<EcmaEqdyn>(node, lhs);
7263af6ab5fSopenharmony_ci            break;
7273af6ab5fSopenharmony_ci        }
7283af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_NOT_EQUAL: {
7293af6ab5fSopenharmony_ci            Ra().Emit<EcmaNoteqdyn>(node, lhs);
7303af6ab5fSopenharmony_ci            break;
7313af6ab5fSopenharmony_ci        }
7323af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_STRICT_EQUAL: {
7333af6ab5fSopenharmony_ci            Ra().Emit<EcmaStricteqdyn>(node, lhs);
7343af6ab5fSopenharmony_ci            break;
7353af6ab5fSopenharmony_ci        }
7363af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_NOT_STRICT_EQUAL: {
7373af6ab5fSopenharmony_ci            Ra().Emit<EcmaStrictnoteqdyn>(node, lhs);
7383af6ab5fSopenharmony_ci            break;
7393af6ab5fSopenharmony_ci        }
7403af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_LESS_THAN: {
7413af6ab5fSopenharmony_ci            Ra().Emit<EcmaLessdyn>(node, lhs);
7423af6ab5fSopenharmony_ci            break;
7433af6ab5fSopenharmony_ci        }
7443af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_LESS_THAN_EQUAL: {
7453af6ab5fSopenharmony_ci            Ra().Emit<EcmaLesseqdyn>(node, lhs);
7463af6ab5fSopenharmony_ci            break;
7473af6ab5fSopenharmony_ci        }
7483af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_GREATER_THAN: {
7493af6ab5fSopenharmony_ci            Ra().Emit<EcmaGreaterdyn>(node, lhs);
7503af6ab5fSopenharmony_ci            break;
7513af6ab5fSopenharmony_ci        }
7523af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_GREATER_THAN_EQUAL: {
7533af6ab5fSopenharmony_ci            Ra().Emit<EcmaGreatereqdyn>(node, lhs);
7543af6ab5fSopenharmony_ci            break;
7553af6ab5fSopenharmony_ci        }
7563af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_PLUS:
7573af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_PLUS_EQUAL: {
7583af6ab5fSopenharmony_ci            Ra().Emit<EcmaAdd2dyn>(node, lhs);
7593af6ab5fSopenharmony_ci            break;
7603af6ab5fSopenharmony_ci        }
7613af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_MINUS:
7623af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_MINUS_EQUAL: {
7633af6ab5fSopenharmony_ci            Ra().Emit<EcmaSub2dyn>(node, lhs);
7643af6ab5fSopenharmony_ci            break;
7653af6ab5fSopenharmony_ci        }
7663af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_MULTIPLY:
7673af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_MULTIPLY_EQUAL: {
7683af6ab5fSopenharmony_ci            Ra().Emit<EcmaMul2dyn>(node, lhs);
7693af6ab5fSopenharmony_ci            break;
7703af6ab5fSopenharmony_ci        }
7713af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_DIVIDE:
7723af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_DIVIDE_EQUAL: {
7733af6ab5fSopenharmony_ci            Ra().Emit<EcmaDiv2dyn>(node, lhs);
7743af6ab5fSopenharmony_ci            break;
7753af6ab5fSopenharmony_ci        }
7763af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_MOD:
7773af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_MOD_EQUAL: {
7783af6ab5fSopenharmony_ci            Ra().Emit<EcmaMod2dyn>(node, lhs);
7793af6ab5fSopenharmony_ci            break;
7803af6ab5fSopenharmony_ci        }
7813af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL:
7823af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_EXPONENTIATION: {
7833af6ab5fSopenharmony_ci            Ra().Emit<EcmaExpdyn>(node, lhs);
7843af6ab5fSopenharmony_ci            break;
7853af6ab5fSopenharmony_ci        }
7863af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_LEFT_SHIFT:
7873af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_LEFT_SHIFT_EQUAL: {
7883af6ab5fSopenharmony_ci            Ra().Emit<EcmaShl2dyn>(node, lhs);
7893af6ab5fSopenharmony_ci            break;
7903af6ab5fSopenharmony_ci        }
7913af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_RIGHT_SHIFT:
7923af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_RIGHT_SHIFT_EQUAL: {
7933af6ab5fSopenharmony_ci            Ra().Emit<EcmaShr2dyn>(node, lhs);
7943af6ab5fSopenharmony_ci            break;
7953af6ab5fSopenharmony_ci        }
7963af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT:
7973af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT_EQUAL: {
7983af6ab5fSopenharmony_ci            Ra().Emit<EcmaAshr2dyn>(node, lhs);
7993af6ab5fSopenharmony_ci            break;
8003af6ab5fSopenharmony_ci        }
8013af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_BITWISE_AND:
8023af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_BITWISE_AND_EQUAL: {
8033af6ab5fSopenharmony_ci            Ra().Emit<EcmaAnd2dyn>(node, lhs);
8043af6ab5fSopenharmony_ci            break;
8053af6ab5fSopenharmony_ci        }
8063af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_BITWISE_OR:
8073af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_BITWISE_OR_EQUAL: {
8083af6ab5fSopenharmony_ci            Ra().Emit<EcmaOr2dyn>(node, lhs);
8093af6ab5fSopenharmony_ci            break;
8103af6ab5fSopenharmony_ci        }
8113af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_BITWISE_XOR:
8123af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_BITWISE_XOR_EQUAL: {
8133af6ab5fSopenharmony_ci            Ra().Emit<EcmaXor2dyn>(node, lhs);
8143af6ab5fSopenharmony_ci            break;
8153af6ab5fSopenharmony_ci        }
8163af6ab5fSopenharmony_ci        case lexer::TokenType::KEYW_IN: {
8173af6ab5fSopenharmony_ci            Ra().Emit<EcmaIsindyn>(node, lhs);
8183af6ab5fSopenharmony_ci            break;
8193af6ab5fSopenharmony_ci        }
8203af6ab5fSopenharmony_ci        case lexer::TokenType::KEYW_INSTANCEOF: {
8213af6ab5fSopenharmony_ci            Ra().Emit<EcmaInstanceofdyn>(node, lhs);
8223af6ab5fSopenharmony_ci            break;
8233af6ab5fSopenharmony_ci        }
8243af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_NULLISH_COALESCING:
8253af6ab5fSopenharmony_ci        case lexer::TokenType::PUNCTUATOR_LOGICAL_NULLISH_EQUAL: {
8263af6ab5fSopenharmony_ci            Unimplemented();
8273af6ab5fSopenharmony_ci            break;
8283af6ab5fSopenharmony_ci        }
8293af6ab5fSopenharmony_ci        default: {
8303af6ab5fSopenharmony_ci            UNREACHABLE();
8313af6ab5fSopenharmony_ci        }
8323af6ab5fSopenharmony_ci    }
8333af6ab5fSopenharmony_ci}
8343af6ab5fSopenharmony_ci
8353af6ab5fSopenharmony_civoid PandaGen::BranchIfUndefined(const ir::AstNode *node, Label *target)
8363af6ab5fSopenharmony_ci{
8373af6ab5fSopenharmony_ci    Sa().Emit<EcmaIsundefined>(node);
8383af6ab5fSopenharmony_ci    BranchIfTrue(node, target);
8393af6ab5fSopenharmony_ci}
8403af6ab5fSopenharmony_ci
8413af6ab5fSopenharmony_civoid PandaGen::BranchIfNotUndefined(const ir::AstNode *node, Label *target)
8423af6ab5fSopenharmony_ci{
8433af6ab5fSopenharmony_ci    Sa().Emit<EcmaIsundefined>(node);
8443af6ab5fSopenharmony_ci    BranchIfFalse(node, target);
8453af6ab5fSopenharmony_ci}
8463af6ab5fSopenharmony_ci
8473af6ab5fSopenharmony_civoid PandaGen::BranchIfTrue(const ir::AstNode *node, Label *target)
8483af6ab5fSopenharmony_ci{
8493af6ab5fSopenharmony_ci    Sa().Emit<EcmaJtrue>(node, target);
8503af6ab5fSopenharmony_ci}
8513af6ab5fSopenharmony_ci
8523af6ab5fSopenharmony_civoid PandaGen::BranchIfNotTrue(const ir::AstNode *node, Label *target)
8533af6ab5fSopenharmony_ci{
8543af6ab5fSopenharmony_ci    Sa().Emit<EcmaIstrue>(node);
8553af6ab5fSopenharmony_ci    BranchIfFalse(node, target);
8563af6ab5fSopenharmony_ci}
8573af6ab5fSopenharmony_ci
8583af6ab5fSopenharmony_civoid PandaGen::BranchIfFalse(const ir::AstNode *node, Label *target)
8593af6ab5fSopenharmony_ci{
8603af6ab5fSopenharmony_ci    Sa().Emit<EcmaJfalse>(node, target);
8613af6ab5fSopenharmony_ci}
8623af6ab5fSopenharmony_ci
8633af6ab5fSopenharmony_civoid PandaGen::BranchIfCoercible(const ir::AstNode *node, Label *target)
8643af6ab5fSopenharmony_ci{
8653af6ab5fSopenharmony_ci    Sa().Emit<EcmaIscoercible>(node);
8663af6ab5fSopenharmony_ci    BranchIfTrue(node, target);
8673af6ab5fSopenharmony_ci}
8683af6ab5fSopenharmony_ci
8693af6ab5fSopenharmony_civoid PandaGen::EmitThrow(const ir::AstNode *node)
8703af6ab5fSopenharmony_ci{
8713af6ab5fSopenharmony_ci    Sa().Emit<EcmaThrowdyn>(node);
8723af6ab5fSopenharmony_ci}
8733af6ab5fSopenharmony_ci
8743af6ab5fSopenharmony_civoid PandaGen::EmitRethrow(const ir::AstNode *node)
8753af6ab5fSopenharmony_ci{
8763af6ab5fSopenharmony_ci    Sa().Emit<EcmaRethrowdyn>(node);
8773af6ab5fSopenharmony_ci}
8783af6ab5fSopenharmony_ci
8793af6ab5fSopenharmony_civoid PandaGen::EmitReturn(const ir::AstNode *node)
8803af6ab5fSopenharmony_ci{
8813af6ab5fSopenharmony_ci    Sa().Emit<EcmaReturnDyn>(node);
8823af6ab5fSopenharmony_ci}
8833af6ab5fSopenharmony_ci
8843af6ab5fSopenharmony_civoid PandaGen::EmitReturnUndefined(const ir::AstNode *node)
8853af6ab5fSopenharmony_ci{
8863af6ab5fSopenharmony_ci    Sa().Emit<EcmaReturnundefined>(node);
8873af6ab5fSopenharmony_ci}
8883af6ab5fSopenharmony_ci
8893af6ab5fSopenharmony_civoid PandaGen::ImplicitReturn(const ir::AstNode *node)
8903af6ab5fSopenharmony_ci{
8913af6ab5fSopenharmony_ci    builder_->ImplicitReturn(node);
8923af6ab5fSopenharmony_ci}
8933af6ab5fSopenharmony_ci
8943af6ab5fSopenharmony_civoid PandaGen::DirectReturn(const ir::AstNode *node)
8953af6ab5fSopenharmony_ci{
8963af6ab5fSopenharmony_ci    builder_->DirectReturn(node);
8973af6ab5fSopenharmony_ci}
8983af6ab5fSopenharmony_ci
8993af6ab5fSopenharmony_civoid PandaGen::ValidateClassDirectReturn(const ir::AstNode *node)
9003af6ab5fSopenharmony_ci{
9013af6ab5fSopenharmony_ci    const ir::ScriptFunction *func = util::Helpers::GetContainingFunction(node);
9023af6ab5fSopenharmony_ci
9033af6ab5fSopenharmony_ci    if (func == nullptr || !func->IsConstructor()) {
9043af6ab5fSopenharmony_ci        return;
9053af6ab5fSopenharmony_ci    }
9063af6ab5fSopenharmony_ci
9073af6ab5fSopenharmony_ci    RegScope rs(this);
9083af6ab5fSopenharmony_ci    VReg value = AllocReg();
9093af6ab5fSopenharmony_ci    StoreAccumulator(node, value);
9103af6ab5fSopenharmony_ci
9113af6ab5fSopenharmony_ci    auto *notUndefined = AllocLabel();
9123af6ab5fSopenharmony_ci    auto *condEnd = AllocLabel();
9133af6ab5fSopenharmony_ci
9143af6ab5fSopenharmony_ci    BranchIfNotUndefined(node, notUndefined);
9153af6ab5fSopenharmony_ci    GetThis(func);
9163af6ab5fSopenharmony_ci    ThrowIfSuperNotCorrectCall(func, 0);
9173af6ab5fSopenharmony_ci    Branch(node, condEnd);
9183af6ab5fSopenharmony_ci
9193af6ab5fSopenharmony_ci    SetLabel(node, notUndefined);
9203af6ab5fSopenharmony_ci    LoadAccumulator(node, value);
9213af6ab5fSopenharmony_ci
9223af6ab5fSopenharmony_ci    SetLabel(node, condEnd);
9233af6ab5fSopenharmony_ci}
9243af6ab5fSopenharmony_ci
9253af6ab5fSopenharmony_civoid PandaGen::EmitAwait(const ir::AstNode *node)
9263af6ab5fSopenharmony_ci{
9273af6ab5fSopenharmony_ci    builder_->Await(node);
9283af6ab5fSopenharmony_ci}
9293af6ab5fSopenharmony_ci
9303af6ab5fSopenharmony_civoid PandaGen::Call0This(const ir::AstNode *node, VReg callee, VReg thisReg)
9313af6ab5fSopenharmony_ci{
9323af6ab5fSopenharmony_ci    LoadAccumulator(node, thisReg);
9333af6ab5fSopenharmony_ci    Ra().Emit<EcmaCall0thisdyn>(node, callee);
9343af6ab5fSopenharmony_ci}
9353af6ab5fSopenharmony_ci
9363af6ab5fSopenharmony_civoid PandaGen::Call1This(const ir::AstNode *node, VReg callee, VReg thisReg, VReg arg0)
9373af6ab5fSopenharmony_ci{
9383af6ab5fSopenharmony_ci    LoadAccumulator(node, arg0);
9393af6ab5fSopenharmony_ci    Ra().Emit<EcmaCall1thisdyn>(node, callee, thisReg);
9403af6ab5fSopenharmony_ci}
9413af6ab5fSopenharmony_ci
9423af6ab5fSopenharmony_civoid PandaGen::Call0Args(const ir::AstNode *n, VReg c, VReg thisR, bool hasThis)
9433af6ab5fSopenharmony_ci{
9443af6ab5fSopenharmony_ci    if (hasThis) {
9453af6ab5fSopenharmony_ci        Call0This(n, c, thisR);
9463af6ab5fSopenharmony_ci    } else {
9473af6ab5fSopenharmony_ci        Sa().Emit<EcmaCall0dyn>(n);
9483af6ab5fSopenharmony_ci    }
9493af6ab5fSopenharmony_ci}
9503af6ab5fSopenharmony_ci
9513af6ab5fSopenharmony_civoid PandaGen::Call1Arg(const ir::AstNode *n, VReg c, VReg thisR, const ArenaVector<ir::Expression *> &args,
9523af6ab5fSopenharmony_ci                        bool hasThis)
9533af6ab5fSopenharmony_ci{
9543af6ab5fSopenharmony_ci    const auto *arg0 = args[0];
9553af6ab5fSopenharmony_ci    arg0->Compile(this);
9563af6ab5fSopenharmony_ci
9573af6ab5fSopenharmony_ci    if (hasThis) {
9583af6ab5fSopenharmony_ci        Ra().Emit<EcmaCall1thisdyn>(n, c, thisR);
9593af6ab5fSopenharmony_ci    } else {
9603af6ab5fSopenharmony_ci        Ra().Emit<EcmaCall1dyn>(n, c);
9613af6ab5fSopenharmony_ci    }
9623af6ab5fSopenharmony_ci}
9633af6ab5fSopenharmony_ci
9643af6ab5fSopenharmony_civoid PandaGen::Call2Args(const ir::AstNode *n, VReg c, VReg thisR, const ArenaVector<ir::Expression *> &args,
9653af6ab5fSopenharmony_ci                         bool hasThis)
9663af6ab5fSopenharmony_ci{
9673af6ab5fSopenharmony_ci    const auto *arg0 = args[0];
9683af6ab5fSopenharmony_ci    arg0->Compile(this);
9693af6ab5fSopenharmony_ci    compiler::VReg arg0Reg = AllocReg();
9703af6ab5fSopenharmony_ci    StoreAccumulator(arg0, arg0Reg);
9713af6ab5fSopenharmony_ci
9723af6ab5fSopenharmony_ci    const auto *arg1 = args[1];
9733af6ab5fSopenharmony_ci    arg1->Compile(this);
9743af6ab5fSopenharmony_ci
9753af6ab5fSopenharmony_ci    if (hasThis) {
9763af6ab5fSopenharmony_ci        Ra().Emit<EcmaCall2thisdyn>(n, c, thisR, arg0Reg);
9773af6ab5fSopenharmony_ci    } else {
9783af6ab5fSopenharmony_ci        Ra().Emit<EcmaCall2dyn>(n, c, arg0Reg);
9793af6ab5fSopenharmony_ci    }
9803af6ab5fSopenharmony_ci}
9813af6ab5fSopenharmony_ci
9823af6ab5fSopenharmony_civoid PandaGen::Call3Args(const ir::AstNode *n, VReg c, VReg thisR, const ArenaVector<ir::Expression *> &args,
9833af6ab5fSopenharmony_ci                         bool hasThis)
9843af6ab5fSopenharmony_ci{
9853af6ab5fSopenharmony_ci    const auto *arg0 = args[0];
9863af6ab5fSopenharmony_ci    arg0->Compile(this);
9873af6ab5fSopenharmony_ci    compiler::VReg arg0Reg = AllocReg();
9883af6ab5fSopenharmony_ci    StoreAccumulator(arg0, arg0Reg);
9893af6ab5fSopenharmony_ci
9903af6ab5fSopenharmony_ci    const auto *arg1 = args[1];
9913af6ab5fSopenharmony_ci    arg1->Compile(this);
9923af6ab5fSopenharmony_ci    compiler::VReg arg1Reg = AllocReg();
9933af6ab5fSopenharmony_ci    StoreAccumulator(arg1, arg1Reg);
9943af6ab5fSopenharmony_ci
9953af6ab5fSopenharmony_ci    const auto *arg2 = args[2];
9963af6ab5fSopenharmony_ci    arg2->Compile(this);
9973af6ab5fSopenharmony_ci
9983af6ab5fSopenharmony_ci    if (hasThis) {
9993af6ab5fSopenharmony_ci        Ra().Emit<EcmaCall3thisdyn>(n, c, thisR, arg0Reg, arg1Reg);
10003af6ab5fSopenharmony_ci    } else {
10013af6ab5fSopenharmony_ci        Ra().Emit<EcmaCall3dyn>(n, c, arg0Reg, arg1Reg);
10023af6ab5fSopenharmony_ci    }
10033af6ab5fSopenharmony_ci}
10043af6ab5fSopenharmony_ci
10053af6ab5fSopenharmony_civoid PandaGen::Call(const ir::AstNode *node, VReg callee, VReg thisReg, const ArenaVector<ir::Expression *> &arguments)
10063af6ab5fSopenharmony_ci{
10073af6ab5fSopenharmony_ci    bool hasThis = !thisReg.IsInvalid();
10083af6ab5fSopenharmony_ci
10093af6ab5fSopenharmony_ci    switch (arguments.size()) {
10103af6ab5fSopenharmony_ci        case 0: {  // 0 args
10113af6ab5fSopenharmony_ci            Call0Args(node, callee, thisReg, hasThis);
10123af6ab5fSopenharmony_ci            return;
10133af6ab5fSopenharmony_ci        }
10143af6ab5fSopenharmony_ci        case 1: {  // 1 arg
10153af6ab5fSopenharmony_ci            Call1Arg(node, callee, thisReg, arguments, hasThis);
10163af6ab5fSopenharmony_ci            return;
10173af6ab5fSopenharmony_ci        }
10183af6ab5fSopenharmony_ci        case 2: {  // 2 args
10193af6ab5fSopenharmony_ci            Call2Args(node, callee, thisReg, arguments, hasThis);
10203af6ab5fSopenharmony_ci            return;
10213af6ab5fSopenharmony_ci        }
10223af6ab5fSopenharmony_ci        case 3: {  // 3 args
10233af6ab5fSopenharmony_ci            Call3Args(node, callee, thisReg, arguments, hasThis);
10243af6ab5fSopenharmony_ci            return;
10253af6ab5fSopenharmony_ci        }
10263af6ab5fSopenharmony_ci        default: {
10273af6ab5fSopenharmony_ci            break;
10283af6ab5fSopenharmony_ci        }
10293af6ab5fSopenharmony_ci    }
10303af6ab5fSopenharmony_ci
10313af6ab5fSopenharmony_ci    for (const auto *it : arguments) {
10323af6ab5fSopenharmony_ci        it->Compile(this);
10333af6ab5fSopenharmony_ci        compiler::VReg arg = AllocReg();
10343af6ab5fSopenharmony_ci        StoreAccumulator(it, arg);
10353af6ab5fSopenharmony_ci    }
10363af6ab5fSopenharmony_ci
10373af6ab5fSopenharmony_ci    if (hasThis) {
10383af6ab5fSopenharmony_ci        size_t argCount = arguments.size() + 1;
10393af6ab5fSopenharmony_ci        auto constexpr EXTRA_ARGS = 2;
10403af6ab5fSopenharmony_ci        Rra().Emit<EcmaCallithisrangedyn>(node, callee, argCount + EXTRA_ARGS, static_cast<int64_t>(argCount), callee);
10413af6ab5fSopenharmony_ci    } else {
10423af6ab5fSopenharmony_ci        size_t argCount = arguments.size();
10433af6ab5fSopenharmony_ci        Rra().Emit<EcmaCallirangedyn>(node, callee, argCount + 1, static_cast<int64_t>(argCount), callee);
10443af6ab5fSopenharmony_ci    }
10453af6ab5fSopenharmony_ci}
10463af6ab5fSopenharmony_ci
10473af6ab5fSopenharmony_cibool PandaGen::CallArgsTagged(const ir::AstNode *node, VReg callee, VReg thisReg,
10483af6ab5fSopenharmony_ci                              const ArenaVector<ir::Expression *> &arguments, bool hasThis)
10493af6ab5fSopenharmony_ci{
10503af6ab5fSopenharmony_ci    VReg arg0Reg = AllocReg();
10513af6ab5fSopenharmony_ci    StoreAccumulator(node, arg0Reg);
10523af6ab5fSopenharmony_ci
10533af6ab5fSopenharmony_ci    const auto call1 = [this, hasThis, arg0Reg](const ir::AstNode *n, VReg c, VReg thisR,
10543af6ab5fSopenharmony_ci                                                const ArenaVector<ir::Expression *> &args) {
10553af6ab5fSopenharmony_ci        const auto *arg = args[0];
10563af6ab5fSopenharmony_ci        arg->Compile(this);
10573af6ab5fSopenharmony_ci
10583af6ab5fSopenharmony_ci        if (hasThis) {
10593af6ab5fSopenharmony_ci            Ra().Emit<EcmaCall2thisdyn>(n, c, thisR, arg0Reg);
10603af6ab5fSopenharmony_ci        } else {
10613af6ab5fSopenharmony_ci            Ra().Emit<EcmaCall2dyn>(n, c, arg0Reg);
10623af6ab5fSopenharmony_ci        }
10633af6ab5fSopenharmony_ci    };
10643af6ab5fSopenharmony_ci    const auto call2 = [this, hasThis, arg0Reg](const ir::AstNode *n, VReg c, VReg thisR,
10653af6ab5fSopenharmony_ci                                                const ArenaVector<ir::Expression *> &args) {
10663af6ab5fSopenharmony_ci        const auto *arg1 = args[0];
10673af6ab5fSopenharmony_ci        arg1->Compile(this);
10683af6ab5fSopenharmony_ci        compiler::VReg arg1Reg = AllocReg();
10693af6ab5fSopenharmony_ci        StoreAccumulator(arg1, arg1Reg);
10703af6ab5fSopenharmony_ci
10713af6ab5fSopenharmony_ci        const auto *arg2 = args[1];
10723af6ab5fSopenharmony_ci        arg2->Compile(this);
10733af6ab5fSopenharmony_ci
10743af6ab5fSopenharmony_ci        if (hasThis) {
10753af6ab5fSopenharmony_ci            Ra().Emit<EcmaCall3thisdyn>(n, c, thisR, arg0Reg, arg1Reg);
10763af6ab5fSopenharmony_ci        } else {
10773af6ab5fSopenharmony_ci            Ra().Emit<EcmaCall3dyn>(n, c, arg0Reg, arg1Reg);
10783af6ab5fSopenharmony_ci        }
10793af6ab5fSopenharmony_ci    };
10803af6ab5fSopenharmony_ci
10813af6ab5fSopenharmony_ci    switch (arguments.size()) {
10823af6ab5fSopenharmony_ci        case 1: {
10833af6ab5fSopenharmony_ci            call1(node, callee, thisReg, arguments);
10843af6ab5fSopenharmony_ci            return true;
10853af6ab5fSopenharmony_ci        }
10863af6ab5fSopenharmony_ci        case 2: {  // 2:2 args
10873af6ab5fSopenharmony_ci            call2(node, callee, thisReg, arguments);
10883af6ab5fSopenharmony_ci            return true;
10893af6ab5fSopenharmony_ci        }
10903af6ab5fSopenharmony_ci        default: {
10913af6ab5fSopenharmony_ci            break;
10923af6ab5fSopenharmony_ci        }
10933af6ab5fSopenharmony_ci    }
10943af6ab5fSopenharmony_ci    return false;
10953af6ab5fSopenharmony_ci}
10963af6ab5fSopenharmony_ci
10973af6ab5fSopenharmony_civoid PandaGen::CallTagged(const ir::AstNode *node, VReg callee, VReg thisReg,
10983af6ab5fSopenharmony_ci                          const ArenaVector<ir::Expression *> &arguments)
10993af6ab5fSopenharmony_ci{
11003af6ab5fSopenharmony_ci    bool hasThis = !thisReg.IsInvalid();
11013af6ab5fSopenharmony_ci
11023af6ab5fSopenharmony_ci    StoreAccumulator(node, callee);
11033af6ab5fSopenharmony_ci    Literals::GetTemplateObject(this, node->AsTaggedTemplateExpression());
11043af6ab5fSopenharmony_ci
11053af6ab5fSopenharmony_ci    if (arguments.empty()) {
11063af6ab5fSopenharmony_ci        if (hasThis) {
11073af6ab5fSopenharmony_ci            Ra().Emit<EcmaCall1thisdyn>(node, callee, thisReg);
11083af6ab5fSopenharmony_ci        } else {
11093af6ab5fSopenharmony_ci            Sa().Emit<EcmaCall1dyn>(node, callee);
11103af6ab5fSopenharmony_ci        }
11113af6ab5fSopenharmony_ci        return;
11123af6ab5fSopenharmony_ci    }
11133af6ab5fSopenharmony_ci
11143af6ab5fSopenharmony_ci    if (CallArgsTagged(node, callee, thisReg, arguments, hasThis)) {
11153af6ab5fSopenharmony_ci        return;
11163af6ab5fSopenharmony_ci    }
11173af6ab5fSopenharmony_ci
11183af6ab5fSopenharmony_ci    for (const auto *it : arguments) {
11193af6ab5fSopenharmony_ci        it->Compile(this);
11203af6ab5fSopenharmony_ci        compiler::VReg arg = AllocReg();
11213af6ab5fSopenharmony_ci        StoreAccumulator(it, arg);
11223af6ab5fSopenharmony_ci    }
11233af6ab5fSopenharmony_ci
11243af6ab5fSopenharmony_ci    if (hasThis) {
11253af6ab5fSopenharmony_ci        auto constexpr EXTRA_ARGS = 2;
11263af6ab5fSopenharmony_ci        size_t argCount = arguments.size() + EXTRA_ARGS;
11273af6ab5fSopenharmony_ci        Rra().Emit<EcmaCallithisrangedyn>(node, callee, argCount + EXTRA_ARGS, static_cast<int64_t>(argCount), callee);
11283af6ab5fSopenharmony_ci    } else {
11293af6ab5fSopenharmony_ci        size_t argCount = arguments.size() + 1;
11303af6ab5fSopenharmony_ci        Rra().Emit<EcmaCallirangedyn>(node, callee, argCount + 1, static_cast<int64_t>(argCount), callee);
11313af6ab5fSopenharmony_ci    }
11323af6ab5fSopenharmony_ci}
11333af6ab5fSopenharmony_ci
11343af6ab5fSopenharmony_civoid PandaGen::SuperCall(const ir::AstNode *node, VReg startReg, size_t argCount)
11353af6ab5fSopenharmony_ci{
11363af6ab5fSopenharmony_ci    Rra().Emit<EcmaSupercall>(node, startReg, argCount, static_cast<int64_t>(argCount), startReg);
11373af6ab5fSopenharmony_ci}
11383af6ab5fSopenharmony_ci
11393af6ab5fSopenharmony_civoid PandaGen::SuperCallSpread(const ir::AstNode *node, VReg vs)
11403af6ab5fSopenharmony_ci{
11413af6ab5fSopenharmony_ci    Ra().Emit<EcmaSupercallspread>(node, vs);
11423af6ab5fSopenharmony_ci}
11433af6ab5fSopenharmony_ci
11443af6ab5fSopenharmony_civoid PandaGen::NewObject(const ir::AstNode *node, VReg startReg, size_t argCount)
11453af6ab5fSopenharmony_ci{
11463af6ab5fSopenharmony_ci    Rra().Emit<EcmaNewobjdynrange>(node, startReg, argCount, static_cast<int64_t>(argCount), startReg);
11473af6ab5fSopenharmony_ci}
11483af6ab5fSopenharmony_ci
11493af6ab5fSopenharmony_civoid PandaGen::LoadHomeObject(const ir::AstNode *node)
11503af6ab5fSopenharmony_ci{
11513af6ab5fSopenharmony_ci    Sa().Emit<EcmaLdhomeobject>(node);
11523af6ab5fSopenharmony_ci}
11533af6ab5fSopenharmony_ci
11543af6ab5fSopenharmony_civoid PandaGen::DefineMethod(const ir::AstNode *node, const util::StringView &name)
11553af6ab5fSopenharmony_ci{
11563af6ab5fSopenharmony_ci    Ra().Emit<EcmaDefinemethod>(node, name, LexEnv());
11573af6ab5fSopenharmony_ci}
11583af6ab5fSopenharmony_ci
11593af6ab5fSopenharmony_civoid PandaGen::DefineFunction(const ir::AstNode *node, const ir::ScriptFunction *realNode, const util::StringView &name)
11603af6ab5fSopenharmony_ci{
11613af6ab5fSopenharmony_ci    if (realNode->IsAsyncFunc()) {
11623af6ab5fSopenharmony_ci        if (realNode->IsGenerator()) {
11633af6ab5fSopenharmony_ci            Ra().Emit<EcmaDefineasyncgeneratorfunc>(node, name, LexEnv());
11643af6ab5fSopenharmony_ci        } else {
11653af6ab5fSopenharmony_ci            Ra().Emit<EcmaDefineasyncfunc>(node, name, LexEnv());
11663af6ab5fSopenharmony_ci        }
11673af6ab5fSopenharmony_ci    } else if (realNode->IsGenerator()) {
11683af6ab5fSopenharmony_ci        Ra().Emit<EcmaDefinegeneratorfunc>(node, name, LexEnv());
11693af6ab5fSopenharmony_ci    } else if (realNode->IsArrow()) {
11703af6ab5fSopenharmony_ci        LoadHomeObject(node);
11713af6ab5fSopenharmony_ci        Ra().Emit<EcmaDefinencfuncdyn>(node, name, LexEnv());
11723af6ab5fSopenharmony_ci    } else if (realNode->IsMethod()) {
11733af6ab5fSopenharmony_ci        DefineMethod(node, name);
11743af6ab5fSopenharmony_ci    } else {
11753af6ab5fSopenharmony_ci        Ra().Emit<EcmaDefinefuncdyn>(node, name, LexEnv());
11763af6ab5fSopenharmony_ci    }
11773af6ab5fSopenharmony_ci}
11783af6ab5fSopenharmony_ci
11793af6ab5fSopenharmony_civoid PandaGen::TypeOf(const ir::AstNode *node)
11803af6ab5fSopenharmony_ci{
11813af6ab5fSopenharmony_ci    Sa().Emit<EcmaTypeofdyn>(node);
11823af6ab5fSopenharmony_ci}
11833af6ab5fSopenharmony_ci
11843af6ab5fSopenharmony_civoid PandaGen::CallSpread(const ir::AstNode *node, VReg func, VReg thisReg, VReg args)
11853af6ab5fSopenharmony_ci{
11863af6ab5fSopenharmony_ci    Ra().Emit<EcmaCallspreaddyn>(node, func, thisReg, args);
11873af6ab5fSopenharmony_ci}
11883af6ab5fSopenharmony_ci
11893af6ab5fSopenharmony_civoid PandaGen::NewObjSpread(const ir::AstNode *node, VReg obj, VReg target)
11903af6ab5fSopenharmony_ci{
11913af6ab5fSopenharmony_ci    Ra().Emit<EcmaNewobjspreaddyn>(node, obj, target);
11923af6ab5fSopenharmony_ci}
11933af6ab5fSopenharmony_ci
11943af6ab5fSopenharmony_civoid PandaGen::GetUnmappedArgs(const ir::AstNode *node)
11953af6ab5fSopenharmony_ci{
11963af6ab5fSopenharmony_ci    Sa().Emit<EcmaGetunmappedargs>(node);
11973af6ab5fSopenharmony_ci}
11983af6ab5fSopenharmony_ci
11993af6ab5fSopenharmony_civoid PandaGen::Negate(const ir::AstNode *node)
12003af6ab5fSopenharmony_ci{
12013af6ab5fSopenharmony_ci    Sa().Emit<EcmaNegate>(node);
12023af6ab5fSopenharmony_ci}
12033af6ab5fSopenharmony_ci
12043af6ab5fSopenharmony_civoid PandaGen::ToBoolean(const ir::AstNode *node)
12053af6ab5fSopenharmony_ci{
12063af6ab5fSopenharmony_ci    Sa().Emit<EcmaToboolean>(node);
12073af6ab5fSopenharmony_ci}
12083af6ab5fSopenharmony_ci
12093af6ab5fSopenharmony_civoid PandaGen::ToNumber(const ir::AstNode *node, VReg arg)
12103af6ab5fSopenharmony_ci{
12113af6ab5fSopenharmony_ci    Ra().Emit<EcmaTonumber>(node, arg);
12123af6ab5fSopenharmony_ci}
12133af6ab5fSopenharmony_ci
12143af6ab5fSopenharmony_civoid PandaGen::GetMethod(const ir::AstNode *node, VReg obj, const util::StringView &name)
12153af6ab5fSopenharmony_ci{
12163af6ab5fSopenharmony_ci    Ra().Emit<EcmaGetmethod>(node, name, obj);
12173af6ab5fSopenharmony_ci}
12183af6ab5fSopenharmony_ci
12193af6ab5fSopenharmony_civoid PandaGen::CreateGeneratorObj(const ir::AstNode *node, VReg funcObj)
12203af6ab5fSopenharmony_ci{
12213af6ab5fSopenharmony_ci    Ra().Emit<EcmaCreategeneratorobj>(node, funcObj);
12223af6ab5fSopenharmony_ci}
12233af6ab5fSopenharmony_ci
12243af6ab5fSopenharmony_civoid PandaGen::CreateAsyncGeneratorObj(const ir::AstNode *node, VReg funcObj)
12253af6ab5fSopenharmony_ci{
12263af6ab5fSopenharmony_ci    Ra().Emit<EcmaCreateasyncgeneratorobj>(node, funcObj);
12273af6ab5fSopenharmony_ci}
12283af6ab5fSopenharmony_ci
12293af6ab5fSopenharmony_civoid PandaGen::CreateIterResultObject(const ir::AstNode *node, bool done)
12303af6ab5fSopenharmony_ci{
12313af6ab5fSopenharmony_ci    Ra().Emit<EcmaCreateiterresultobj>(node, static_cast<int32_t>(done));
12323af6ab5fSopenharmony_ci}
12333af6ab5fSopenharmony_ci
12343af6ab5fSopenharmony_civoid PandaGen::SuspendGenerator(const ir::AstNode *node, VReg genObj)
12353af6ab5fSopenharmony_ci{
12363af6ab5fSopenharmony_ci    Ra().Emit<EcmaSuspendgenerator>(node, genObj);
12373af6ab5fSopenharmony_ci}
12383af6ab5fSopenharmony_ci
12393af6ab5fSopenharmony_civoid PandaGen::SuspendAsyncGenerator(const ir::AstNode *node, VReg asyncGenObj)
12403af6ab5fSopenharmony_ci{
12413af6ab5fSopenharmony_ci    Ra().Emit<EcmaSuspendasyncgenerator>(node, asyncGenObj);
12423af6ab5fSopenharmony_ci}
12433af6ab5fSopenharmony_ci
12443af6ab5fSopenharmony_civoid PandaGen::GeneratorYield(const ir::AstNode *node, VReg genObj)
12453af6ab5fSopenharmony_ci{
12463af6ab5fSopenharmony_ci    Ra().Emit<EcmaSetgeneratorstate>(node, genObj, static_cast<int32_t>(GeneratorState::SUSPENDED_YIELD));
12473af6ab5fSopenharmony_ci}
12483af6ab5fSopenharmony_ci
12493af6ab5fSopenharmony_civoid PandaGen::GeneratorComplete(const ir::AstNode *node, VReg genObj)
12503af6ab5fSopenharmony_ci{
12513af6ab5fSopenharmony_ci    Ra().Emit<EcmaSetgeneratorstate>(node, genObj, static_cast<int32_t>(GeneratorState::COMPLETED));
12523af6ab5fSopenharmony_ci}
12533af6ab5fSopenharmony_ci
12543af6ab5fSopenharmony_civoid PandaGen::ResumeGenerator(const ir::AstNode *node, VReg genObj)
12553af6ab5fSopenharmony_ci{
12563af6ab5fSopenharmony_ci    Ra().Emit<EcmaResumegenerator>(node, genObj);
12573af6ab5fSopenharmony_ci}
12583af6ab5fSopenharmony_ci
12593af6ab5fSopenharmony_civoid PandaGen::GetResumeMode(const ir::AstNode *node, VReg genObj)
12603af6ab5fSopenharmony_ci{
12613af6ab5fSopenharmony_ci    Ra().Emit<EcmaGetresumemode>(node, genObj);
12623af6ab5fSopenharmony_ci}
12633af6ab5fSopenharmony_ci
12643af6ab5fSopenharmony_civoid PandaGen::AsyncFunctionEnter(const ir::AstNode *node)
12653af6ab5fSopenharmony_ci{
12663af6ab5fSopenharmony_ci    Sa().Emit<EcmaAsyncfunctionenter>(node);
12673af6ab5fSopenharmony_ci}
12683af6ab5fSopenharmony_ci
12693af6ab5fSopenharmony_civoid PandaGen::AsyncFunctionAwait(const ir::AstNode *node, VReg asyncFuncObj)
12703af6ab5fSopenharmony_ci{
12713af6ab5fSopenharmony_ci    Ra().Emit<EcmaAsyncfunctionawait>(node, asyncFuncObj);
12723af6ab5fSopenharmony_ci}
12733af6ab5fSopenharmony_ci
12743af6ab5fSopenharmony_civoid PandaGen::AsyncFunctionResolve(const ir::AstNode *node, VReg asyncFuncObj)
12753af6ab5fSopenharmony_ci{
12763af6ab5fSopenharmony_ci    Ra().Emit<EcmaAsyncfunctionresolve>(node, asyncFuncObj);
12773af6ab5fSopenharmony_ci}
12783af6ab5fSopenharmony_ci
12793af6ab5fSopenharmony_civoid PandaGen::AsyncFunctionReject(const ir::AstNode *node, VReg asyncFuncObj)
12803af6ab5fSopenharmony_ci{
12813af6ab5fSopenharmony_ci    Ra().Emit<EcmaAsyncfunctionreject>(node, asyncFuncObj);
12823af6ab5fSopenharmony_ci}
12833af6ab5fSopenharmony_ci
12843af6ab5fSopenharmony_civoid PandaGen::AsyncGeneratorResolve(const ir::AstNode *node, VReg asyncGenObj)
12853af6ab5fSopenharmony_ci{
12863af6ab5fSopenharmony_ci    Ra().Emit<EcmaAsyncgeneratorresolve>(node, asyncGenObj);
12873af6ab5fSopenharmony_ci}
12883af6ab5fSopenharmony_ci
12893af6ab5fSopenharmony_civoid PandaGen::AsyncGeneratorReject(const ir::AstNode *node, VReg asyncGenObj)
12903af6ab5fSopenharmony_ci{
12913af6ab5fSopenharmony_ci    Ra().Emit<EcmaAsyncgeneratorreject>(node, asyncGenObj);
12923af6ab5fSopenharmony_ci}
12933af6ab5fSopenharmony_ci
12943af6ab5fSopenharmony_civoid PandaGen::GetTemplateObject(const ir::AstNode *node, VReg value)
12953af6ab5fSopenharmony_ci{
12963af6ab5fSopenharmony_ci    Ra().Emit<EcmaGettemplateobject>(node, value);
12973af6ab5fSopenharmony_ci}
12983af6ab5fSopenharmony_ci
12993af6ab5fSopenharmony_civoid PandaGen::CopyRestArgs(const ir::AstNode *node, uint32_t index)
13003af6ab5fSopenharmony_ci{
13013af6ab5fSopenharmony_ci    Sa().Emit<EcmaCopyrestargs>(node, index);
13023af6ab5fSopenharmony_ci}
13033af6ab5fSopenharmony_ci
13043af6ab5fSopenharmony_civoid PandaGen::GetPropIterator(const ir::AstNode *node)
13053af6ab5fSopenharmony_ci{
13063af6ab5fSopenharmony_ci    Sa().Emit<EcmaGetpropiterator>(node);
13073af6ab5fSopenharmony_ci}
13083af6ab5fSopenharmony_ci
13093af6ab5fSopenharmony_civoid PandaGen::GetNextPropName(const ir::AstNode *node, VReg iter)
13103af6ab5fSopenharmony_ci{
13113af6ab5fSopenharmony_ci    Ra().Emit<EcmaGetnextpropname>(node, iter);
13123af6ab5fSopenharmony_ci}
13133af6ab5fSopenharmony_ci
13143af6ab5fSopenharmony_civoid PandaGen::CreateEmptyObject(const ir::AstNode *node)
13153af6ab5fSopenharmony_ci{
13163af6ab5fSopenharmony_ci    Sa().Emit<EcmaCreateemptyobject>(node);
13173af6ab5fSopenharmony_ci}
13183af6ab5fSopenharmony_ci
13193af6ab5fSopenharmony_civoid PandaGen::CreateObjectWithBuffer(const ir::AstNode *node, uint32_t idx)
13203af6ab5fSopenharmony_ci{
13213af6ab5fSopenharmony_ci    ASSERT(util::Helpers::IsInteger<uint32_t>(idx));
13223af6ab5fSopenharmony_ci    Sa().Emit<EcmaCreateobjectwithbuffer>(node, util::Helpers::ToStringView(Allocator(), idx));
13233af6ab5fSopenharmony_ci}
13243af6ab5fSopenharmony_ci
13253af6ab5fSopenharmony_civoid PandaGen::CreateObjectHavingMethod(const ir::AstNode *node, uint32_t idx)
13263af6ab5fSopenharmony_ci{
13273af6ab5fSopenharmony_ci    ASSERT(util::Helpers::IsInteger<uint32_t>(idx));
13283af6ab5fSopenharmony_ci    LoadAccumulator(node, LexEnv());
13293af6ab5fSopenharmony_ci    Sa().Emit<EcmaCreateobjecthavingmethod>(node, util::Helpers::ToStringView(Allocator(), idx));
13303af6ab5fSopenharmony_ci}
13313af6ab5fSopenharmony_ci
13323af6ab5fSopenharmony_civoid PandaGen::SetObjectWithProto(const ir::AstNode *node, VReg proto, VReg obj)
13333af6ab5fSopenharmony_ci{
13343af6ab5fSopenharmony_ci    Ra().Emit<EcmaSetobjectwithproto>(node, proto, obj);
13353af6ab5fSopenharmony_ci}
13363af6ab5fSopenharmony_ci
13373af6ab5fSopenharmony_civoid PandaGen::CopyDataProperties(const ir::AstNode *node, VReg dst, VReg src)
13383af6ab5fSopenharmony_ci{
13393af6ab5fSopenharmony_ci    Ra().Emit<EcmaCopydataproperties>(node, dst, src);
13403af6ab5fSopenharmony_ci}
13413af6ab5fSopenharmony_ci
13423af6ab5fSopenharmony_civoid PandaGen::DefineGetterSetterByValue(const ir::AstNode *node, std::tuple<VReg, VReg, VReg, VReg> registers,
13433af6ab5fSopenharmony_ci                                         bool setName)
13443af6ab5fSopenharmony_ci{
13453af6ab5fSopenharmony_ci    const auto [obj, name, getter, setter] = registers;
13463af6ab5fSopenharmony_ci    LoadConst(node, setName ? Constant::JS_TRUE : Constant::JS_FALSE);
13473af6ab5fSopenharmony_ci    Ra().Emit<EcmaDefinegettersetterbyvalue>(node, obj, name, getter, setter);
13483af6ab5fSopenharmony_ci}
13493af6ab5fSopenharmony_ci
13503af6ab5fSopenharmony_civoid PandaGen::CreateEmptyArray(const ir::AstNode *node)
13513af6ab5fSopenharmony_ci{
13523af6ab5fSopenharmony_ci    Sa().Emit<EcmaCreateemptyarray>(node);
13533af6ab5fSopenharmony_ci}
13543af6ab5fSopenharmony_ci
13553af6ab5fSopenharmony_civoid PandaGen::CreateArrayWithBuffer(const ir::AstNode *node, uint32_t idx)
13563af6ab5fSopenharmony_ci{
13573af6ab5fSopenharmony_ci    ASSERT(util::Helpers::IsInteger<uint32_t>(idx));
13583af6ab5fSopenharmony_ci    Sa().Emit<EcmaCreatearraywithbuffer>(node, util::Helpers::ToStringView(Allocator(), idx));
13593af6ab5fSopenharmony_ci}
13603af6ab5fSopenharmony_ci
13613af6ab5fSopenharmony_cisize_t PandaGen::HandleArrayLiterals(const ir::AstNode *node, const ArenaVector<ir::Expression *> &elements)
13623af6ab5fSopenharmony_ci{
13633af6ab5fSopenharmony_ci    LiteralBuffer buf {};
13643af6ab5fSopenharmony_ci
13653af6ab5fSopenharmony_ci    size_t i = 0;
13663af6ab5fSopenharmony_ci    // This loop handles constant literal data by collecting it into a literal buffer
13673af6ab5fSopenharmony_ci    // until a non-constant element is encountered.
13683af6ab5fSopenharmony_ci    while (i < elements.size()) {
13693af6ab5fSopenharmony_ci        Literal lit = util::Helpers::ToConstantLiteral(elements[i]);
13703af6ab5fSopenharmony_ci        if (lit.IsInvalid()) {
13713af6ab5fSopenharmony_ci            break;
13723af6ab5fSopenharmony_ci        }
13733af6ab5fSopenharmony_ci
13743af6ab5fSopenharmony_ci        buf.emplace_back(std::move(lit));
13753af6ab5fSopenharmony_ci        i++;
13763af6ab5fSopenharmony_ci    }
13773af6ab5fSopenharmony_ci
13783af6ab5fSopenharmony_ci    if (buf.empty()) {
13793af6ab5fSopenharmony_ci        CreateEmptyArray(node);
13803af6ab5fSopenharmony_ci    } else {
13813af6ab5fSopenharmony_ci        uint32_t bufIdx = AddLiteralBuffer(std::move(buf));
13823af6ab5fSopenharmony_ci        CreateArrayWithBuffer(node, bufIdx);
13833af6ab5fSopenharmony_ci    }
13843af6ab5fSopenharmony_ci    return i;
13853af6ab5fSopenharmony_ci}
13863af6ab5fSopenharmony_ci
13873af6ab5fSopenharmony_civoid PandaGen::HandleArraySpread(const ir::AstNode *node, const ArenaVector<ir::Expression *> &elements, VReg obj)
13883af6ab5fSopenharmony_ci{
13893af6ab5fSopenharmony_ci    size_t i = 0;
13903af6ab5fSopenharmony_ci    bool hasSpread = false;
13913af6ab5fSopenharmony_ci
13923af6ab5fSopenharmony_ci    // This loop handles array elements until a spread element is encountered
13933af6ab5fSopenharmony_ci    for (; i < elements.size(); i++) {
13943af6ab5fSopenharmony_ci        const ir::Expression *elem = elements[i];
13953af6ab5fSopenharmony_ci
13963af6ab5fSopenharmony_ci        if (elem->IsOmittedExpression()) {
13973af6ab5fSopenharmony_ci            continue;
13983af6ab5fSopenharmony_ci        }
13993af6ab5fSopenharmony_ci
14003af6ab5fSopenharmony_ci        if (elem->IsSpreadElement()) {
14013af6ab5fSopenharmony_ci            // The next loop will handle arrays that have a spread element
14023af6ab5fSopenharmony_ci            hasSpread = true;
14033af6ab5fSopenharmony_ci            break;
14043af6ab5fSopenharmony_ci        }
14053af6ab5fSopenharmony_ci
14063af6ab5fSopenharmony_ci        elem->Compile(this);
14073af6ab5fSopenharmony_ci        StOwnByIndex(elem, obj, i);
14083af6ab5fSopenharmony_ci    }
14093af6ab5fSopenharmony_ci
14103af6ab5fSopenharmony_ci    RegScope rs(this);
14113af6ab5fSopenharmony_ci    VReg idxReg {};
14123af6ab5fSopenharmony_ci
14133af6ab5fSopenharmony_ci    if (hasSpread) {
14143af6ab5fSopenharmony_ci        idxReg = AllocReg();
14153af6ab5fSopenharmony_ci        LoadAccumulatorInt(node, i);
14163af6ab5fSopenharmony_ci        StoreAccumulator(node, idxReg);
14173af6ab5fSopenharmony_ci    }
14183af6ab5fSopenharmony_ci
14193af6ab5fSopenharmony_ci    // This loop handles arrays that contain spread elements
14203af6ab5fSopenharmony_ci    for (; i < elements.size(); i++) {
14213af6ab5fSopenharmony_ci        const ir::Expression *elem = elements[i];
14223af6ab5fSopenharmony_ci
14233af6ab5fSopenharmony_ci        if (elem->IsSpreadElement()) {
14243af6ab5fSopenharmony_ci            elem->AsSpreadElement()->Argument()->Compile(this);
14253af6ab5fSopenharmony_ci
14263af6ab5fSopenharmony_ci            StoreArraySpread(elem, obj, idxReg);
14273af6ab5fSopenharmony_ci            StoreAccumulator(elem, idxReg);
14283af6ab5fSopenharmony_ci            continue;
14293af6ab5fSopenharmony_ci        }
14303af6ab5fSopenharmony_ci
14313af6ab5fSopenharmony_ci        if (!elem->IsOmittedExpression()) {
14323af6ab5fSopenharmony_ci            elem->Compile(this);
14333af6ab5fSopenharmony_ci            StOwnByValue(elem, obj, idxReg);
14343af6ab5fSopenharmony_ci        }
14353af6ab5fSopenharmony_ci
14363af6ab5fSopenharmony_ci        Unary(elem, lexer::TokenType::PUNCTUATOR_PLUS_PLUS, idxReg);
14373af6ab5fSopenharmony_ci        StoreAccumulator(elem, idxReg);
14383af6ab5fSopenharmony_ci    }
14393af6ab5fSopenharmony_ci
14403af6ab5fSopenharmony_ci    // If the last element is omitted, we also have to update the length property
14413af6ab5fSopenharmony_ci    if (elements.back()->IsOmittedExpression()) {
14423af6ab5fSopenharmony_ci        // if there was a spread value then acc already contains the length
14433af6ab5fSopenharmony_ci        if (!hasSpread) {
14443af6ab5fSopenharmony_ci            LoadAccumulatorInt(node, i);
14453af6ab5fSopenharmony_ci        }
14463af6ab5fSopenharmony_ci
14473af6ab5fSopenharmony_ci        StOwnByName(node, obj, "length");
14483af6ab5fSopenharmony_ci    }
14493af6ab5fSopenharmony_ci}
14503af6ab5fSopenharmony_ci
14513af6ab5fSopenharmony_civoid PandaGen::CreateArray(const ir::AstNode *node, const ArenaVector<ir::Expression *> &elements, VReg obj)
14523af6ab5fSopenharmony_ci{
14533af6ab5fSopenharmony_ci    if (elements.empty()) {
14543af6ab5fSopenharmony_ci        CreateEmptyArray(node);
14553af6ab5fSopenharmony_ci        StoreAccumulator(node, obj);
14563af6ab5fSopenharmony_ci        return;
14573af6ab5fSopenharmony_ci    }
14583af6ab5fSopenharmony_ci
14593af6ab5fSopenharmony_ci    const auto i = HandleArrayLiterals(node, elements);
14603af6ab5fSopenharmony_ci
14613af6ab5fSopenharmony_ci    StoreAccumulator(node, obj);
14623af6ab5fSopenharmony_ci
14633af6ab5fSopenharmony_ci    if (i == elements.size()) {
14643af6ab5fSopenharmony_ci        return;
14653af6ab5fSopenharmony_ci    }
14663af6ab5fSopenharmony_ci
14673af6ab5fSopenharmony_ci    HandleArraySpread(node, elements, obj);
14683af6ab5fSopenharmony_ci
14693af6ab5fSopenharmony_ci    LoadAccumulator(node, obj);
14703af6ab5fSopenharmony_ci}
14713af6ab5fSopenharmony_ci
14723af6ab5fSopenharmony_civoid PandaGen::StoreArraySpread(const ir::AstNode *node, VReg array, VReg index)
14733af6ab5fSopenharmony_ci{
14743af6ab5fSopenharmony_ci    Ra().Emit<EcmaStarrayspread>(node, array, index);
14753af6ab5fSopenharmony_ci}
14763af6ab5fSopenharmony_ci
14773af6ab5fSopenharmony_civoid PandaGen::CreateRegExpWithLiteral(const ir::AstNode *node, const util::StringView &pattern, uint8_t flags)
14783af6ab5fSopenharmony_ci{
14793af6ab5fSopenharmony_ci    Sa().Emit<EcmaCreateregexpwithliteral>(node, pattern, flags);
14803af6ab5fSopenharmony_ci}
14813af6ab5fSopenharmony_ci
14823af6ab5fSopenharmony_civoid PandaGen::ThrowIfNotObject(const ir::AstNode *node)
14833af6ab5fSopenharmony_ci{
14843af6ab5fSopenharmony_ci    Ra().Emit<EcmaThrowifnotobject>(node);
14853af6ab5fSopenharmony_ci}
14863af6ab5fSopenharmony_ci
14873af6ab5fSopenharmony_civoid PandaGen::ThrowThrowNotExist(const ir::AstNode *node)
14883af6ab5fSopenharmony_ci{
14893af6ab5fSopenharmony_ci    Sa().Emit<EcmaThrowthrownotexists>(node);
14903af6ab5fSopenharmony_ci}
14913af6ab5fSopenharmony_ci
14923af6ab5fSopenharmony_civoid PandaGen::GetIterator(const ir::AstNode *node)
14933af6ab5fSopenharmony_ci{
14943af6ab5fSopenharmony_ci    Sa().Emit<EcmaGetiterator>(node);
14953af6ab5fSopenharmony_ci}
14963af6ab5fSopenharmony_ci
14973af6ab5fSopenharmony_civoid PandaGen::GetAsyncIterator(const ir::AstNode *node)
14983af6ab5fSopenharmony_ci{
14993af6ab5fSopenharmony_ci    Sa().Emit<EcmaGetasynciterator>(node);
15003af6ab5fSopenharmony_ci}
15013af6ab5fSopenharmony_ci
15023af6ab5fSopenharmony_civoid PandaGen::CreateObjectWithExcludedKeys(const ir::AstNode *node, VReg obj, VReg argStart, size_t argCount)
15033af6ab5fSopenharmony_ci{
15043af6ab5fSopenharmony_ci    ASSERT(argStart.GetIndex() == obj.GetIndex() - 1);
15053af6ab5fSopenharmony_ci    if (argCount == 0) {  // Do not emit undefined register
15063af6ab5fSopenharmony_ci        argStart = obj;
15073af6ab5fSopenharmony_ci    }
15083af6ab5fSopenharmony_ci
15093af6ab5fSopenharmony_ci    Rra().Emit<EcmaCreateobjectwithexcludedkeys>(node, argStart, argCount, static_cast<int64_t>(argCount), obj,
15103af6ab5fSopenharmony_ci                                                 argStart);
15113af6ab5fSopenharmony_ci}
15123af6ab5fSopenharmony_ci
15133af6ab5fSopenharmony_civoid PandaGen::ThrowObjectNonCoercible(const ir::AstNode *node)
15143af6ab5fSopenharmony_ci{
15153af6ab5fSopenharmony_ci    Sa().Emit<EcmaThrowpatternnoncoercible>(node);
15163af6ab5fSopenharmony_ci}
15173af6ab5fSopenharmony_ci
15183af6ab5fSopenharmony_civoid PandaGen::CloseIterator(const ir::AstNode *node, VReg iter)
15193af6ab5fSopenharmony_ci{
15203af6ab5fSopenharmony_ci    Ra().Emit<EcmaCloseiterator>(node, iter);
15213af6ab5fSopenharmony_ci}
15223af6ab5fSopenharmony_ci
15233af6ab5fSopenharmony_civoid PandaGen::ImportModule(const ir::AstNode *node, const util::StringView &name)
15243af6ab5fSopenharmony_ci{
15253af6ab5fSopenharmony_ci    Sa().Emit<EcmaImportmodule>(node, name);
15263af6ab5fSopenharmony_ci}
15273af6ab5fSopenharmony_ci
15283af6ab5fSopenharmony_civoid PandaGen::SetClassComputedFields(const ir::AstNode *node, VReg classReg, VReg computedInstanceFieldArray)
15293af6ab5fSopenharmony_ci{
15303af6ab5fSopenharmony_ci    Ra().Emit<EcmaSetclasscomputedfields>(node, classReg, computedInstanceFieldArray);
15313af6ab5fSopenharmony_ci}
15323af6ab5fSopenharmony_ci
15333af6ab5fSopenharmony_civoid PandaGen::DefineClassWithBuffer(const ir::AstNode *node, const util::StringView &ctorId, uint32_t litIdx,
15343af6ab5fSopenharmony_ci                                     VReg lexenv, VReg base)
15353af6ab5fSopenharmony_ci{
15363af6ab5fSopenharmony_ci    Ra().Emit<EcmaDefineclasswithbuffer>(node, ctorId, litIdx, lexenv, base);
15373af6ab5fSopenharmony_ci}
15383af6ab5fSopenharmony_ci
15393af6ab5fSopenharmony_civoid PandaGen::LoadClassComputedInstanceFields(const ir::AstNode *node, VReg ctor)
15403af6ab5fSopenharmony_ci{
15413af6ab5fSopenharmony_ci    Sa().Emit<EcmaLoadclasscomputedinstancefields>(node, ctor);
15423af6ab5fSopenharmony_ci}
15433af6ab5fSopenharmony_ci
15443af6ab5fSopenharmony_civoid PandaGen::DefineClassPrivateFields(const ir::AstNode *node, uint32_t privateBufIdx)
15453af6ab5fSopenharmony_ci{
15463af6ab5fSopenharmony_ci    Sa().Emit<EcmaDefineclassprivatefields>(node, util::Helpers::ToStringView(Allocator(), privateBufIdx), LexEnv());
15473af6ab5fSopenharmony_ci}
15483af6ab5fSopenharmony_ci
15493af6ab5fSopenharmony_civoid PandaGen::ClassFieldAdd(const ir::AstNode *node, VReg obj, VReg prop)
15503af6ab5fSopenharmony_ci{
15513af6ab5fSopenharmony_ci    Ra().Emit<EcmaClassfieldadd>(node, obj, prop);
15523af6ab5fSopenharmony_ci}
15533af6ab5fSopenharmony_ci
15543af6ab5fSopenharmony_civoid PandaGen::ClassPrivateFieldAdd(const ir::AstNode *node, VReg ctor, VReg obj, const util::StringView &prop)
15553af6ab5fSopenharmony_ci{
15563af6ab5fSopenharmony_ci    Ra().Emit<EcmaClassprivatefieldadd>(node, prop, ctor, obj);
15573af6ab5fSopenharmony_ci}
15583af6ab5fSopenharmony_ci
15593af6ab5fSopenharmony_civoid PandaGen::ClassPrivateMethodOrAccessorAdd(const ir::AstNode *node, VReg ctor, VReg obj)
15603af6ab5fSopenharmony_ci{
15613af6ab5fSopenharmony_ci    Ra().Emit<EcmaClassprivatemethodoraccessoradd>(node, ctor, obj);
15623af6ab5fSopenharmony_ci}
15633af6ab5fSopenharmony_ci
15643af6ab5fSopenharmony_civoid PandaGen::ClassPrivateFieldGet(const ir::AstNode *node, VReg ctor, VReg obj, const util::StringView &prop)
15653af6ab5fSopenharmony_ci{
15663af6ab5fSopenharmony_ci    Ra().Emit<EcmaClassprivatefieldget>(node, prop, ctor, obj);
15673af6ab5fSopenharmony_ci}
15683af6ab5fSopenharmony_ci
15693af6ab5fSopenharmony_civoid PandaGen::ClassPrivateFieldSet(const ir::AstNode *node, VReg ctor, VReg obj, const util::StringView &prop)
15703af6ab5fSopenharmony_ci{
15713af6ab5fSopenharmony_ci    Ra().Emit<EcmaClassprivatefieldset>(node, prop, ctor, obj);
15723af6ab5fSopenharmony_ci}
15733af6ab5fSopenharmony_ci
15743af6ab5fSopenharmony_civoid PandaGen::ClassPrivateFieldIn(const ir::AstNode *node, VReg ctor, const util::StringView &prop)
15753af6ab5fSopenharmony_ci{
15763af6ab5fSopenharmony_ci    Ra().Emit<EcmaClassprivatefieldin>(node, prop, ctor);
15773af6ab5fSopenharmony_ci}
15783af6ab5fSopenharmony_ci
15793af6ab5fSopenharmony_civoid PandaGen::LoadModuleVariable(const ir::AstNode *node, VReg module, const util::StringView &name)
15803af6ab5fSopenharmony_ci{
15813af6ab5fSopenharmony_ci    Ra().Emit<EcmaLdmodvarbyname>(node, name, module);
15823af6ab5fSopenharmony_ci}
15833af6ab5fSopenharmony_ci
15843af6ab5fSopenharmony_civoid PandaGen::StoreModuleVar(const ir::AstNode *node, const util::StringView &name)
15853af6ab5fSopenharmony_ci{
15863af6ab5fSopenharmony_ci    Sa().Emit<EcmaStmodulevar>(node, name);
15873af6ab5fSopenharmony_ci}
15883af6ab5fSopenharmony_ci
15893af6ab5fSopenharmony_civoid PandaGen::CopyModule(const ir::AstNode *node, VReg module)
15903af6ab5fSopenharmony_ci{
15913af6ab5fSopenharmony_ci    Ra().Emit<EcmaCopymodule>(node, module);
15923af6ab5fSopenharmony_ci}
15933af6ab5fSopenharmony_ci
15943af6ab5fSopenharmony_civoid PandaGen::StSuperByName(const ir::AstNode *node, VReg obj, const util::StringView &key)
15953af6ab5fSopenharmony_ci{
15963af6ab5fSopenharmony_ci    Ra().Emit<EcmaStsuperbyname>(node, key, obj);
15973af6ab5fSopenharmony_ci}
15983af6ab5fSopenharmony_ci
15993af6ab5fSopenharmony_civoid PandaGen::LdSuperByName(const ir::AstNode *node, const util::StringView &key)
16003af6ab5fSopenharmony_ci{
16013af6ab5fSopenharmony_ci    Ra().Emit<EcmaLdsuperbyname>(node, key);
16023af6ab5fSopenharmony_ci}
16033af6ab5fSopenharmony_ci
16043af6ab5fSopenharmony_civoid PandaGen::StSuperByValue(const ir::AstNode *node, VReg obj, VReg prop)
16053af6ab5fSopenharmony_ci{
16063af6ab5fSopenharmony_ci    Ra().Emit<EcmaStsuperbyvalue>(node, obj, prop);
16073af6ab5fSopenharmony_ci}
16083af6ab5fSopenharmony_ci
16093af6ab5fSopenharmony_civoid PandaGen::LdSuperByValue(const ir::AstNode *node, VReg obj)
16103af6ab5fSopenharmony_ci{
16113af6ab5fSopenharmony_ci    Ra().Emit<EcmaLdsuperbyvalue>(node, obj);
16123af6ab5fSopenharmony_ci}
16133af6ab5fSopenharmony_ci
16143af6ab5fSopenharmony_civoid PandaGen::StoreSuperProperty(const ir::AstNode *node, VReg obj, const Operand &prop)
16153af6ab5fSopenharmony_ci{
16163af6ab5fSopenharmony_ci    if (std::holds_alternative<util::StringView>(prop)) {
16173af6ab5fSopenharmony_ci        StSuperByName(node, obj, std::get<util::StringView>(prop));
16183af6ab5fSopenharmony_ci        return;
16193af6ab5fSopenharmony_ci    }
16203af6ab5fSopenharmony_ci
16213af6ab5fSopenharmony_ci    ASSERT(std::holds_alternative<VReg>(prop));
16223af6ab5fSopenharmony_ci    StSuperByValue(node, obj, std::get<VReg>(prop));
16233af6ab5fSopenharmony_ci}
16243af6ab5fSopenharmony_ci
16253af6ab5fSopenharmony_civoid PandaGen::LoadSuperProperty(const ir::AstNode *node, const Operand &prop)
16263af6ab5fSopenharmony_ci{
16273af6ab5fSopenharmony_ci    if (std::holds_alternative<util::StringView>(prop)) {
16283af6ab5fSopenharmony_ci        LdSuperByName(node, std::get<util::StringView>(prop));
16293af6ab5fSopenharmony_ci        return;
16303af6ab5fSopenharmony_ci    }
16313af6ab5fSopenharmony_ci
16323af6ab5fSopenharmony_ci    ASSERT(std::holds_alternative<VReg>(prop));
16333af6ab5fSopenharmony_ci    LdSuperByValue(node, std::get<VReg>(prop));
16343af6ab5fSopenharmony_ci}
16353af6ab5fSopenharmony_ci
16363af6ab5fSopenharmony_civoid PandaGen::LoadLexicalVar(const ir::AstNode *node, uint32_t level, uint32_t slot)
16373af6ab5fSopenharmony_ci{
16383af6ab5fSopenharmony_ci    Sa().Emit<EcmaLdlexvardyn>(node, level, slot);
16393af6ab5fSopenharmony_ci}
16403af6ab5fSopenharmony_ci
16413af6ab5fSopenharmony_civoid PandaGen::LoadLexical(const ir::AstNode *node, const util::StringView &name, uint32_t level, uint32_t slot)
16423af6ab5fSopenharmony_ci{
16433af6ab5fSopenharmony_ci    Sa().Emit<EcmaLdlexdyn>(node, name, level, slot);
16443af6ab5fSopenharmony_ci}
16453af6ab5fSopenharmony_ci
16463af6ab5fSopenharmony_civoid PandaGen::StoreLexicalVar(const ir::AstNode *node, uint32_t level, uint32_t slot)
16473af6ab5fSopenharmony_ci{
16483af6ab5fSopenharmony_ci    Ra().Emit<EcmaStlexvardyn>(node, level, slot);
16493af6ab5fSopenharmony_ci}
16503af6ab5fSopenharmony_ci
16513af6ab5fSopenharmony_civoid PandaGen::StoreLexical(const ir::AstNode *node, const util::StringView &name, uint32_t level, uint32_t slot)
16523af6ab5fSopenharmony_ci{
16533af6ab5fSopenharmony_ci    Ra().Emit<EcmaStlexdyn>(node, name, level, slot);
16543af6ab5fSopenharmony_ci}
16553af6ab5fSopenharmony_ci
16563af6ab5fSopenharmony_civoid PandaGen::ThrowIfSuperNotCorrectCall(const ir::AstNode *node, int64_t num)
16573af6ab5fSopenharmony_ci{
16583af6ab5fSopenharmony_ci    Sa().Emit<EcmaThrowifsupernotcorrectcall>(node, num);
16593af6ab5fSopenharmony_ci}
16603af6ab5fSopenharmony_ci
16613af6ab5fSopenharmony_civoid PandaGen::ThrowTdz(const ir::AstNode *node, const util::StringView &name)
16623af6ab5fSopenharmony_ci{
16633af6ab5fSopenharmony_ci    Sa().Emit<EcmaThrowtdz>(node, name);
16643af6ab5fSopenharmony_ci}
16653af6ab5fSopenharmony_ci
16663af6ab5fSopenharmony_civoid PandaGen::ThrowConstAssignment(const ir::AstNode *node, const util::StringView &name)
16673af6ab5fSopenharmony_ci{
16683af6ab5fSopenharmony_ci    Ra().Emit<EcmaThrowconstassignment>(node, name);
16693af6ab5fSopenharmony_ci}
16703af6ab5fSopenharmony_ci
16713af6ab5fSopenharmony_civoid PandaGen::PopLexEnv(const ir::AstNode *node)
16723af6ab5fSopenharmony_ci{
16733af6ab5fSopenharmony_ci    Sa().Emit<EcmaPoplexenvdyn>(node);
16743af6ab5fSopenharmony_ci}
16753af6ab5fSopenharmony_ci
16763af6ab5fSopenharmony_civoid PandaGen::CopyLexEnv(const ir::AstNode *node)
16773af6ab5fSopenharmony_ci{
16783af6ab5fSopenharmony_ci    Sa().Emit<EcmaCopylexenvdyn>(node);
16793af6ab5fSopenharmony_ci}
16803af6ab5fSopenharmony_ci
16813af6ab5fSopenharmony_civoid PandaGen::NewLexEnv(const ir::AstNode *node, uint32_t num)
16823af6ab5fSopenharmony_ci{
16833af6ab5fSopenharmony_ci    Sa().Emit<EcmaNewlexenvdyn>(node, num);
16843af6ab5fSopenharmony_ci}
16853af6ab5fSopenharmony_ci
16863af6ab5fSopenharmony_civoid PandaGen::LdLexEnv(const ir::AstNode *node)
16873af6ab5fSopenharmony_ci{
16883af6ab5fSopenharmony_ci    Sa().Emit<EcmaLdlexenvdyn>(node);
16893af6ab5fSopenharmony_ci}
16903af6ab5fSopenharmony_ci
16913af6ab5fSopenharmony_ciOperand PandaGen::ToNamedPropertyKey(const ir::Expression *prop, bool isComputed)
16923af6ab5fSopenharmony_ci{
16933af6ab5fSopenharmony_ci    VReg res {VReg::REG_START};
16943af6ab5fSopenharmony_ci
16953af6ab5fSopenharmony_ci    if (!isComputed) {
16963af6ab5fSopenharmony_ci        if (prop->IsIdentifier()) {
16973af6ab5fSopenharmony_ci            return prop->AsIdentifier()->Name();
16983af6ab5fSopenharmony_ci        }
16993af6ab5fSopenharmony_ci        return res;
17003af6ab5fSopenharmony_ci    }
17013af6ab5fSopenharmony_ci
17023af6ab5fSopenharmony_ci    if (prop->IsStringLiteral()) {
17033af6ab5fSopenharmony_ci        const util::StringView &str = prop->AsStringLiteral()->Str();
17043af6ab5fSopenharmony_ci
17053af6ab5fSopenharmony_ci        /* NOTE: dbatyai. remove this when runtime handles __proto__ as property name correctly */
17063af6ab5fSopenharmony_ci        if (str.Is("__proto__")) {
17073af6ab5fSopenharmony_ci            return res;
17083af6ab5fSopenharmony_ci        }
17093af6ab5fSopenharmony_ci
17103af6ab5fSopenharmony_ci        int64_t index = util::Helpers::GetIndex(str);
17113af6ab5fSopenharmony_ci        if (index != util::Helpers::INVALID_INDEX) {
17123af6ab5fSopenharmony_ci            return index;
17133af6ab5fSopenharmony_ci        }
17143af6ab5fSopenharmony_ci
17153af6ab5fSopenharmony_ci        return str;
17163af6ab5fSopenharmony_ci    }
17173af6ab5fSopenharmony_ci
17183af6ab5fSopenharmony_ci    if (prop->IsNumberLiteral()) {
17193af6ab5fSopenharmony_ci        auto num = prop->AsNumberLiteral()->Number().GetDouble();
17203af6ab5fSopenharmony_ci        if (util::Helpers::IsIndex(num)) {
17213af6ab5fSopenharmony_ci            return static_cast<int64_t>(num);
17223af6ab5fSopenharmony_ci        }
17233af6ab5fSopenharmony_ci
17243af6ab5fSopenharmony_ci        return prop->AsNumberLiteral()->Str();
17253af6ab5fSopenharmony_ci    }
17263af6ab5fSopenharmony_ci
17273af6ab5fSopenharmony_ci    return res;
17283af6ab5fSopenharmony_ci}
17293af6ab5fSopenharmony_ci
17303af6ab5fSopenharmony_ciOperand PandaGen::ToPropertyKey(const ir::Expression *prop, bool isComputed, bool isSuperExpression)
17313af6ab5fSopenharmony_ci{
17323af6ab5fSopenharmony_ci    Operand op = ToNamedPropertyKey(prop, isComputed);
17333af6ab5fSopenharmony_ci    if (std::holds_alternative<util::StringView>(op)) {
17343af6ab5fSopenharmony_ci        return op;
17353af6ab5fSopenharmony_ci    }
17363af6ab5fSopenharmony_ci
17373af6ab5fSopenharmony_ci    if (std::holds_alternative<int64_t>(op) && !isSuperExpression) {
17383af6ab5fSopenharmony_ci        return op;
17393af6ab5fSopenharmony_ci    }
17403af6ab5fSopenharmony_ci
17413af6ab5fSopenharmony_ci    VReg objReg = AllocReg();
17423af6ab5fSopenharmony_ci    StoreAccumulator(prop, objReg);
17433af6ab5fSopenharmony_ci    prop->Compile(this);
17443af6ab5fSopenharmony_ci
17453af6ab5fSopenharmony_ci    return objReg;
17463af6ab5fSopenharmony_ci}
17473af6ab5fSopenharmony_ci
17483af6ab5fSopenharmony_ciOperand PandaGen::ToOwnPropertyKey(const ir::Expression *prop, bool isComputed)
17493af6ab5fSopenharmony_ci{
17503af6ab5fSopenharmony_ci    Operand op = ToNamedPropertyKey(prop, isComputed);
17513af6ab5fSopenharmony_ci    if (std::holds_alternative<util::StringView>(op)) {
17523af6ab5fSopenharmony_ci        ASSERT(std::holds_alternative<util::StringView>(op) || std::holds_alternative<int64_t>(op));
17533af6ab5fSopenharmony_ci        return op;
17543af6ab5fSopenharmony_ci    }
17553af6ab5fSopenharmony_ci
17563af6ab5fSopenharmony_ci    if (std::holds_alternative<int64_t>(op)) {
17573af6ab5fSopenharmony_ci        return op;
17583af6ab5fSopenharmony_ci    }
17593af6ab5fSopenharmony_ci
17603af6ab5fSopenharmony_ci    VReg propReg = AllocReg();
17613af6ab5fSopenharmony_ci    prop->Compile(this);
17623af6ab5fSopenharmony_ci    StoreAccumulator(prop, propReg);
17633af6ab5fSopenharmony_ci
17643af6ab5fSopenharmony_ci    return propReg;
17653af6ab5fSopenharmony_ci}
17663af6ab5fSopenharmony_ci
17673af6ab5fSopenharmony_civoid PandaGen::LoadPropertyKeyAcc(const ir::Expression *prop, bool isComputed)
17683af6ab5fSopenharmony_ci{
17693af6ab5fSopenharmony_ci    Operand op = ToNamedPropertyKey(prop, isComputed);
17703af6ab5fSopenharmony_ci    if (std::holds_alternative<util::StringView>(op)) {
17713af6ab5fSopenharmony_ci        LoadAccumulatorString(prop, std::get<util::StringView>(op));
17723af6ab5fSopenharmony_ci    } else if (std::holds_alternative<int64_t>(op)) {
17733af6ab5fSopenharmony_ci        LoadAccumulatorInt(prop, static_cast<size_t>(std::get<int64_t>(op)));
17743af6ab5fSopenharmony_ci    } else {
17753af6ab5fSopenharmony_ci        prop->Compile(this);
17763af6ab5fSopenharmony_ci    }
17773af6ab5fSopenharmony_ci}
17783af6ab5fSopenharmony_ci
17793af6ab5fSopenharmony_ciVReg PandaGen::LoadPropertyKey(const ir::Expression *prop, bool isComputed)
17803af6ab5fSopenharmony_ci{
17813af6ab5fSopenharmony_ci    LoadPropertyKeyAcc(prop, isComputed);
17823af6ab5fSopenharmony_ci
17833af6ab5fSopenharmony_ci    VReg propReg = AllocReg();
17843af6ab5fSopenharmony_ci    StoreAccumulator(prop, propReg);
17853af6ab5fSopenharmony_ci
17863af6ab5fSopenharmony_ci    return propReg;
17873af6ab5fSopenharmony_ci}
17883af6ab5fSopenharmony_ci
17893af6ab5fSopenharmony_civoid PandaGen::LoadEvalVariable(const ir::AstNode *node, const util::StringView &name)
17903af6ab5fSopenharmony_ci{
17913af6ab5fSopenharmony_ci    RegScope rs(this);
17923af6ab5fSopenharmony_ci    LoadLexicalContext(node);
17933af6ab5fSopenharmony_ci    Ra().Emit<EcmaLdevalvar>(node, name);
17943af6ab5fSopenharmony_ci}
17953af6ab5fSopenharmony_ci
17963af6ab5fSopenharmony_civoid PandaGen::StoreEvalVariable(const ir::AstNode *node, const util::StringView &name)
17973af6ab5fSopenharmony_ci{
17983af6ab5fSopenharmony_ci    RegScope rs(this);
17993af6ab5fSopenharmony_ci    VReg value = AllocReg();
18003af6ab5fSopenharmony_ci    StoreAccumulator(node, value);
18013af6ab5fSopenharmony_ci    LoadLexicalContext(node);
18023af6ab5fSopenharmony_ci    Ra().Emit<EcmaStevalvar>(node, name, value);
18033af6ab5fSopenharmony_ci}
18043af6ab5fSopenharmony_ci
18053af6ab5fSopenharmony_civoid PandaGen::DirectEval(const ir::AstNode *node, uint32_t parserStatus)
18063af6ab5fSopenharmony_ci{
18073af6ab5fSopenharmony_ci    RegScope rs(this);
18083af6ab5fSopenharmony_ci
18093af6ab5fSopenharmony_ci    uint32_t index = 0;
18103af6ab5fSopenharmony_ci    uint32_t evalBindingsIndex = 0;
18113af6ab5fSopenharmony_ci    VReg arg0 = AllocReg();
18123af6ab5fSopenharmony_ci    StoreAccumulator(node, arg0);
18133af6ab5fSopenharmony_ci    VReg bindings = AllocReg();
18143af6ab5fSopenharmony_ci    CreateEmptyArray(node);
18153af6ab5fSopenharmony_ci    StoreAccumulator(node, bindings);
18163af6ab5fSopenharmony_ci
18173af6ab5fSopenharmony_ci    GetFunctionObject(node);
18183af6ab5fSopenharmony_ci    StOwnByIndex(node, bindings, index++);
18193af6ab5fSopenharmony_ci    GetNewTarget(node);
18203af6ab5fSopenharmony_ci    StOwnByIndex(node, bindings, index++);
18213af6ab5fSopenharmony_ci    GetThis(node);
18223af6ab5fSopenharmony_ci    StOwnByIndex(node, bindings, index++);
18233af6ab5fSopenharmony_ci
18243af6ab5fSopenharmony_ci    VReg evalBindings = AllocReg();
18253af6ab5fSopenharmony_ci    CreateEmptyArray(node);
18263af6ab5fSopenharmony_ci    StoreAccumulator(node, evalBindings);
18273af6ab5fSopenharmony_ci
18283af6ab5fSopenharmony_ci    LoadAccumulator(node, LexEnv());
18293af6ab5fSopenharmony_ci    StOwnByIndex(node, evalBindings, evalBindingsIndex++);
18303af6ab5fSopenharmony_ci
18313af6ab5fSopenharmony_ci    const auto *iter = Scope()->EnclosingVariableScope();
18323af6ab5fSopenharmony_ci
18333af6ab5fSopenharmony_ci    while (true) {
18343af6ab5fSopenharmony_ci        uint32_t scopeBindingsBuf = iter->EvalBindings();
18353af6ab5fSopenharmony_ci        if (scopeBindingsBuf != INVALID_LITERAL_BUFFER_ID) {
18363af6ab5fSopenharmony_ci            Sa().Emit<EcmaLdevalbindings>(node, util::Helpers::ToStringView(Allocator(), scopeBindingsBuf));
18373af6ab5fSopenharmony_ci            StOwnByIndex(node, evalBindings, evalBindingsIndex++);
18383af6ab5fSopenharmony_ci        }
18393af6ab5fSopenharmony_ci
18403af6ab5fSopenharmony_ci        if (iter->Parent() == nullptr) {
18413af6ab5fSopenharmony_ci            break;
18423af6ab5fSopenharmony_ci        }
18433af6ab5fSopenharmony_ci
18443af6ab5fSopenharmony_ci        iter = iter->Parent()->EnclosingVariableScope();
18453af6ab5fSopenharmony_ci    }
18463af6ab5fSopenharmony_ci
18473af6ab5fSopenharmony_ci    LoadAccumulator(node, evalBindings);
18483af6ab5fSopenharmony_ci    StOwnByIndex(node, bindings, index++);
18493af6ab5fSopenharmony_ci
18503af6ab5fSopenharmony_ci    Sa().Emit<EcmaDirecteval>(node, static_cast<int64_t>(parserStatus), arg0, bindings);
18513af6ab5fSopenharmony_ci}
18523af6ab5fSopenharmony_ci
18533af6ab5fSopenharmony_civoid PandaGen::LoadLexicalContext(const ir::AstNode *node)
18543af6ab5fSopenharmony_ci{
18553af6ab5fSopenharmony_ci    auto result = Scope()->Find(varbinder::VarBinder::LEXICAL_CONTEXT_PARAM);
18563af6ab5fSopenharmony_ci    LoadLexicalVar(node, result.lexLevel, result.variable->AsLocalVariable()->LexIdx());
18573af6ab5fSopenharmony_ci}
18583af6ab5fSopenharmony_ci
18593af6ab5fSopenharmony_cibool PandaGen::IsDirectEval() const
18603af6ab5fSopenharmony_ci{
18613af6ab5fSopenharmony_ci    return Context()->config->options->CompilerOptions().isDirectEval;
18623af6ab5fSopenharmony_ci}
18633af6ab5fSopenharmony_ci
18643af6ab5fSopenharmony_cibool PandaGen::IsEval() const
18653af6ab5fSopenharmony_ci{
18663af6ab5fSopenharmony_ci    return Context()->config->options->CompilerOptions().isEval;
18673af6ab5fSopenharmony_ci}
18683af6ab5fSopenharmony_ci
18693af6ab5fSopenharmony_ciconst checker::Type *PandaGen::GetVRegType(VReg vreg) const
18703af6ab5fSopenharmony_ci{
18713af6ab5fSopenharmony_ci    // We assume that all used regs have any type
18723af6ab5fSopenharmony_ci    if (vreg.GetIndex() > NextReg().GetIndex()) {
18733af6ab5fSopenharmony_ci        return Context()->checker->GetGlobalTypesHolder()->GlobalAnyType();
18743af6ab5fSopenharmony_ci    }
18753af6ab5fSopenharmony_ci
18763af6ab5fSopenharmony_ci    return nullptr;
18773af6ab5fSopenharmony_ci}
18783af6ab5fSopenharmony_ci
18793af6ab5fSopenharmony_ci}  // namespace ark::es2panda::compiler
1880