14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#include "ecmascript/compiler/call_stub_builder.h" 174514f5e3Sopenharmony_ci 184514f5e3Sopenharmony_ci#include "ecmascript/compiler/assembler_module.h" 194514f5e3Sopenharmony_ci#include "ecmascript/compiler/stub_builder-inl.h" 204514f5e3Sopenharmony_ci 214514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu { 224514f5e3Sopenharmony_ci 234514f5e3Sopenharmony_civoid CallStubBuilder::JSCallDispatchForBaseline(Label *exit, Label *noNeedCheckException) 244514f5e3Sopenharmony_ci{ 254514f5e3Sopenharmony_ci this->isForBaseline_ = true; 264514f5e3Sopenharmony_ci auto env = GetEnvironment(); 274514f5e3Sopenharmony_ci baselineBuiltinFp_ = CallNGCRuntime(glue_, RTSTUB_ID(GetBaselineBuiltinFp), {glue_}); 284514f5e3Sopenharmony_ci 294514f5e3Sopenharmony_ci // 1. call initialize 304514f5e3Sopenharmony_ci Label funcIsHeapObject(env); 314514f5e3Sopenharmony_ci Label funcIsCallable(env); 324514f5e3Sopenharmony_ci Label funcNotCallable(env); 334514f5e3Sopenharmony_ci JSCallInit(exit, &funcIsHeapObject, &funcIsCallable, &funcNotCallable); 344514f5e3Sopenharmony_ci 354514f5e3Sopenharmony_ci // 2. dispatch 364514f5e3Sopenharmony_ci Label methodIsNative(env); 374514f5e3Sopenharmony_ci Label methodNotNative(env); 384514f5e3Sopenharmony_ci BRANCH(Int64NotEqual(Int64And(callField_, isNativeMask_), Int64(0)), &methodIsNative, &methodNotNative); 394514f5e3Sopenharmony_ci 404514f5e3Sopenharmony_ci // 3. call native 414514f5e3Sopenharmony_ci Bind(&methodIsNative); 424514f5e3Sopenharmony_ci { 434514f5e3Sopenharmony_ci JSCallNative(exit); 444514f5e3Sopenharmony_ci } 454514f5e3Sopenharmony_ci 464514f5e3Sopenharmony_ci // 4. call nonNative 474514f5e3Sopenharmony_ci Bind(&methodNotNative); 484514f5e3Sopenharmony_ci { 494514f5e3Sopenharmony_ci JSCallJSFunction(exit, noNeedCheckException); 504514f5e3Sopenharmony_ci } 514514f5e3Sopenharmony_ci} 524514f5e3Sopenharmony_ci 534514f5e3Sopenharmony_ciGateRef CallStubBuilder::JSCallDispatch() 544514f5e3Sopenharmony_ci{ 554514f5e3Sopenharmony_ci this->isForBaseline_ = false; 564514f5e3Sopenharmony_ci auto env = GetEnvironment(); 574514f5e3Sopenharmony_ci Label entryPass(env); 584514f5e3Sopenharmony_ci Label exit(env); 594514f5e3Sopenharmony_ci env->SubCfgEntry(&entryPass); 604514f5e3Sopenharmony_ci DEFVARIABLE(result, VariableType::JS_ANY(), Exception()); 614514f5e3Sopenharmony_ci 624514f5e3Sopenharmony_ci this->result_ = &result; 634514f5e3Sopenharmony_ci 644514f5e3Sopenharmony_ci // 1. call initialize 654514f5e3Sopenharmony_ci Label funcIsHeapObject(env); 664514f5e3Sopenharmony_ci Label funcIsCallable(env); 674514f5e3Sopenharmony_ci Label funcNotCallable(env); 684514f5e3Sopenharmony_ci JSCallInit(&exit, &funcIsHeapObject, &funcIsCallable, &funcNotCallable); 694514f5e3Sopenharmony_ci 704514f5e3Sopenharmony_ci // 2. dispatch 714514f5e3Sopenharmony_ci Label methodIsNative(env); 724514f5e3Sopenharmony_ci Label methodNotNative(env); 734514f5e3Sopenharmony_ci BRANCH(Int64NotEqual(Int64And(callField_, isNativeMask_), Int64(0)), &methodIsNative, &methodNotNative); 744514f5e3Sopenharmony_ci 754514f5e3Sopenharmony_ci // 3. call native 764514f5e3Sopenharmony_ci Bind(&methodIsNative); 774514f5e3Sopenharmony_ci { 784514f5e3Sopenharmony_ci JSCallNative(&exit); 794514f5e3Sopenharmony_ci } 804514f5e3Sopenharmony_ci // 4. call nonNative 814514f5e3Sopenharmony_ci Bind(&methodNotNative); 824514f5e3Sopenharmony_ci { 834514f5e3Sopenharmony_ci JSCallJSFunction(&exit); 844514f5e3Sopenharmony_ci } 854514f5e3Sopenharmony_ci 864514f5e3Sopenharmony_ci Bind(&exit); 874514f5e3Sopenharmony_ci auto ret = *result; 884514f5e3Sopenharmony_ci env->SubCfgExit(); 894514f5e3Sopenharmony_ci return ret; 904514f5e3Sopenharmony_ci} 914514f5e3Sopenharmony_ci 924514f5e3Sopenharmony_civoid CallStubBuilder::JSCallInit(Label *exit, Label *funcIsHeapObject, Label *funcIsCallable, Label *funcNotCallable) 934514f5e3Sopenharmony_ci{ 944514f5e3Sopenharmony_ci if (!isForBaseline_) { 954514f5e3Sopenharmony_ci // save pc 964514f5e3Sopenharmony_ci SavePcIfNeeded(glue_); 974514f5e3Sopenharmony_ci } 984514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_FUNCTION_CALL_TIMER 994514f5e3Sopenharmony_ci CallNGCRuntime(glue_, RTSTUB_ID(StartCallTimer, { glue_, func_, False()})); 1004514f5e3Sopenharmony_ci#endif 1014514f5e3Sopenharmony_ci if (checkIsCallable_) { 1024514f5e3Sopenharmony_ci BRANCH(TaggedIsHeapObject(func_), funcIsHeapObject, funcNotCallable); 1034514f5e3Sopenharmony_ci Bind(funcIsHeapObject); 1044514f5e3Sopenharmony_ci GateRef hclass = LoadHClass(func_); 1054514f5e3Sopenharmony_ci bitfield_ = Load(VariableType::INT32(), hclass, IntPtr(JSHClass::BIT_FIELD_OFFSET)); 1064514f5e3Sopenharmony_ci BRANCH(IsCallableFromBitField(bitfield_), funcIsCallable, funcNotCallable); 1074514f5e3Sopenharmony_ci Bind(funcNotCallable); 1084514f5e3Sopenharmony_ci { 1094514f5e3Sopenharmony_ci CallRuntime(glue_, RTSTUB_ID(ThrowNotCallableException), {}); 1104514f5e3Sopenharmony_ci Jump(exit); 1114514f5e3Sopenharmony_ci } 1124514f5e3Sopenharmony_ci Bind(funcIsCallable); 1134514f5e3Sopenharmony_ci } else { 1144514f5e3Sopenharmony_ci GateRef hclass = LoadHClass(func_); 1154514f5e3Sopenharmony_ci bitfield_ = Load(VariableType::INT32(), hclass, IntPtr(JSHClass::BIT_FIELD_OFFSET)); 1164514f5e3Sopenharmony_ci } 1174514f5e3Sopenharmony_ci method_ = GetMethodFromJSFunctionOrProxy(func_); 1184514f5e3Sopenharmony_ci callField_ = GetCallFieldFromMethod(method_); 1194514f5e3Sopenharmony_ci isNativeMask_ = Int64(static_cast<uint64_t>(1) << MethodLiteral::IsNativeBit::START_BIT); 1204514f5e3Sopenharmony_ci} 1214514f5e3Sopenharmony_ci 1224514f5e3Sopenharmony_civoid CallStubBuilder::JSCallNative(Label *exit) 1234514f5e3Sopenharmony_ci{ 1244514f5e3Sopenharmony_ci HandleProfileNativeCall(); 1254514f5e3Sopenharmony_ci GateRef ret; 1264514f5e3Sopenharmony_ci nativeCode_ = Load(VariableType::NATIVE_POINTER(), method_, 1274514f5e3Sopenharmony_ci IntPtr(Method::NATIVE_POINTER_OR_BYTECODE_ARRAY_OFFSET)); 1284514f5e3Sopenharmony_ci newTarget_ = Undefined(); 1294514f5e3Sopenharmony_ci thisValue_ = Undefined(); 1304514f5e3Sopenharmony_ci numArgs_ = Int32Add(actualNumArgs_, Int32(NUM_MANDATORY_JSFUNC_ARGS)); 1314514f5e3Sopenharmony_ci GateRef numArgsKeeper; 1324514f5e3Sopenharmony_ci 1334514f5e3Sopenharmony_ci int idxForNative = PrepareIdxForNative(); 1344514f5e3Sopenharmony_ci std::vector<GateRef> argsForNative = PrepareArgsForNative(); 1354514f5e3Sopenharmony_ci auto env = GetEnvironment(); 1364514f5e3Sopenharmony_ci Label notFastBuiltins(env); 1374514f5e3Sopenharmony_ci switch (callArgs_.mode) { 1384514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 1394514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 1404514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 1414514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 1424514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 1434514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 1444514f5e3Sopenharmony_ci numArgsKeeper = numArgs_; 1454514f5e3Sopenharmony_ci CallFastBuiltin(¬FastBuiltins, exit); 1464514f5e3Sopenharmony_ci Bind(¬FastBuiltins); 1474514f5e3Sopenharmony_ci numArgs_ = numArgsKeeper; 1484514f5e3Sopenharmony_ci [[fallthrough]]; 1494514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 1504514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 1514514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 1524514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 1534514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 1544514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 1554514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 1564514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 1574514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 1584514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 1594514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 1604514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 1614514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 1624514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 1634514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 1644514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 1654514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 1664514f5e3Sopenharmony_ci ret = CallNGCRuntime(glue_, idxForNative, argsForNative, hir_); 1674514f5e3Sopenharmony_ci break; 1684514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 1694514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 1704514f5e3Sopenharmony_ci ret = CallRuntime(glue_, idxForNative, argsForNative); 1714514f5e3Sopenharmony_ci break; 1724514f5e3Sopenharmony_ci default: 1734514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 1744514f5e3Sopenharmony_ci UNREACHABLE(); 1754514f5e3Sopenharmony_ci } 1764514f5e3Sopenharmony_ci result_->WriteVariable(ret); 1774514f5e3Sopenharmony_ci Jump(exit); 1784514f5e3Sopenharmony_ci} 1794514f5e3Sopenharmony_ci 1804514f5e3Sopenharmony_civoid CallStubBuilder::JSCallJSFunction(Label *exit, Label *noNeedCheckException) 1814514f5e3Sopenharmony_ci{ 1824514f5e3Sopenharmony_ci auto env = GetEnvironment(); 1834514f5e3Sopenharmony_ci 1844514f5e3Sopenharmony_ci Label funcIsClassConstructor(env); 1854514f5e3Sopenharmony_ci Label funcNotClassConstructor(env); 1864514f5e3Sopenharmony_ci Label methodNotAot(env); 1874514f5e3Sopenharmony_ci 1884514f5e3Sopenharmony_ci if (!AssemblerModule::IsCallNew(callArgs_.mode)) { 1894514f5e3Sopenharmony_ci BRANCH(IsClassConstructorFromBitField(bitfield_), &funcIsClassConstructor, &funcNotClassConstructor); 1904514f5e3Sopenharmony_ci Bind(&funcIsClassConstructor); 1914514f5e3Sopenharmony_ci { 1924514f5e3Sopenharmony_ci CallRuntime(glue_, RTSTUB_ID(ThrowCallConstructorException), {}); 1934514f5e3Sopenharmony_ci Jump(exit); 1944514f5e3Sopenharmony_ci } 1954514f5e3Sopenharmony_ci Bind(&funcNotClassConstructor); 1964514f5e3Sopenharmony_ci } 1974514f5e3Sopenharmony_ci HandleProfileCall(); 1984514f5e3Sopenharmony_ci if (isForBaseline_ && env->IsBaselineBuiltin()) { 1994514f5e3Sopenharmony_ci sp_ = Argument(static_cast<size_t>(BaselineCallInputs::SP)); 2004514f5e3Sopenharmony_ci } 2014514f5e3Sopenharmony_ci if (!isForBaseline_ && env->IsAsmInterp()) { 2024514f5e3Sopenharmony_ci sp_ = Argument(static_cast<size_t>(InterpreterHandlerInputs::SP)); 2034514f5e3Sopenharmony_ci } 2044514f5e3Sopenharmony_ci Label methodisAot(env); 2054514f5e3Sopenharmony_ci Label funcHasBaselineCode(env); 2064514f5e3Sopenharmony_ci Label funcCheckBaselineCode(env); 2074514f5e3Sopenharmony_ci Label checkIsBaselineCompiling(env); 2084514f5e3Sopenharmony_ci Label methodIsFastCall(env); 2094514f5e3Sopenharmony_ci Label methodNotFastCall(env); 2104514f5e3Sopenharmony_ci Label checkAot(env); 2114514f5e3Sopenharmony_ci { 2124514f5e3Sopenharmony_ci newTarget_ = Undefined(); 2134514f5e3Sopenharmony_ci thisValue_ = Undefined(); 2144514f5e3Sopenharmony_ci realNumArgs_ = Int64Add(ZExtInt32ToInt64(actualNumArgs_), Int64(NUM_MANDATORY_JSFUNC_ARGS)); 2154514f5e3Sopenharmony_ci BRANCH(IsJsProxy(func_), &methodNotAot, &checkAot); 2164514f5e3Sopenharmony_ci Bind(&checkAot); 2174514f5e3Sopenharmony_ci BRANCH(JudgeAotAndFastCall(func_, CircuitBuilder::JudgeMethodType::HAS_AOT_FASTCALL), &methodIsFastCall, 2184514f5e3Sopenharmony_ci &methodNotFastCall); 2194514f5e3Sopenharmony_ci Bind(&methodIsFastCall); 2204514f5e3Sopenharmony_ci { 2214514f5e3Sopenharmony_ci JSFastAotCall(exit); 2224514f5e3Sopenharmony_ci } 2234514f5e3Sopenharmony_ci 2244514f5e3Sopenharmony_ci Bind(&methodNotFastCall); 2254514f5e3Sopenharmony_ci BRANCH(JudgeAotAndFastCall(func_, CircuitBuilder::JudgeMethodType::HAS_AOT), &methodisAot, 2264514f5e3Sopenharmony_ci &funcCheckBaselineCode); 2274514f5e3Sopenharmony_ci Bind(&methodisAot); 2284514f5e3Sopenharmony_ci { 2294514f5e3Sopenharmony_ci JSSlowAotCall(exit); 2304514f5e3Sopenharmony_ci } 2314514f5e3Sopenharmony_ci 2324514f5e3Sopenharmony_ci Bind(&funcCheckBaselineCode); 2334514f5e3Sopenharmony_ci GateRef baselineCodeOffset = IntPtr(JSFunction::BASELINECODE_OFFSET); 2344514f5e3Sopenharmony_ci GateRef baselineCode = Load(VariableType::JS_POINTER(), func_, baselineCodeOffset); 2354514f5e3Sopenharmony_ci 2364514f5e3Sopenharmony_ci Branch(NotEqual(baselineCode, Undefined()), &checkIsBaselineCompiling, &methodNotAot); 2374514f5e3Sopenharmony_ci Bind(&checkIsBaselineCompiling); 2384514f5e3Sopenharmony_ci Branch(NotEqual(baselineCode, Hole()), &funcHasBaselineCode, &methodNotAot); 2394514f5e3Sopenharmony_ci 2404514f5e3Sopenharmony_ci Bind(&funcHasBaselineCode); 2414514f5e3Sopenharmony_ci { 2424514f5e3Sopenharmony_ci GateRef res = result_->Value(); 2434514f5e3Sopenharmony_ci JSCallAsmInterpreter(true, &methodNotAot, exit, noNeedCheckException); 2444514f5e3Sopenharmony_ci if (!isForBaseline_) { 2454514f5e3Sopenharmony_ci ASSERT(CheckResultValueChangedWithReturn(res)); 2464514f5e3Sopenharmony_ci } 2474514f5e3Sopenharmony_ci (void) res; 2484514f5e3Sopenharmony_ci } 2494514f5e3Sopenharmony_ci 2504514f5e3Sopenharmony_ci Bind(&methodNotAot); 2514514f5e3Sopenharmony_ci { 2524514f5e3Sopenharmony_ci JSCallAsmInterpreter(false, &methodNotAot, exit, noNeedCheckException); 2534514f5e3Sopenharmony_ci } 2544514f5e3Sopenharmony_ci } 2554514f5e3Sopenharmony_ci} 2564514f5e3Sopenharmony_ci 2574514f5e3Sopenharmony_civoid CallStubBuilder::JSFastAotCall(Label *exit) 2584514f5e3Sopenharmony_ci{ 2594514f5e3Sopenharmony_ci auto env = GetEnvironment(); 2604514f5e3Sopenharmony_ci Label fastCall(env); 2614514f5e3Sopenharmony_ci Label fastCallBridge(env); 2624514f5e3Sopenharmony_ci isFast_ = true; 2634514f5e3Sopenharmony_ci 2644514f5e3Sopenharmony_ci GateRef expectedNum = Int64And(Int64LSR(callField_, Int64(MethodLiteral::NumArgsBits::START_BIT)), 2654514f5e3Sopenharmony_ci Int64((1LU << MethodLiteral::NumArgsBits::SIZE) - 1)); 2664514f5e3Sopenharmony_ci GateRef expectedArgc = Int64Add(expectedNum, Int64(NUM_MANDATORY_JSFUNC_ARGS)); 2674514f5e3Sopenharmony_ci BRANCH(Int64Equal(expectedArgc, realNumArgs_), &fastCall, &fastCallBridge); 2684514f5e3Sopenharmony_ci GateRef code; 2694514f5e3Sopenharmony_ci Bind(&fastCall); 2704514f5e3Sopenharmony_ci { 2714514f5e3Sopenharmony_ci isBridge_ = false; 2724514f5e3Sopenharmony_ci code = GetAotCodeAddr(func_); 2734514f5e3Sopenharmony_ci CallBridge(code, expectedNum, exit); 2744514f5e3Sopenharmony_ci } 2754514f5e3Sopenharmony_ci Bind(&fastCallBridge); 2764514f5e3Sopenharmony_ci { 2774514f5e3Sopenharmony_ci isBridge_ = true; 2784514f5e3Sopenharmony_ci CallBridge(code, expectedNum, exit); 2794514f5e3Sopenharmony_ci } 2804514f5e3Sopenharmony_ci} 2814514f5e3Sopenharmony_ci 2824514f5e3Sopenharmony_civoid CallStubBuilder::JSSlowAotCall(Label *exit) 2834514f5e3Sopenharmony_ci{ 2844514f5e3Sopenharmony_ci auto env = GetEnvironment(); 2854514f5e3Sopenharmony_ci Label slowCall(env); 2864514f5e3Sopenharmony_ci Label slowCallBridge(env); 2874514f5e3Sopenharmony_ci isFast_ = false; 2884514f5e3Sopenharmony_ci 2894514f5e3Sopenharmony_ci GateRef expectedNum = Int64And(Int64LSR(callField_, Int64(MethodLiteral::NumArgsBits::START_BIT)), 2904514f5e3Sopenharmony_ci Int64((1LU << MethodLiteral::NumArgsBits::SIZE) - 1)); 2914514f5e3Sopenharmony_ci GateRef expectedArgc = Int64Add(expectedNum, Int64(NUM_MANDATORY_JSFUNC_ARGS)); 2924514f5e3Sopenharmony_ci BRANCH(Int64Equal(expectedArgc, realNumArgs_), &slowCall, &slowCallBridge); 2934514f5e3Sopenharmony_ci GateRef code; 2944514f5e3Sopenharmony_ci Bind(&slowCall); 2954514f5e3Sopenharmony_ci { 2964514f5e3Sopenharmony_ci isBridge_ = false; 2974514f5e3Sopenharmony_ci code = GetAotCodeAddr(func_); 2984514f5e3Sopenharmony_ci CallBridge(code, expectedNum, exit); 2994514f5e3Sopenharmony_ci } 3004514f5e3Sopenharmony_ci Bind(&slowCallBridge); 3014514f5e3Sopenharmony_ci { 3024514f5e3Sopenharmony_ci isBridge_ = true; 3034514f5e3Sopenharmony_ci CallBridge(code, expectedNum, exit); 3044514f5e3Sopenharmony_ci } 3054514f5e3Sopenharmony_ci} 3064514f5e3Sopenharmony_ci 3074514f5e3Sopenharmony_ciGateRef CallStubBuilder::CallConstructorBridge(const int idxForAot, const std::vector<GateRef> &argsForAot) 3084514f5e3Sopenharmony_ci{ 3094514f5e3Sopenharmony_ci GateRef ret; 3104514f5e3Sopenharmony_ci switch (callArgs_.mode) { 3114514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 3124514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 3134514f5e3Sopenharmony_ci ret = CallNGCRuntime(glue_, idxForAot, argsForAot); 3144514f5e3Sopenharmony_ci ret = ConstructorCheck(glue_, func_, ret, callArgs_.callConstructorArgs.thisObj); 3154514f5e3Sopenharmony_ci break; 3164514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 3174514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 3184514f5e3Sopenharmony_ci ret = CallNGCRuntime(glue_, idxForAot, argsForAot, hir_); 3194514f5e3Sopenharmony_ci ret = ConstructorCheck(glue_, func_, ret, callArgs_.superCallArgs.thisObj); 3204514f5e3Sopenharmony_ci break; 3214514f5e3Sopenharmony_ci default: 3224514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 3234514f5e3Sopenharmony_ci UNREACHABLE(); 3244514f5e3Sopenharmony_ci } 3254514f5e3Sopenharmony_ci return ret; 3264514f5e3Sopenharmony_ci} 3274514f5e3Sopenharmony_ci 3284514f5e3Sopenharmony_civoid CallStubBuilder::CallBridge(GateRef code, GateRef expectedNum, Label *exit) 3294514f5e3Sopenharmony_ci{ 3304514f5e3Sopenharmony_ci int idxForAot = PrepareIdxForAot(); 3314514f5e3Sopenharmony_ci std::vector<GateRef> argsForAot = PrepareArgsForAot(expectedNum); 3324514f5e3Sopenharmony_ci GateRef ret; 3334514f5e3Sopenharmony_ci switch (callArgs_.mode) { 3344514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 3354514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 3364514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 3374514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 3384514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 3394514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 3404514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 3414514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 3424514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 3434514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 3444514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 3454514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 3464514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 3474514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 3484514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 3494514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 3504514f5e3Sopenharmony_ci if (IsFastAotCall()) { 3514514f5e3Sopenharmony_ci ret = FastCallOptimized(glue_, code, argsForAot, hir_); 3524514f5e3Sopenharmony_ci } else if (IsSlowAotCall()) { 3534514f5e3Sopenharmony_ci ret = CallOptimized(glue_, code, argsForAot, hir_); 3544514f5e3Sopenharmony_ci } else { 3554514f5e3Sopenharmony_ci ret = CallNGCRuntime(glue_, idxForAot, argsForAot, hir_); 3564514f5e3Sopenharmony_ci } 3574514f5e3Sopenharmony_ci break; 3584514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 3594514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 3604514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 3614514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 3624514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 3634514f5e3Sopenharmony_ci ret = CallNGCRuntime(glue_, idxForAot, argsForAot); 3644514f5e3Sopenharmony_ci break; 3654514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 3664514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 3674514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 3684514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 3694514f5e3Sopenharmony_ci ret = CallConstructorBridge(idxForAot, argsForAot); 3704514f5e3Sopenharmony_ci break; 3714514f5e3Sopenharmony_ci default: 3724514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 3734514f5e3Sopenharmony_ci UNREACHABLE(); 3744514f5e3Sopenharmony_ci } 3754514f5e3Sopenharmony_ci result_->WriteVariable(ret); 3764514f5e3Sopenharmony_ci Jump(exit); 3774514f5e3Sopenharmony_ci} 3784514f5e3Sopenharmony_ci 3794514f5e3Sopenharmony_civoid CallStubBuilder::JSCallAsmInterpreter(bool hasBaselineCode, Label *methodNotAot, Label *exit, 3804514f5e3Sopenharmony_ci Label *noNeedCheckException) 3814514f5e3Sopenharmony_ci{ 3824514f5e3Sopenharmony_ci if (jumpSize_ != 0) { 3834514f5e3Sopenharmony_ci SaveJumpSizeIfNeeded(glue_, jumpSize_); 3844514f5e3Sopenharmony_ci } 3854514f5e3Sopenharmony_ci SaveHotnessCounterIfNeeded(glue_, sp_, hotnessCounter_, callArgs_.mode); 3864514f5e3Sopenharmony_ci 3874514f5e3Sopenharmony_ci int idxForAsmInterpreter = isForBaseline_ ? 3884514f5e3Sopenharmony_ci (hasBaselineCode ? 3894514f5e3Sopenharmony_ci PrepareIdxForAsmInterpreterForBaselineWithBaselineCode() : 3904514f5e3Sopenharmony_ci PrepareIdxForAsmInterpreterForBaselineWithoutBaselineCode()) : 3914514f5e3Sopenharmony_ci (hasBaselineCode ? 3924514f5e3Sopenharmony_ci PrepareIdxForAsmInterpreterWithBaselineCode() : 3934514f5e3Sopenharmony_ci PrepareIdxForAsmInterpreterWithoutBaselineCode()); 3944514f5e3Sopenharmony_ci std::vector<GateRef> argsForAsmInterpreter = PrepareArgsForAsmInterpreter(); 3954514f5e3Sopenharmony_ci 3964514f5e3Sopenharmony_ci switch (callArgs_.mode) { 3974514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 3984514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 3994514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 4004514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 4014514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 4024514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 4034514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 4044514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 4054514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 4064514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 4074514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 4084514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 4094514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 4104514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 4114514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 4124514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 4134514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 4144514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 4154514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 4164514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 4174514f5e3Sopenharmony_ci *result_ = CallNGCRuntime(glue_, idxForAsmInterpreter, argsForAsmInterpreter); 4184514f5e3Sopenharmony_ci if (!isForBaseline_) { 4194514f5e3Sopenharmony_ci Return(); 4204514f5e3Sopenharmony_ci } 4214514f5e3Sopenharmony_ci break; 4224514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 4234514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 4244514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 4254514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 4264514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 4274514f5e3Sopenharmony_ci if (isForBaseline_) { 4284514f5e3Sopenharmony_ci *result_ = CallNGCRuntime(glue_, idxForAsmInterpreter, argsForAsmInterpreter); 4294514f5e3Sopenharmony_ci } else if (hasBaselineCode) { 4304514f5e3Sopenharmony_ci Jump(methodNotAot); 4314514f5e3Sopenharmony_ci } else { 4324514f5e3Sopenharmony_ci *result_ = CallNGCRuntime(glue_, idxForAsmInterpreter, argsForAsmInterpreter, hir_); 4334514f5e3Sopenharmony_ci Jump(exit); 4344514f5e3Sopenharmony_ci } 4354514f5e3Sopenharmony_ci break; 4364514f5e3Sopenharmony_ci default: 4374514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 4384514f5e3Sopenharmony_ci UNREACHABLE(); 4394514f5e3Sopenharmony_ci } 4404514f5e3Sopenharmony_ci 4414514f5e3Sopenharmony_ci if (isForBaseline_) { 4424514f5e3Sopenharmony_ci if (noNeedCheckException != nullptr) { 4434514f5e3Sopenharmony_ci Jump(noNeedCheckException); 4444514f5e3Sopenharmony_ci } else { 4454514f5e3Sopenharmony_ci Jump(exit); 4464514f5e3Sopenharmony_ci } 4474514f5e3Sopenharmony_ci } 4484514f5e3Sopenharmony_ci} 4494514f5e3Sopenharmony_ci 4504514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForNative() 4514514f5e3Sopenharmony_ci{ 4524514f5e3Sopenharmony_ci switch (callArgs_.mode) { 4534514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 4544514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 4554514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 4564514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 4574514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 4584514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 4594514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 4604514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 4614514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 4624514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 4634514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 4644514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 4654514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 4664514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 4674514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 4684514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 4694514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallArgsAndDispatchNative); 4704514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 4714514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 4724514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 4734514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 4744514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 4754514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallRangeAndDispatchNative); 4764514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 4774514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 4784514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallNewAndDispatchNative); 4794514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 4804514f5e3Sopenharmony_ci return RTSTUB_ID(SuperCall); 4814514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 4824514f5e3Sopenharmony_ci return RTSTUB_ID(SuperCallSpread); 4834514f5e3Sopenharmony_ci default: 4844514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 4854514f5e3Sopenharmony_ci UNREACHABLE(); 4864514f5e3Sopenharmony_ci } 4874514f5e3Sopenharmony_ci} 4884514f5e3Sopenharmony_ci 4894514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareArgsForNative() 4904514f5e3Sopenharmony_ci{ 4914514f5e3Sopenharmony_ci std::vector<GateRef> basicArgs = PrepareBasicArgsForNative(); 4924514f5e3Sopenharmony_ci std::vector<GateRef> appendArgs = PrepareAppendArgsForNative(); 4934514f5e3Sopenharmony_ci 4944514f5e3Sopenharmony_ci basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end()); 4954514f5e3Sopenharmony_ci return basicArgs; 4964514f5e3Sopenharmony_ci} 4974514f5e3Sopenharmony_ci 4984514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareBasicArgsForNative() 4994514f5e3Sopenharmony_ci{ 5004514f5e3Sopenharmony_ci switch (callArgs_.mode) { 5014514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 5024514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 5034514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 5044514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 5054514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 5064514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 5074514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 5084514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 5094514f5e3Sopenharmony_ci return { nativeCode_, glue_, numArgs_, func_, newTarget_, thisValue_ }; 5104514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 5114514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 5124514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 5134514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 5144514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 5154514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 5164514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 5174514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 5184514f5e3Sopenharmony_ci return { nativeCode_, glue_, numArgs_, func_, newTarget_ }; 5194514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 5204514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 5214514f5e3Sopenharmony_ci return { glue_, nativeCode_, func_, thisValue_ }; 5224514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 5234514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 5244514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 5254514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 5264514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 5274514f5e3Sopenharmony_ci return { glue_, nativeCode_, func_ }; 5284514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 5294514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 5304514f5e3Sopenharmony_ci return {}; 5314514f5e3Sopenharmony_ci default: 5324514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 5334514f5e3Sopenharmony_ci UNREACHABLE(); 5344514f5e3Sopenharmony_ci } 5354514f5e3Sopenharmony_ci} 5364514f5e3Sopenharmony_ci 5374514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForNative() 5384514f5e3Sopenharmony_ci{ 5394514f5e3Sopenharmony_ci switch (callArgs_.mode) { 5404514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 5414514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 5424514f5e3Sopenharmony_ci return {}; 5434514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 5444514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 5454514f5e3Sopenharmony_ci return { 5464514f5e3Sopenharmony_ci callArgs_.callArgs.arg0 5474514f5e3Sopenharmony_ci }; 5484514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 5494514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 5504514f5e3Sopenharmony_ci return { 5514514f5e3Sopenharmony_ci callArgs_.callArgs.arg0, 5524514f5e3Sopenharmony_ci callArgs_.callArgs.arg1 5534514f5e3Sopenharmony_ci }; 5544514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 5554514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 5564514f5e3Sopenharmony_ci return { 5574514f5e3Sopenharmony_ci callArgs_.callArgs.arg0, 5584514f5e3Sopenharmony_ci callArgs_.callArgs.arg1, 5594514f5e3Sopenharmony_ci callArgs_.callArgs.arg2 5604514f5e3Sopenharmony_ci }; 5614514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 5624514f5e3Sopenharmony_ci return { 5634514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue 5644514f5e3Sopenharmony_ci }; 5654514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 5664514f5e3Sopenharmony_ci return { 5674514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, 5684514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0 5694514f5e3Sopenharmony_ci }; 5704514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 5714514f5e3Sopenharmony_ci return { 5724514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, 5734514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 5744514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg1 5754514f5e3Sopenharmony_ci }; 5764514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 5774514f5e3Sopenharmony_ci return { 5784514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, 5794514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 5804514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg1, 5814514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg2 5824514f5e3Sopenharmony_ci }; 5834514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 5844514f5e3Sopenharmony_ci return { 5854514f5e3Sopenharmony_ci callArgs_.callGetterArgs.receiver 5864514f5e3Sopenharmony_ci }; 5874514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 5884514f5e3Sopenharmony_ci return { 5894514f5e3Sopenharmony_ci callArgs_.callSetterArgs.receiver, 5904514f5e3Sopenharmony_ci callArgs_.callSetterArgs.value 5914514f5e3Sopenharmony_ci }; 5924514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 5934514f5e3Sopenharmony_ci return { 5944514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.thisValue, 5954514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.arg0, 5964514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.arg1 5974514f5e3Sopenharmony_ci }; 5984514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 5994514f5e3Sopenharmony_ci return { 6004514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.argHandle, 6014514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.value, 6024514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.key, 6034514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.thisValue 6044514f5e3Sopenharmony_ci }; 6054514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 6064514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 6074514f5e3Sopenharmony_ci return { 6084514f5e3Sopenharmony_ci callArgs_.callArgv.argc, 6094514f5e3Sopenharmony_ci callArgs_.callArgv.argv 6104514f5e3Sopenharmony_ci }; 6114514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 6124514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 6134514f5e3Sopenharmony_ci return { 6144514f5e3Sopenharmony_ci callArgs_.callArgvWithThis.thisValue, 6154514f5e3Sopenharmony_ci callArgs_.callArgvWithThis.argc, 6164514f5e3Sopenharmony_ci callArgs_.callArgvWithThis.argv 6174514f5e3Sopenharmony_ci }; 6184514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 6194514f5e3Sopenharmony_ci return { 6204514f5e3Sopenharmony_ci callArgs_.callThisArgvWithReturnArgs.thisValue, 6214514f5e3Sopenharmony_ci callArgs_.callThisArgvWithReturnArgs.argc, 6224514f5e3Sopenharmony_ci callArgs_.callThisArgvWithReturnArgs.argv 6234514f5e3Sopenharmony_ci }; 6244514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 6254514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 6264514f5e3Sopenharmony_ci return { 6274514f5e3Sopenharmony_ci callArgs_.callConstructorArgs.thisObj, 6284514f5e3Sopenharmony_ci callArgs_.callConstructorArgs.argc, 6294514f5e3Sopenharmony_ci callArgs_.callConstructorArgs.argv 6304514f5e3Sopenharmony_ci }; 6314514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 6324514f5e3Sopenharmony_ci return { 6334514f5e3Sopenharmony_ci callArgs_.superCallArgs.thisFunc, 6344514f5e3Sopenharmony_ci callArgs_.superCallArgs.array, 6354514f5e3Sopenharmony_ci IntToTaggedInt(callArgs_.superCallArgs.argc) 6364514f5e3Sopenharmony_ci }; 6374514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 6384514f5e3Sopenharmony_ci return { 6394514f5e3Sopenharmony_ci callArgs_.superCallArgs.thisFunc, 6404514f5e3Sopenharmony_ci callArgs_.superCallArgs.array 6414514f5e3Sopenharmony_ci }; 6424514f5e3Sopenharmony_ci default: 6434514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 6444514f5e3Sopenharmony_ci UNREACHABLE(); 6454514f5e3Sopenharmony_ci } 6464514f5e3Sopenharmony_ci} 6474514f5e3Sopenharmony_ci 6484514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAot() 6494514f5e3Sopenharmony_ci{ 6504514f5e3Sopenharmony_ci switch (callArgs_.mode) { 6514514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 6524514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 6534514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 6544514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 6554514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 6564514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 6574514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 6584514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 6594514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 6604514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 6614514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 6624514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 6634514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 6644514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 6654514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 6664514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 6674514f5e3Sopenharmony_ci if (isFast_) { 6684514f5e3Sopenharmony_ci return RTSTUB_ID(OptimizedFastCallAndPushArgv); 6694514f5e3Sopenharmony_ci } else { 6704514f5e3Sopenharmony_ci return RTSTUB_ID(OptimizedCallAndPushArgv); 6714514f5e3Sopenharmony_ci } 6724514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 6734514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 6744514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 6754514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 6764514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 6774514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 6784514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 6794514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 6804514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 6814514f5e3Sopenharmony_ci if (IsFastAotCall()) { 6824514f5e3Sopenharmony_ci return RTSTUB_ID(JSFastCallWithArgV); 6834514f5e3Sopenharmony_ci } else if (IsFastAotCallWithBridge()) { 6844514f5e3Sopenharmony_ci return RTSTUB_ID(JSFastCallWithArgVAndPushArgv); 6854514f5e3Sopenharmony_ci } else if (IsSlowAotCall()) { 6864514f5e3Sopenharmony_ci return RTSTUB_ID(JSCallWithArgV); 6874514f5e3Sopenharmony_ci } else { 6884514f5e3Sopenharmony_ci return RTSTUB_ID(JSCallWithArgVAndPushArgv); 6894514f5e3Sopenharmony_ci } 6904514f5e3Sopenharmony_ci default: 6914514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 6924514f5e3Sopenharmony_ci UNREACHABLE(); 6934514f5e3Sopenharmony_ci } 6944514f5e3Sopenharmony_ci} 6954514f5e3Sopenharmony_ci 6964514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareArgsForAot(GateRef expectedNum) 6974514f5e3Sopenharmony_ci{ 6984514f5e3Sopenharmony_ci std::vector<GateRef> basicArgs = PrepareBasicArgsForAot(); 6994514f5e3Sopenharmony_ci 7004514f5e3Sopenharmony_ci std::vector<GateRef> appendArgs = PrepareAppendArgsForAotStep1(); 7014514f5e3Sopenharmony_ci basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end()); 7024514f5e3Sopenharmony_ci 7034514f5e3Sopenharmony_ci appendArgs = PrepareAppendArgsForAotStep2(); 7044514f5e3Sopenharmony_ci basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end()); 7054514f5e3Sopenharmony_ci 7064514f5e3Sopenharmony_ci appendArgs = PrepareAppendArgsForAotStep3(expectedNum); 7074514f5e3Sopenharmony_ci basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end()); 7084514f5e3Sopenharmony_ci 7094514f5e3Sopenharmony_ci return basicArgs; 7104514f5e3Sopenharmony_ci} 7114514f5e3Sopenharmony_ci 7124514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareBasicArgsForAot() 7134514f5e3Sopenharmony_ci{ 7144514f5e3Sopenharmony_ci switch (callArgs_.mode) { 7154514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 7164514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 7174514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 7184514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 7194514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 7204514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 7214514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 7224514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 7234514f5e3Sopenharmony_ci if (IsFastAotCall()) { 7244514f5e3Sopenharmony_ci return { glue_, func_, thisValue_ }; 7254514f5e3Sopenharmony_ci } else { 7264514f5e3Sopenharmony_ci return { glue_, realNumArgs_, IntPtr(0), func_, newTarget_, thisValue_ }; 7274514f5e3Sopenharmony_ci } 7284514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 7294514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 7304514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 7314514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 7324514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 7334514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 7344514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 7354514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 7364514f5e3Sopenharmony_ci if (IsFastAotCall()) { 7374514f5e3Sopenharmony_ci return { glue_, func_ }; 7384514f5e3Sopenharmony_ci } else { 7394514f5e3Sopenharmony_ci return { glue_, realNumArgs_, IntPtr(0), func_, newTarget_ }; 7404514f5e3Sopenharmony_ci } 7414514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 7424514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 7434514f5e3Sopenharmony_ci if (isFast_) { 7444514f5e3Sopenharmony_ci return { glue_, func_, thisValue_, ZExtInt32ToInt64(actualNumArgs_) }; 7454514f5e3Sopenharmony_ci } else { 7464514f5e3Sopenharmony_ci return { glue_, ZExtInt32ToInt64(actualNumArgs_), func_, newTarget_, thisValue_ }; 7474514f5e3Sopenharmony_ci } 7484514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 7494514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 7504514f5e3Sopenharmony_ci if (!isFast_) { 7514514f5e3Sopenharmony_ci return { glue_, ZExtInt32ToInt64(actualNumArgs_), func_, func_ }; 7524514f5e3Sopenharmony_ci } 7534514f5e3Sopenharmony_ci [[fallthrough]]; 7544514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 7554514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 7564514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 7574514f5e3Sopenharmony_ci if (isFast_) { 7584514f5e3Sopenharmony_ci return { glue_, func_ }; 7594514f5e3Sopenharmony_ci } else { 7604514f5e3Sopenharmony_ci return { glue_, ZExtInt32ToInt64(actualNumArgs_), func_, newTarget_ }; 7614514f5e3Sopenharmony_ci } 7624514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 7634514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 7644514f5e3Sopenharmony_ci if (isFast_) { 7654514f5e3Sopenharmony_ci return { glue_, func_ }; 7664514f5e3Sopenharmony_ci } else { 7674514f5e3Sopenharmony_ci return { glue_, ZExtInt32ToInt64(actualNumArgs_), func_}; 7684514f5e3Sopenharmony_ci } 7694514f5e3Sopenharmony_ci default: 7704514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 7714514f5e3Sopenharmony_ci UNREACHABLE(); 7724514f5e3Sopenharmony_ci } 7734514f5e3Sopenharmony_ci} 7744514f5e3Sopenharmony_ci 7754514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForAotStep1() 7764514f5e3Sopenharmony_ci{ 7774514f5e3Sopenharmony_ci switch (callArgs_.mode) { 7784514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 7794514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 7804514f5e3Sopenharmony_ci return {}; 7814514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 7824514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 7834514f5e3Sopenharmony_ci return { callArgs_.callArgs.arg0 }; 7844514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 7854514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 7864514f5e3Sopenharmony_ci return { 7874514f5e3Sopenharmony_ci callArgs_.callArgs.arg0, 7884514f5e3Sopenharmony_ci callArgs_.callArgs.arg1 7894514f5e3Sopenharmony_ci }; 7904514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 7914514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 7924514f5e3Sopenharmony_ci return { 7934514f5e3Sopenharmony_ci callArgs_.callArgs.arg0, 7944514f5e3Sopenharmony_ci callArgs_.callArgs.arg1, 7954514f5e3Sopenharmony_ci callArgs_.callArgs.arg2 7964514f5e3Sopenharmony_ci }; 7974514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 7984514f5e3Sopenharmony_ci return { callArgs_.callArgsWithThis.thisValue }; 7994514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 8004514f5e3Sopenharmony_ci return { 8014514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, 8024514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0 8034514f5e3Sopenharmony_ci }; 8044514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 8054514f5e3Sopenharmony_ci return { 8064514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, 8074514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 8084514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg1 8094514f5e3Sopenharmony_ci }; 8104514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 8114514f5e3Sopenharmony_ci return { 8124514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, 8134514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 8144514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg1, 8154514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg2 8164514f5e3Sopenharmony_ci }; 8174514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 8184514f5e3Sopenharmony_ci return { callArgs_.callGetterArgs.receiver }; 8194514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 8204514f5e3Sopenharmony_ci return { 8214514f5e3Sopenharmony_ci callArgs_.callSetterArgs.receiver, 8224514f5e3Sopenharmony_ci callArgs_.callSetterArgs.value 8234514f5e3Sopenharmony_ci }; 8244514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 8254514f5e3Sopenharmony_ci return { 8264514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.thisValue, 8274514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.arg0, 8284514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.arg1 8294514f5e3Sopenharmony_ci }; 8304514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 8314514f5e3Sopenharmony_ci return { 8324514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.argHandle, 8334514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.value, 8344514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.key, 8354514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.thisValue 8364514f5e3Sopenharmony_ci }; 8374514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 8384514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 8394514f5e3Sopenharmony_ci return { callArgs_.callArgv.argv }; 8404514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 8414514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 8424514f5e3Sopenharmony_ci return { callArgs_.callArgvWithThis.thisValue }; 8434514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 8444514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 8454514f5e3Sopenharmony_ci return { callArgs_.callConstructorArgs.thisObj }; 8464514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 8474514f5e3Sopenharmony_ci return { callArgs_.callThisArgvWithReturnArgs.thisValue }; 8484514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 8494514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 8504514f5e3Sopenharmony_ci return {}; 8514514f5e3Sopenharmony_ci default: 8524514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 8534514f5e3Sopenharmony_ci UNREACHABLE(); 8544514f5e3Sopenharmony_ci } 8554514f5e3Sopenharmony_ci} 8564514f5e3Sopenharmony_ci 8574514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForAotStep2() 8584514f5e3Sopenharmony_ci{ 8594514f5e3Sopenharmony_ci switch (callArgs_.mode) { 8604514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 8614514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 8624514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 8634514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 8644514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 8654514f5e3Sopenharmony_ci if (isFast_) { 8664514f5e3Sopenharmony_ci return { ZExtInt32ToInt64(actualNumArgs_) }; 8674514f5e3Sopenharmony_ci } 8684514f5e3Sopenharmony_ci [[fallthrough]]; 8694514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 8704514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 8714514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 8724514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 8734514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 8744514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 8754514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 8764514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 8774514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 8784514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 8794514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 8804514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 8814514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 8824514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 8834514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 8844514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 8854514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 8864514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 8874514f5e3Sopenharmony_ci return {}; 8884514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 8894514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 8904514f5e3Sopenharmony_ci if (isFast_) { 8914514f5e3Sopenharmony_ci return { 8924514f5e3Sopenharmony_ci callArgs_.superCallArgs.thisObj, 8934514f5e3Sopenharmony_ci callArgs_.superCallArgs.argc, 8944514f5e3Sopenharmony_ci callArgs_.superCallArgs.argv 8954514f5e3Sopenharmony_ci }; 8964514f5e3Sopenharmony_ci } else { 8974514f5e3Sopenharmony_ci return { 8984514f5e3Sopenharmony_ci callArgs_.superCallArgs.newTarget, 8994514f5e3Sopenharmony_ci callArgs_.superCallArgs.thisObj, 9004514f5e3Sopenharmony_ci callArgs_.superCallArgs.argv 9014514f5e3Sopenharmony_ci }; 9024514f5e3Sopenharmony_ci } 9034514f5e3Sopenharmony_ci default: 9044514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 9054514f5e3Sopenharmony_ci UNREACHABLE(); 9064514f5e3Sopenharmony_ci } 9074514f5e3Sopenharmony_ci} 9084514f5e3Sopenharmony_ci 9094514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForAotStep3(GateRef expectedNum) 9104514f5e3Sopenharmony_ci{ 9114514f5e3Sopenharmony_ci std::vector<GateRef> retArgs {}; 9124514f5e3Sopenharmony_ci switch (callArgs_.mode) { 9134514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 9144514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 9154514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 9164514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 9174514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 9184514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 9194514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 9204514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 9214514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 9224514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 9234514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 9244514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 9254514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 9264514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 9274514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 9284514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 9294514f5e3Sopenharmony_ci return {}; 9304514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 9314514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 9324514f5e3Sopenharmony_ci retArgs.push_back(callArgs_.callArgvWithThis.argv); 9334514f5e3Sopenharmony_ci break; 9344514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 9354514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 9364514f5e3Sopenharmony_ci retArgs.push_back(callArgs_.callConstructorArgs.argv); 9374514f5e3Sopenharmony_ci break; 9384514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 9394514f5e3Sopenharmony_ci retArgs.push_back(callArgs_.callThisArgvWithReturnArgs.argv); 9404514f5e3Sopenharmony_ci break; 9414514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 9424514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 9434514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 9444514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 9454514f5e3Sopenharmony_ci break; 9464514f5e3Sopenharmony_ci default: 9474514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 9484514f5e3Sopenharmony_ci UNREACHABLE(); 9494514f5e3Sopenharmony_ci } 9504514f5e3Sopenharmony_ci 9514514f5e3Sopenharmony_ci if (IsFastAotCallWithBridge()) { 9524514f5e3Sopenharmony_ci retArgs.push_back(expectedNum); 9534514f5e3Sopenharmony_ci } 9544514f5e3Sopenharmony_ci return retArgs; 9554514f5e3Sopenharmony_ci} 9564514f5e3Sopenharmony_ci 9574514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAsmInterpreterForBaselineWithBaselineCode() 9584514f5e3Sopenharmony_ci{ 9594514f5e3Sopenharmony_ci switch (callArgs_.mode) { 9604514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 9614514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 9624514f5e3Sopenharmony_ci return RTSTUB_ID(CallArg0AndCheckToBaselineFromBaseline); 9634514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 9644514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 9654514f5e3Sopenharmony_ci return RTSTUB_ID(CallArg1AndCheckToBaselineFromBaseline); 9664514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 9674514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 9684514f5e3Sopenharmony_ci return RTSTUB_ID(CallArgs2AndCheckToBaselineFromBaseline); 9694514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 9704514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 9714514f5e3Sopenharmony_ci return RTSTUB_ID(CallArgs3AndCheckToBaselineFromBaseline); 9724514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 9734514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArg0AndCheckToBaselineFromBaseline); 9744514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 9754514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArg1AndCheckToBaselineFromBaseline); 9764514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 9774514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArgs2AndCheckToBaselineFromBaseline); 9784514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 9794514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArgs3AndCheckToBaselineFromBaseline); 9804514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 9814514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 9824514f5e3Sopenharmony_ci return RTSTUB_ID(CallRangeAndCheckToBaselineFromBaseline); 9834514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 9844514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 9854514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisRangeAndCheckToBaselineFromBaseline); 9864514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 9874514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 9884514f5e3Sopenharmony_ci return RTSTUB_ID(CallNewAndCheckToBaselineFromBaseline); 9894514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 9904514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 9914514f5e3Sopenharmony_ci return RTSTUB_ID(SuperCallAndCheckToBaselineFromBaseline); 9924514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 9934514f5e3Sopenharmony_ci return RTSTUB_ID(CallGetter); 9944514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 9954514f5e3Sopenharmony_ci return RTSTUB_ID(CallSetter); 9964514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 9974514f5e3Sopenharmony_ci return RTSTUB_ID(CallContainersArgs2); 9984514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 9994514f5e3Sopenharmony_ci return RTSTUB_ID(CallContainersArgs3); 10004514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 10014514f5e3Sopenharmony_ci return RTSTUB_ID(CallReturnWithArgv); 10024514f5e3Sopenharmony_ci default: 10034514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 10044514f5e3Sopenharmony_ci UNREACHABLE(); 10054514f5e3Sopenharmony_ci } 10064514f5e3Sopenharmony_ci} 10074514f5e3Sopenharmony_ci 10084514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAsmInterpreterForBaselineWithoutBaselineCode() 10094514f5e3Sopenharmony_ci{ 10104514f5e3Sopenharmony_ci switch (callArgs_.mode) { 10114514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 10124514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 10134514f5e3Sopenharmony_ci return RTSTUB_ID(CallArg0AndDispatchFromBaseline); 10144514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 10154514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 10164514f5e3Sopenharmony_ci return RTSTUB_ID(CallArg1AndDispatchFromBaseline); 10174514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 10184514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 10194514f5e3Sopenharmony_ci return RTSTUB_ID(CallArgs2AndDispatchFromBaseline); 10204514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 10214514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 10224514f5e3Sopenharmony_ci return RTSTUB_ID(CallArgs3AndDispatchFromBaseline); 10234514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 10244514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArg0AndDispatchFromBaseline); 10254514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 10264514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArg1AndDispatchFromBaseline); 10274514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 10284514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArgs2AndDispatchFromBaseline); 10294514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 10304514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArgs3AndDispatchFromBaseline); 10314514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 10324514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 10334514f5e3Sopenharmony_ci return RTSTUB_ID(CallRangeAndDispatchFromBaseline); 10344514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 10354514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 10364514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisRangeAndDispatchFromBaseline); 10374514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 10384514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 10394514f5e3Sopenharmony_ci return RTSTUB_ID(CallNewAndDispatchFromBaseline); 10404514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 10414514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 10424514f5e3Sopenharmony_ci return RTSTUB_ID(SuperCallAndDispatchFromBaseline); 10434514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 10444514f5e3Sopenharmony_ci return RTSTUB_ID(CallGetter); 10454514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 10464514f5e3Sopenharmony_ci return RTSTUB_ID(CallSetter); 10474514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 10484514f5e3Sopenharmony_ci return RTSTUB_ID(CallContainersArgs2); 10494514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 10504514f5e3Sopenharmony_ci return RTSTUB_ID(CallContainersArgs3); 10514514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 10524514f5e3Sopenharmony_ci return RTSTUB_ID(CallReturnWithArgv); 10534514f5e3Sopenharmony_ci default: 10544514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 10554514f5e3Sopenharmony_ci UNREACHABLE(); 10564514f5e3Sopenharmony_ci } 10574514f5e3Sopenharmony_ci} 10584514f5e3Sopenharmony_ci 10594514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAsmInterpreterWithBaselineCode() 10604514f5e3Sopenharmony_ci{ 10614514f5e3Sopenharmony_ci switch (callArgs_.mode) { 10624514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 10634514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 10644514f5e3Sopenharmony_ci return RTSTUB_ID(CallArg0AndCheckToBaseline); 10654514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 10664514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 10674514f5e3Sopenharmony_ci return RTSTUB_ID(CallArg1AndCheckToBaseline); 10684514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 10694514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 10704514f5e3Sopenharmony_ci return RTSTUB_ID(CallArgs2AndCheckToBaseline); 10714514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 10724514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 10734514f5e3Sopenharmony_ci return RTSTUB_ID(CallArgs3AndCheckToBaseline); 10744514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 10754514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArg0AndCheckToBaseline); 10764514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 10774514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArg1AndCheckToBaseline); 10784514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 10794514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArgs2AndCheckToBaseline); 10804514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 10814514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisArgs3AndCheckToBaseline); 10824514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 10834514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 10844514f5e3Sopenharmony_ci return RTSTUB_ID(CallRangeAndCheckToBaseline); 10854514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 10864514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 10874514f5e3Sopenharmony_ci return RTSTUB_ID(CallThisRangeAndCheckToBaseline); 10884514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 10894514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 10904514f5e3Sopenharmony_ci return RTSTUB_ID(CallNewAndCheckToBaseline); 10914514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 10924514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 10934514f5e3Sopenharmony_ci return RTSTUB_ID(SuperCallAndCheckToBaseline); 10944514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 10954514f5e3Sopenharmony_ci return RTSTUB_ID(CallGetter); 10964514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 10974514f5e3Sopenharmony_ci return RTSTUB_ID(CallSetter); 10984514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 10994514f5e3Sopenharmony_ci return RTSTUB_ID(CallContainersArgs2); 11004514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 11014514f5e3Sopenharmony_ci return RTSTUB_ID(CallContainersArgs3); 11024514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 11034514f5e3Sopenharmony_ci return RTSTUB_ID(CallReturnWithArgv); 11044514f5e3Sopenharmony_ci default: 11054514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 11064514f5e3Sopenharmony_ci UNREACHABLE(); 11074514f5e3Sopenharmony_ci } 11084514f5e3Sopenharmony_ci} 11094514f5e3Sopenharmony_ci 11104514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAsmInterpreterWithoutBaselineCode() 11114514f5e3Sopenharmony_ci{ 11124514f5e3Sopenharmony_ci switch (callArgs_.mode) { 11134514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 11144514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 11154514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallArg0AndDispatch); 11164514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 11174514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 11184514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallArg1AndDispatch); 11194514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 11204514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 11214514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallArgs2AndDispatch); 11224514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 11234514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 11244514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallArgs3AndDispatch); 11254514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 11264514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallThisArg0AndDispatch); 11274514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 11284514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallThisArg1AndDispatch); 11294514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 11304514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallThisArgs2AndDispatch); 11314514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 11324514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallThisArgs3AndDispatch); 11334514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 11344514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 11354514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallRangeAndDispatch); 11364514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 11374514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 11384514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallThisRangeAndDispatch); 11394514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 11404514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 11414514f5e3Sopenharmony_ci return RTSTUB_ID(PushCallNewAndDispatch); 11424514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 11434514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 11444514f5e3Sopenharmony_ci return RTSTUB_ID(PushSuperCallAndDispatch); 11454514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 11464514f5e3Sopenharmony_ci return RTSTUB_ID(CallGetter); 11474514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 11484514f5e3Sopenharmony_ci return RTSTUB_ID(CallSetter); 11494514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 11504514f5e3Sopenharmony_ci return RTSTUB_ID(CallContainersArgs2); 11514514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 11524514f5e3Sopenharmony_ci return RTSTUB_ID(CallContainersArgs3); 11534514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 11544514f5e3Sopenharmony_ci return RTSTUB_ID(CallReturnWithArgv); 11554514f5e3Sopenharmony_ci default: 11564514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 11574514f5e3Sopenharmony_ci UNREACHABLE(); 11584514f5e3Sopenharmony_ci } 11594514f5e3Sopenharmony_ci} 11604514f5e3Sopenharmony_ci 11614514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareArgsForAsmInterpreter() 11624514f5e3Sopenharmony_ci{ 11634514f5e3Sopenharmony_ci std::vector<GateRef> basicArgs = PrepareBasicArgsForAsmInterpreter(); 11644514f5e3Sopenharmony_ci std::vector<GateRef> appendArgs = PrepareAppendArgsForAsmInterpreter(); 11654514f5e3Sopenharmony_ci 11664514f5e3Sopenharmony_ci basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end()); 11674514f5e3Sopenharmony_ci return basicArgs; 11684514f5e3Sopenharmony_ci} 11694514f5e3Sopenharmony_ci 11704514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareBasicArgsForAsmInterpreter() 11714514f5e3Sopenharmony_ci{ 11724514f5e3Sopenharmony_ci switch (callArgs_.mode) { 11734514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 11744514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 11754514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 11764514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 11774514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 11784514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 11794514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 11804514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 11814514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 11824514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 11834514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 11844514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 11854514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 11864514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 11874514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 11884514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 11894514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 11904514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 11914514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 11924514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 11934514f5e3Sopenharmony_ci if (isForBaseline_) { 11944514f5e3Sopenharmony_ci return { glue_, baselineBuiltinFp_, func_, method_, callField_ }; 11954514f5e3Sopenharmony_ci } else { 11964514f5e3Sopenharmony_ci return { glue_, sp_, func_, method_, callField_ }; 11974514f5e3Sopenharmony_ci } 11984514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 11994514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 12004514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 12014514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 12024514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 12034514f5e3Sopenharmony_ci return { glue_, func_, method_, callField_ }; 12044514f5e3Sopenharmony_ci default: 12054514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 12064514f5e3Sopenharmony_ci UNREACHABLE(); 12074514f5e3Sopenharmony_ci } 12084514f5e3Sopenharmony_ci} 12094514f5e3Sopenharmony_ci 12104514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForAsmInterpreter() 12114514f5e3Sopenharmony_ci{ 12124514f5e3Sopenharmony_ci switch (callArgs_.mode) { 12134514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 12144514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 12154514f5e3Sopenharmony_ci return {}; 12164514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 12174514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 12184514f5e3Sopenharmony_ci return { callArgs_.callArgs.arg0 }; 12194514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 12204514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 12214514f5e3Sopenharmony_ci return { 12224514f5e3Sopenharmony_ci callArgs_.callArgs.arg0, 12234514f5e3Sopenharmony_ci callArgs_.callArgs.arg1 12244514f5e3Sopenharmony_ci }; 12254514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 12264514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 12274514f5e3Sopenharmony_ci return { 12284514f5e3Sopenharmony_ci callArgs_.callArgs.arg0, 12294514f5e3Sopenharmony_ci callArgs_.callArgs.arg1, 12304514f5e3Sopenharmony_ci callArgs_.callArgs.arg2 12314514f5e3Sopenharmony_ci }; 12324514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 12334514f5e3Sopenharmony_ci return { callArgs_.callArgsWithThis.thisValue }; 12344514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 12354514f5e3Sopenharmony_ci return { 12364514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 12374514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue 12384514f5e3Sopenharmony_ci }; 12394514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 12404514f5e3Sopenharmony_ci return { 12414514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 12424514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg1, 12434514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue 12444514f5e3Sopenharmony_ci }; 12454514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 12464514f5e3Sopenharmony_ci return { 12474514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 12484514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg1, 12494514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg2, 12504514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue 12514514f5e3Sopenharmony_ci }; 12524514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 12534514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 12544514f5e3Sopenharmony_ci return { 12554514f5e3Sopenharmony_ci callArgs_.callArgv.argc, 12564514f5e3Sopenharmony_ci callArgs_.callArgv.argv 12574514f5e3Sopenharmony_ci }; 12584514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 12594514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 12604514f5e3Sopenharmony_ci return { 12614514f5e3Sopenharmony_ci callArgs_.callArgvWithThis.argc, 12624514f5e3Sopenharmony_ci callArgs_.callArgvWithThis.argv, 12634514f5e3Sopenharmony_ci callArgs_.callArgvWithThis.thisValue 12644514f5e3Sopenharmony_ci }; 12654514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 12664514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 12674514f5e3Sopenharmony_ci return { 12684514f5e3Sopenharmony_ci callArgs_.callConstructorArgs.argc, 12694514f5e3Sopenharmony_ci callArgs_.callConstructorArgs.argv, 12704514f5e3Sopenharmony_ci callArgs_.callConstructorArgs.thisObj 12714514f5e3Sopenharmony_ci }; 12724514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 12734514f5e3Sopenharmony_ci return { callArgs_.callGetterArgs.receiver }; 12744514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 12754514f5e3Sopenharmony_ci return { 12764514f5e3Sopenharmony_ci callArgs_.callSetterArgs.value, 12774514f5e3Sopenharmony_ci callArgs_.callSetterArgs.receiver 12784514f5e3Sopenharmony_ci }; 12794514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 12804514f5e3Sopenharmony_ci return { 12814514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.arg0, 12824514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.arg1, 12834514f5e3Sopenharmony_ci callArgs_.callThisArg2WithReturnArgs.thisValue 12844514f5e3Sopenharmony_ci }; 12854514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 12864514f5e3Sopenharmony_ci return { 12874514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.value, 12884514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.key, 12894514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.thisValue, 12904514f5e3Sopenharmony_ci callArgs_.callThisArg3WithReturnArgs.argHandle 12914514f5e3Sopenharmony_ci }; 12924514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 12934514f5e3Sopenharmony_ci return { 12944514f5e3Sopenharmony_ci callArgs_.callThisArgvWithReturnArgs.argc, 12954514f5e3Sopenharmony_ci callArgs_.callThisArgvWithReturnArgs.argv, 12964514f5e3Sopenharmony_ci callArgs_.callThisArgvWithReturnArgs.thisValue 12974514f5e3Sopenharmony_ci }; 12984514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 12994514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 13004514f5e3Sopenharmony_ci return { 13014514f5e3Sopenharmony_ci callArgs_.superCallArgs.argc, 13024514f5e3Sopenharmony_ci callArgs_.superCallArgs.argv, 13034514f5e3Sopenharmony_ci callArgs_.superCallArgs.thisObj, 13044514f5e3Sopenharmony_ci callArgs_.superCallArgs.newTarget 13054514f5e3Sopenharmony_ci }; 13064514f5e3Sopenharmony_ci default: 13074514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 13084514f5e3Sopenharmony_ci UNREACHABLE(); 13094514f5e3Sopenharmony_ci } 13104514f5e3Sopenharmony_ci} 13114514f5e3Sopenharmony_ci 13124514f5e3Sopenharmony_civoid CallStubBuilder::CallFastBuiltin(Label* notFastBuiltins, Label *exit) 13134514f5e3Sopenharmony_ci{ 13144514f5e3Sopenharmony_ci auto env = GetEnvironment(); 13154514f5e3Sopenharmony_ci Label isFastBuiltins(env); 13164514f5e3Sopenharmony_ci Label supportCall(env); 13174514f5e3Sopenharmony_ci numArgs_ = ZExtInt32ToPtr(actualNumArgs_); 13184514f5e3Sopenharmony_ci GateRef isFastBuiltinsMask = Int64(static_cast<uint64_t>(1) << MethodLiteral::IsFastBuiltinBit::START_BIT); 13194514f5e3Sopenharmony_ci BRANCH(Int64NotEqual(Int64And(callField_, isFastBuiltinsMask), Int64(0)), &isFastBuiltins, notFastBuiltins); 13204514f5e3Sopenharmony_ci Bind(&isFastBuiltins); 13214514f5e3Sopenharmony_ci GateRef builtinId = GetBuiltinId(method_); 13224514f5e3Sopenharmony_ci if (IsCallModeSupportCallBuiltin()) { 13234514f5e3Sopenharmony_ci BRANCH(Int32GreaterThanOrEqual(builtinId, Int32(kungfu::BuiltinsStubCSigns::BUILTINS_CONSTRUCTOR_STUB_FIRST)), 13244514f5e3Sopenharmony_ci notFastBuiltins, &supportCall); 13254514f5e3Sopenharmony_ci Bind(&supportCall); 13264514f5e3Sopenharmony_ci } 13274514f5e3Sopenharmony_ci { 13284514f5e3Sopenharmony_ci GateRef ret; 13294514f5e3Sopenharmony_ci switch (callArgs_.mode) { 13304514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 13314514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 13324514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 13334514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 13344514f5e3Sopenharmony_ci ret = DispatchBuiltins(glue_, builtinId, PrepareArgsForFastBuiltin()); 13354514f5e3Sopenharmony_ci break; 13364514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 13374514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 13384514f5e3Sopenharmony_ci ret = DispatchBuiltinsWithArgv(glue_, builtinId, PrepareArgsForFastBuiltin()); 13394514f5e3Sopenharmony_ci break; 13404514f5e3Sopenharmony_ci default: 13414514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 13424514f5e3Sopenharmony_ci UNREACHABLE(); 13434514f5e3Sopenharmony_ci } 13444514f5e3Sopenharmony_ci result_->WriteVariable(ret); 13454514f5e3Sopenharmony_ci Jump(exit); 13464514f5e3Sopenharmony_ci } 13474514f5e3Sopenharmony_ci} 13484514f5e3Sopenharmony_ci 13494514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareBasicArgsForFastBuiltin() 13504514f5e3Sopenharmony_ci{ 13514514f5e3Sopenharmony_ci return { glue_, nativeCode_, func_ }; 13524514f5e3Sopenharmony_ci} 13534514f5e3Sopenharmony_ci 13544514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForFastBuiltin() 13554514f5e3Sopenharmony_ci{ 13564514f5e3Sopenharmony_ci switch (callArgs_.mode) { 13574514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 13584514f5e3Sopenharmony_ci return { Undefined(), 13594514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, numArgs_, Undefined(), Undefined(), Undefined() 13604514f5e3Sopenharmony_ci }; 13614514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 13624514f5e3Sopenharmony_ci return { Undefined(), 13634514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, numArgs_, 13644514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, Undefined(), Undefined() 13654514f5e3Sopenharmony_ci }; 13664514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 13674514f5e3Sopenharmony_ci return { Undefined(), 13684514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, numArgs_, 13694514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 13704514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg1, Undefined() 13714514f5e3Sopenharmony_ci }; 13724514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 13734514f5e3Sopenharmony_ci return { Undefined(), 13744514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.thisValue, numArgs_, 13754514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg0, 13764514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg1, 13774514f5e3Sopenharmony_ci callArgs_.callArgsWithThis.arg2 13784514f5e3Sopenharmony_ci }; 13794514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 13804514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 13814514f5e3Sopenharmony_ci return { func_, thisValue_, numArgs_, 13824514f5e3Sopenharmony_ci callArgs_.callConstructorArgs.argv 13834514f5e3Sopenharmony_ci }; 13844514f5e3Sopenharmony_ci default: 13854514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 13864514f5e3Sopenharmony_ci UNREACHABLE(); 13874514f5e3Sopenharmony_ci } 13884514f5e3Sopenharmony_ci} 13894514f5e3Sopenharmony_ci 13904514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareArgsForFastBuiltin() 13914514f5e3Sopenharmony_ci{ 13924514f5e3Sopenharmony_ci std::vector<GateRef> basicArgs = PrepareBasicArgsForFastBuiltin(); 13934514f5e3Sopenharmony_ci std::vector<GateRef> appendArgs = PrepareAppendArgsForFastBuiltin(); 13944514f5e3Sopenharmony_ci 13954514f5e3Sopenharmony_ci basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end()); 13964514f5e3Sopenharmony_ci return basicArgs; 13974514f5e3Sopenharmony_ci} 13984514f5e3Sopenharmony_ci 13994514f5e3Sopenharmony_cibool CallStubBuilder::IsCallModeSupportPGO() const 14004514f5e3Sopenharmony_ci{ 14014514f5e3Sopenharmony_ci switch (callArgs_.mode) { 14024514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG0: 14034514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG1: 14044514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG2: 14054514f5e3Sopenharmony_ci case JSCallMode::CALL_ARG3: 14064514f5e3Sopenharmony_ci case JSCallMode::CALL_WITH_ARGV: 14074514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 14084514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 14094514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 14104514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 14114514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_WITH_ARGV: 14124514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 14134514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_WITH_ARGV: 14144514f5e3Sopenharmony_ci case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV: 14154514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 14164514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 14174514f5e3Sopenharmony_ci return true; 14184514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG0: 14194514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG1: 14204514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG2: 14214514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_ARG3: 14224514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_WITH_ARGV: 14234514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV: 14244514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 14254514f5e3Sopenharmony_ci case JSCallMode::CALL_ENTRY: 14264514f5e3Sopenharmony_ci case JSCallMode::CALL_FROM_AOT: 14274514f5e3Sopenharmony_ci case JSCallMode::CALL_GENERATOR: 14284514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 14294514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 14304514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 14314514f5e3Sopenharmony_ci return false; 14324514f5e3Sopenharmony_ci default: 14334514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 14344514f5e3Sopenharmony_ci UNREACHABLE(); 14354514f5e3Sopenharmony_ci } 14364514f5e3Sopenharmony_ci} 14374514f5e3Sopenharmony_ci 14384514f5e3Sopenharmony_cibool CallStubBuilder::IsCallModeSupportCallBuiltin() const 14394514f5e3Sopenharmony_ci{ 14404514f5e3Sopenharmony_ci switch (callArgs_.mode) { 14414514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG0: 14424514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG1: 14434514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2: 14444514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3: 14454514f5e3Sopenharmony_ci return true; 14464514f5e3Sopenharmony_ci case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV: 14474514f5e3Sopenharmony_ci case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV: 14484514f5e3Sopenharmony_ci return false; 14494514f5e3Sopenharmony_ci default: 14504514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "this branch is unreachable"; 14514514f5e3Sopenharmony_ci UNREACHABLE(); 14524514f5e3Sopenharmony_ci } 14534514f5e3Sopenharmony_ci} 14544514f5e3Sopenharmony_ci 14554514f5e3Sopenharmony_cibool CallStubBuilder::CheckResultValueChangedWithReturn(GateRef prevResRef) const 14564514f5e3Sopenharmony_ci{ 14574514f5e3Sopenharmony_ci switch (callArgs_.mode) { 14584514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 14594514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 14604514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG2_WITH_RETURN: 14614514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARG3_WITH_RETURN: 14624514f5e3Sopenharmony_ci case JSCallMode::CALL_THIS_ARGV_WITH_RETURN: 14634514f5e3Sopenharmony_ci return result_->Value() == prevResRef; 14644514f5e3Sopenharmony_ci default: 14654514f5e3Sopenharmony_ci return result_->Value() != prevResRef; 14664514f5e3Sopenharmony_ci } 14674514f5e3Sopenharmony_ci} 14684514f5e3Sopenharmony_ci 14694514f5e3Sopenharmony_cibool CallStubBuilder::IsSlowAotCall() const 14704514f5e3Sopenharmony_ci{ return !isFast_ && !isBridge_; } 14714514f5e3Sopenharmony_ci 14724514f5e3Sopenharmony_cibool CallStubBuilder::IsFastAotCall() const 14734514f5e3Sopenharmony_ci{ return isFast_ && !isBridge_; } 14744514f5e3Sopenharmony_ci 14754514f5e3Sopenharmony_cibool CallStubBuilder::IsSlowAotCallWithBridge() const 14764514f5e3Sopenharmony_ci{ return !isFast_ && isBridge_; } 14774514f5e3Sopenharmony_ci 14784514f5e3Sopenharmony_cibool CallStubBuilder::IsFastAotCallWithBridge() const 14794514f5e3Sopenharmony_ci{ return isFast_ && isBridge_; } 14804514f5e3Sopenharmony_ci 14814514f5e3Sopenharmony_civoid CallStubBuilder::HandleProfileCall() 14824514f5e3Sopenharmony_ci{ 14834514f5e3Sopenharmony_ci if (!callback_.IsEmpty()) { 14844514f5e3Sopenharmony_ci if (!IsCallModeSupportPGO()) { 14854514f5e3Sopenharmony_ci return; 14864514f5e3Sopenharmony_ci } 14874514f5e3Sopenharmony_ci if (IsCallModeGetterSetter()) { 14884514f5e3Sopenharmony_ci callback_.ProfileGetterSetterCall(func_); 14894514f5e3Sopenharmony_ci return; 14904514f5e3Sopenharmony_ci } 14914514f5e3Sopenharmony_ci callback_.ProfileCall(func_); 14924514f5e3Sopenharmony_ci } 14934514f5e3Sopenharmony_ci} 14944514f5e3Sopenharmony_ci 14954514f5e3Sopenharmony_civoid CallStubBuilder::HandleProfileNativeCall() 14964514f5e3Sopenharmony_ci{ 14974514f5e3Sopenharmony_ci if (!callback_.IsEmpty()) { 14984514f5e3Sopenharmony_ci if (!IsCallModeSupportPGO()) { 14994514f5e3Sopenharmony_ci return; 15004514f5e3Sopenharmony_ci } 15014514f5e3Sopenharmony_ci if (!IsCallModeGetterSetter()) { 15024514f5e3Sopenharmony_ci callback_.ProfileNativeCall(func_); 15034514f5e3Sopenharmony_ci } 15044514f5e3Sopenharmony_ci } 15054514f5e3Sopenharmony_ci} 15064514f5e3Sopenharmony_ci 15074514f5e3Sopenharmony_cibool CallStubBuilder::IsCallModeGetterSetter() 15084514f5e3Sopenharmony_ci{ 15094514f5e3Sopenharmony_ci switch (callArgs_.mode) { 15104514f5e3Sopenharmony_ci case JSCallMode::CALL_GETTER: 15114514f5e3Sopenharmony_ci case JSCallMode::CALL_SETTER: 15124514f5e3Sopenharmony_ci return true; 15134514f5e3Sopenharmony_ci default: 15144514f5e3Sopenharmony_ci return false; 15154514f5e3Sopenharmony_ci } 15164514f5e3Sopenharmony_ci} 15174514f5e3Sopenharmony_ci 15184514f5e3Sopenharmony_ci} // panda::ecmascript::kungfu 1519