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