14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_COMPILER_CALL_SIGNATURE_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_CALL_SIGNATURE_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <array>
204514f5e3Sopenharmony_ci#include <functional>
214514f5e3Sopenharmony_ci#include <memory>
224514f5e3Sopenharmony_ci
234514f5e3Sopenharmony_ci#include "ecmascript/compiler/variable_type.h"
244514f5e3Sopenharmony_ci
254514f5e3Sopenharmony_ci#include "libpandabase/macros.h"
264514f5e3Sopenharmony_ci#include "libpandabase/utils/bit_field.h"
274514f5e3Sopenharmony_ci
284514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu {
294514f5e3Sopenharmony_ciclass Circuit;
304514f5e3Sopenharmony_ci
314514f5e3Sopenharmony_cienum class ArgumentsOrder {
324514f5e3Sopenharmony_ci    DEFAULT_ORDER,  // Push Arguments in stack from right -> left
334514f5e3Sopenharmony_ci};
344514f5e3Sopenharmony_ci
354514f5e3Sopenharmony_ciclass CallSignature {
364514f5e3Sopenharmony_cipublic:
374514f5e3Sopenharmony_ci    using TargetConstructor = std::function<void *(void *)>;
384514f5e3Sopenharmony_ci    enum class TargetKind : uint8_t {
394514f5e3Sopenharmony_ci        COMMON_STUB = 0,
404514f5e3Sopenharmony_ci        RUNTIME_STUB,
414514f5e3Sopenharmony_ci        RUNTIME_STUB_VARARGS,
424514f5e3Sopenharmony_ci        RUNTIME_STUB_NO_GC,
434514f5e3Sopenharmony_ci        ASM_CALL_BARRIER_STUB,
444514f5e3Sopenharmony_ci        OPTIMIZED_STUB,
454514f5e3Sopenharmony_ci        OPTIMIZED_FAST_CALL_STUB,
464514f5e3Sopenharmony_ci        DEOPT_STUB,
474514f5e3Sopenharmony_ci        BYTECODE_HANDLER,
484514f5e3Sopenharmony_ci        BYTECODE_DEBUGGER_HANDLER,
494514f5e3Sopenharmony_ci        BYTECODE_HELPER_HANDLER,
504514f5e3Sopenharmony_ci        BYTECODE_PROFILE_HANDLER,
514514f5e3Sopenharmony_ci        BYTECODE_JIT_PROFILE_HANDLER,
524514f5e3Sopenharmony_ci        JSFUNCTION,
534514f5e3Sopenharmony_ci        BUILTINS_STUB,
544514f5e3Sopenharmony_ci        BUILTINS_WITH_ARGV_STUB,
554514f5e3Sopenharmony_ci        BASELINE_STUB,
564514f5e3Sopenharmony_ci
574514f5e3Sopenharmony_ci        STUB_BEGIN = COMMON_STUB,
584514f5e3Sopenharmony_ci        STUB_END = BYTECODE_HANDLER,
594514f5e3Sopenharmony_ci        BCHANDLER_BEGIN = BYTECODE_HANDLER,
604514f5e3Sopenharmony_ci        BCHANDLER_END = JSFUNCTION
614514f5e3Sopenharmony_ci    };
624514f5e3Sopenharmony_ci    enum class CallConv: uint8_t {
634514f5e3Sopenharmony_ci        CCallConv = 0,
644514f5e3Sopenharmony_ci        GHCCallConv = 1,
654514f5e3Sopenharmony_ci        WebKitJSCallConv = 2,
664514f5e3Sopenharmony_ci    };
674514f5e3Sopenharmony_ci    // ParamAttr only works for LLVM backend.
684514f5e3Sopenharmony_ci    enum class ParamAttr: uint8_t {
694514f5e3Sopenharmony_ci        NoAttr = 0,
704514f5e3Sopenharmony_ci        Dead
714514f5e3Sopenharmony_ci    };
724514f5e3Sopenharmony_ci    static constexpr size_t TARGET_KIND_BIT_LENGTH = 5;
734514f5e3Sopenharmony_ci    static constexpr size_t CALL_CONV_BIT_LENGTH = 2;
744514f5e3Sopenharmony_ci    using TargetKindBit = panda::BitField<TargetKind, 0, TARGET_KIND_BIT_LENGTH>;
754514f5e3Sopenharmony_ci    using CallConvBit = TargetKindBit::NextField<CallConv, CALL_CONV_BIT_LENGTH>;
764514f5e3Sopenharmony_ci    using VariadicArgsBit = CallConvBit::NextField<bool, 1>;
774514f5e3Sopenharmony_ci    using TailCallBit = VariadicArgsBit::NextField<bool, 1>;
784514f5e3Sopenharmony_ci    using GCLeafFunctionBit = TailCallBit::NextField<bool, 1>;
794514f5e3Sopenharmony_ci
804514f5e3Sopenharmony_ci    CallSignature(std::string name, int flags, size_t paramCounter, ArgumentsOrder order,
814514f5e3Sopenharmony_ci                  VariableType returnType)
824514f5e3Sopenharmony_ci        : name_(name), paramCounter_(paramCounter), order_(order), returnType_(returnType)
834514f5e3Sopenharmony_ci    {
844514f5e3Sopenharmony_ci        SetTargetKind(TargetKind::COMMON_STUB);
854514f5e3Sopenharmony_ci        SetCallConv(CallSignature::CallConv::CCallConv);
864514f5e3Sopenharmony_ci        SetTailCall(false);
874514f5e3Sopenharmony_ci        SetGCLeafFunction(false);
884514f5e3Sopenharmony_ci        SetVariadicArgs(flags);
894514f5e3Sopenharmony_ci    }
904514f5e3Sopenharmony_ci
914514f5e3Sopenharmony_ci    CallSignature(std::string name, int flags, ArgumentsOrder order, VariableType returnType,
924514f5e3Sopenharmony_ci                  std::initializer_list<VariableType> params)
934514f5e3Sopenharmony_ci        : CallSignature(std::move(name), flags, params.size(), order, returnType)
944514f5e3Sopenharmony_ci    {
954514f5e3Sopenharmony_ci        paramsType_ = std::make_unique<std::vector<VariableType>>(params);
964514f5e3Sopenharmony_ci    }
974514f5e3Sopenharmony_ci
984514f5e3Sopenharmony_ci    CallSignature() = default;
994514f5e3Sopenharmony_ci
1004514f5e3Sopenharmony_ci    ~CallSignature() = default;
1014514f5e3Sopenharmony_ci
1024514f5e3Sopenharmony_ci    CallSignature(CallSignature const &other)
1034514f5e3Sopenharmony_ci    {
1044514f5e3Sopenharmony_ci        name_ = other.name_;
1054514f5e3Sopenharmony_ci        paramCounter_ = other.paramCounter_;
1064514f5e3Sopenharmony_ci        order_ = other.order_;
1074514f5e3Sopenharmony_ci        id_ = other.id_;
1084514f5e3Sopenharmony_ci        returnType_ = other.returnType_;
1094514f5e3Sopenharmony_ci        constructor_ = other.constructor_;
1104514f5e3Sopenharmony_ci        if (paramCounter_ > 0 && other.paramsType_ != nullptr) {
1114514f5e3Sopenharmony_ci            paramsType_ = std::make_unique<std::vector<VariableType>>(paramCounter_);
1124514f5e3Sopenharmony_ci            for (size_t i = 0; i < paramCounter_; i++) {
1134514f5e3Sopenharmony_ci                (*paramsType_)[i] = other.GetParametersType()[i];
1144514f5e3Sopenharmony_ci            }
1154514f5e3Sopenharmony_ci        }
1164514f5e3Sopenharmony_ci        kind_ = other.kind_;
1174514f5e3Sopenharmony_ci    }
1184514f5e3Sopenharmony_ci
1194514f5e3Sopenharmony_ci    CallSignature &operator=(CallSignature const &other)
1204514f5e3Sopenharmony_ci    {
1214514f5e3Sopenharmony_ci        name_ = other.name_;
1224514f5e3Sopenharmony_ci        paramCounter_ = other.paramCounter_;
1234514f5e3Sopenharmony_ci        order_ = other.order_;
1244514f5e3Sopenharmony_ci        id_ = other.id_;
1254514f5e3Sopenharmony_ci        returnType_ = other.returnType_;
1264514f5e3Sopenharmony_ci        constructor_ = other.constructor_;
1274514f5e3Sopenharmony_ci        if (paramCounter_ > 0 && other.paramsType_ != nullptr) {
1284514f5e3Sopenharmony_ci            paramsType_ = std::make_unique<std::vector<VariableType>>(paramCounter_);
1294514f5e3Sopenharmony_ci            for (size_t i = 0; i < paramCounter_; i++) {
1304514f5e3Sopenharmony_ci                (*paramsType_)[i] = other.GetParametersType()[i];
1314514f5e3Sopenharmony_ci            }
1324514f5e3Sopenharmony_ci        }
1334514f5e3Sopenharmony_ci        kind_ = other.kind_;
1344514f5e3Sopenharmony_ci        return *this;
1354514f5e3Sopenharmony_ci    }
1364514f5e3Sopenharmony_ci
1374514f5e3Sopenharmony_ci    bool IsCommonStub() const
1384514f5e3Sopenharmony_ci    {
1394514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::COMMON_STUB);
1404514f5e3Sopenharmony_ci    }
1414514f5e3Sopenharmony_ci
1424514f5e3Sopenharmony_ci    bool IsRuntimeVAStub() const
1434514f5e3Sopenharmony_ci    {
1444514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::RUNTIME_STUB_VARARGS);
1454514f5e3Sopenharmony_ci    }
1464514f5e3Sopenharmony_ci
1474514f5e3Sopenharmony_ci    bool IsRuntimeStub() const
1484514f5e3Sopenharmony_ci    {
1494514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::RUNTIME_STUB);
1504514f5e3Sopenharmony_ci    }
1514514f5e3Sopenharmony_ci
1524514f5e3Sopenharmony_ci    bool IsASMCallBarrierStub() const
1534514f5e3Sopenharmony_ci    {
1544514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::ASM_CALL_BARRIER_STUB);
1554514f5e3Sopenharmony_ci    }
1564514f5e3Sopenharmony_ci
1574514f5e3Sopenharmony_ci    bool IsRuntimeNGCStub() const
1584514f5e3Sopenharmony_ci    {
1594514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::RUNTIME_STUB_NO_GC);
1604514f5e3Sopenharmony_ci    }
1614514f5e3Sopenharmony_ci
1624514f5e3Sopenharmony_ci    bool IsOptimizedStub() const
1634514f5e3Sopenharmony_ci    {
1644514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::OPTIMIZED_STUB);
1654514f5e3Sopenharmony_ci    }
1664514f5e3Sopenharmony_ci
1674514f5e3Sopenharmony_ci    bool IsOptimizedFastCallStub() const
1684514f5e3Sopenharmony_ci    {
1694514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::OPTIMIZED_FAST_CALL_STUB);
1704514f5e3Sopenharmony_ci    }
1714514f5e3Sopenharmony_ci
1724514f5e3Sopenharmony_ci    bool IsBCDebuggerStub() const
1734514f5e3Sopenharmony_ci    {
1744514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::BYTECODE_DEBUGGER_HANDLER);
1754514f5e3Sopenharmony_ci    }
1764514f5e3Sopenharmony_ci
1774514f5e3Sopenharmony_ci    bool IsStub() const
1784514f5e3Sopenharmony_ci    {
1794514f5e3Sopenharmony_ci        TargetKind targetKind = GetTargetKind();
1804514f5e3Sopenharmony_ci        return TargetKind::STUB_BEGIN <= targetKind && targetKind < TargetKind::STUB_END;
1814514f5e3Sopenharmony_ci    }
1824514f5e3Sopenharmony_ci
1834514f5e3Sopenharmony_ci    bool IsBCStub() const
1844514f5e3Sopenharmony_ci    {
1854514f5e3Sopenharmony_ci        TargetKind targetKind = GetTargetKind();
1864514f5e3Sopenharmony_ci        return TargetKind::BCHANDLER_BEGIN <= targetKind && targetKind < TargetKind::BCHANDLER_END;
1874514f5e3Sopenharmony_ci    }
1884514f5e3Sopenharmony_ci
1894514f5e3Sopenharmony_ci    bool IsBuiltinsStub() const
1904514f5e3Sopenharmony_ci    {
1914514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::BUILTINS_STUB);
1924514f5e3Sopenharmony_ci    }
1934514f5e3Sopenharmony_ci
1944514f5e3Sopenharmony_ci    bool IsBuiltinsWithArgvStub() const
1954514f5e3Sopenharmony_ci    {
1964514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::BUILTINS_WITH_ARGV_STUB);
1974514f5e3Sopenharmony_ci    }
1984514f5e3Sopenharmony_ci
1994514f5e3Sopenharmony_ci    bool IsBCHandlerStub() const
2004514f5e3Sopenharmony_ci    {
2014514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::BYTECODE_HANDLER);
2024514f5e3Sopenharmony_ci    }
2034514f5e3Sopenharmony_ci
2044514f5e3Sopenharmony_ci    bool IsDeoptStub() const
2054514f5e3Sopenharmony_ci    {
2064514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::DEOPT_STUB);
2074514f5e3Sopenharmony_ci    }
2084514f5e3Sopenharmony_ci
2094514f5e3Sopenharmony_ci    bool IsBaselineStub() const
2104514f5e3Sopenharmony_ci    {
2114514f5e3Sopenharmony_ci        return (GetTargetKind() == TargetKind::BASELINE_STUB);
2124514f5e3Sopenharmony_ci    }
2134514f5e3Sopenharmony_ci
2144514f5e3Sopenharmony_ci    void SetParameters(VariableType *paramsType)
2154514f5e3Sopenharmony_ci    {
2164514f5e3Sopenharmony_ci        if (paramCounter_ > 0 && paramsType_ == nullptr) {
2174514f5e3Sopenharmony_ci            paramsType_ = std::make_unique<std::vector<VariableType>>(paramCounter_);
2184514f5e3Sopenharmony_ci            for (size_t i = 0; i < paramCounter_; i++) {
2194514f5e3Sopenharmony_ci                (*paramsType_)[i] = paramsType[i];
2204514f5e3Sopenharmony_ci            }
2214514f5e3Sopenharmony_ci        }
2224514f5e3Sopenharmony_ci    }
2234514f5e3Sopenharmony_ci
2244514f5e3Sopenharmony_ci    VariableType *GetParametersType() const
2254514f5e3Sopenharmony_ci    {
2264514f5e3Sopenharmony_ci        if (paramsType_ != nullptr) {
2274514f5e3Sopenharmony_ci            return paramsType_->data();
2284514f5e3Sopenharmony_ci        } else {
2294514f5e3Sopenharmony_ci            return nullptr;
2304514f5e3Sopenharmony_ci        }
2314514f5e3Sopenharmony_ci    }
2324514f5e3Sopenharmony_ci
2334514f5e3Sopenharmony_ci    void SetParamAttr(std::vector<ParamAttr> &&paramAttr)
2344514f5e3Sopenharmony_ci    {
2354514f5e3Sopenharmony_ci        if (paramCounter_ > 0 && paramsAttr_ == nullptr) {
2364514f5e3Sopenharmony_ci            paramsAttr_ = std::make_unique<std::vector<ParamAttr>>(paramAttr);
2374514f5e3Sopenharmony_ci        }
2384514f5e3Sopenharmony_ci    }
2394514f5e3Sopenharmony_ci
2404514f5e3Sopenharmony_ci    std::vector<ParamAttr> *GetParamAttr() const
2414514f5e3Sopenharmony_ci    {
2424514f5e3Sopenharmony_ci        if (paramsAttr_ != nullptr) {
2434514f5e3Sopenharmony_ci            return paramsAttr_.get();
2444514f5e3Sopenharmony_ci        } else {
2454514f5e3Sopenharmony_ci            return nullptr;
2464514f5e3Sopenharmony_ci        }
2474514f5e3Sopenharmony_ci    }
2484514f5e3Sopenharmony_ci
2494514f5e3Sopenharmony_ci    size_t GetParametersCount() const
2504514f5e3Sopenharmony_ci    {
2514514f5e3Sopenharmony_ci        return paramCounter_;
2524514f5e3Sopenharmony_ci    }
2534514f5e3Sopenharmony_ci
2544514f5e3Sopenharmony_ci    VariableType GetReturnType() const
2554514f5e3Sopenharmony_ci    {
2564514f5e3Sopenharmony_ci        return returnType_;
2574514f5e3Sopenharmony_ci    }
2584514f5e3Sopenharmony_ci
2594514f5e3Sopenharmony_ci    ArgumentsOrder GetArgumentsOrder() const
2604514f5e3Sopenharmony_ci    {
2614514f5e3Sopenharmony_ci        return order_;
2624514f5e3Sopenharmony_ci    }
2634514f5e3Sopenharmony_ci
2644514f5e3Sopenharmony_ci    bool IsVariadicArgs() const
2654514f5e3Sopenharmony_ci    {
2664514f5e3Sopenharmony_ci        return VariadicArgsBit::Decode(kind_);
2674514f5e3Sopenharmony_ci    }
2684514f5e3Sopenharmony_ci
2694514f5e3Sopenharmony_ci    void SetVariadicArgs(bool variable)
2704514f5e3Sopenharmony_ci    {
2714514f5e3Sopenharmony_ci        VariadicArgsBit::Set<uint64_t>(variable, &kind_);
2724514f5e3Sopenharmony_ci    }
2734514f5e3Sopenharmony_ci
2744514f5e3Sopenharmony_ci    void SetTailCall(bool tailCall)
2754514f5e3Sopenharmony_ci    {
2764514f5e3Sopenharmony_ci        TailCallBit::Set<uint64_t>(tailCall, &kind_);
2774514f5e3Sopenharmony_ci    }
2784514f5e3Sopenharmony_ci
2794514f5e3Sopenharmony_ci    bool GetTailCall() const
2804514f5e3Sopenharmony_ci    {
2814514f5e3Sopenharmony_ci        return TailCallBit::Decode(kind_);
2824514f5e3Sopenharmony_ci    }
2834514f5e3Sopenharmony_ci
2844514f5e3Sopenharmony_ci    void SetGCLeafFunction(bool value)
2854514f5e3Sopenharmony_ci    {
2864514f5e3Sopenharmony_ci        GCLeafFunctionBit::Set<uint64_t>(value, &kind_);
2874514f5e3Sopenharmony_ci    }
2884514f5e3Sopenharmony_ci
2894514f5e3Sopenharmony_ci    bool GetGCLeafFunction() const
2904514f5e3Sopenharmony_ci    {
2914514f5e3Sopenharmony_ci        return GCLeafFunctionBit::Decode(kind_);
2924514f5e3Sopenharmony_ci    }
2934514f5e3Sopenharmony_ci
2944514f5e3Sopenharmony_ci    TargetKind GetTargetKind() const
2954514f5e3Sopenharmony_ci    {
2964514f5e3Sopenharmony_ci        return TargetKindBit::Decode(kind_);
2974514f5e3Sopenharmony_ci    }
2984514f5e3Sopenharmony_ci
2994514f5e3Sopenharmony_ci    void SetTargetKind(TargetKind kind)
3004514f5e3Sopenharmony_ci    {
3014514f5e3Sopenharmony_ci        TargetKindBit::Set<uint64_t>(kind, &kind_);
3024514f5e3Sopenharmony_ci    }
3034514f5e3Sopenharmony_ci
3044514f5e3Sopenharmony_ci    CallConv GetCallConv() const
3054514f5e3Sopenharmony_ci    {
3064514f5e3Sopenharmony_ci        return CallConvBit::Decode(kind_);
3074514f5e3Sopenharmony_ci    }
3084514f5e3Sopenharmony_ci
3094514f5e3Sopenharmony_ci    void SetCallConv(CallConv cc)
3104514f5e3Sopenharmony_ci    {
3114514f5e3Sopenharmony_ci        CallConvBit::Set<uint64_t>(cc, &kind_);
3124514f5e3Sopenharmony_ci    }
3134514f5e3Sopenharmony_ci
3144514f5e3Sopenharmony_ci    const std::string &GetName() const
3154514f5e3Sopenharmony_ci    {
3164514f5e3Sopenharmony_ci        return name_;
3174514f5e3Sopenharmony_ci    }
3184514f5e3Sopenharmony_ci
3194514f5e3Sopenharmony_ci    void SetName(const std::string &str)
3204514f5e3Sopenharmony_ci    {
3214514f5e3Sopenharmony_ci        name_ = str;
3224514f5e3Sopenharmony_ci    }
3234514f5e3Sopenharmony_ci
3244514f5e3Sopenharmony_ci    void SetConstructor(TargetConstructor ctor)
3254514f5e3Sopenharmony_ci    {
3264514f5e3Sopenharmony_ci        constructor_ = ctor;
3274514f5e3Sopenharmony_ci    }
3284514f5e3Sopenharmony_ci
3294514f5e3Sopenharmony_ci    TargetConstructor GetConstructor() const
3304514f5e3Sopenharmony_ci    {
3314514f5e3Sopenharmony_ci        return constructor_;
3324514f5e3Sopenharmony_ci    }
3334514f5e3Sopenharmony_ci
3344514f5e3Sopenharmony_ci    bool HasConstructor() const
3354514f5e3Sopenharmony_ci    {
3364514f5e3Sopenharmony_ci        return constructor_ != nullptr;
3374514f5e3Sopenharmony_ci    }
3384514f5e3Sopenharmony_ci
3394514f5e3Sopenharmony_ci    int GetID() const
3404514f5e3Sopenharmony_ci    {
3414514f5e3Sopenharmony_ci        return id_;
3424514f5e3Sopenharmony_ci    }
3434514f5e3Sopenharmony_ci
3444514f5e3Sopenharmony_ci    void SetID(int id)
3454514f5e3Sopenharmony_ci    {
3464514f5e3Sopenharmony_ci        id_ = id;
3474514f5e3Sopenharmony_ci    }
3484514f5e3Sopenharmony_ci
3494514f5e3Sopenharmony_ciprivate:
3504514f5e3Sopenharmony_ci    std::string name_;
3514514f5e3Sopenharmony_ci    size_t paramCounter_ {0};
3524514f5e3Sopenharmony_ci    int id_ {-1};
3534514f5e3Sopenharmony_ci    ArgumentsOrder order_ {ArgumentsOrder::DEFAULT_ORDER};
3544514f5e3Sopenharmony_ci    VariableType returnType_ {VariableType::VOID()};
3554514f5e3Sopenharmony_ci    std::unique_ptr<std::vector<VariableType>> paramsType_ {nullptr};
3564514f5e3Sopenharmony_ci    std::unique_ptr<std::vector<ParamAttr>> paramsAttr_ {nullptr};
3574514f5e3Sopenharmony_ci    TargetConstructor constructor_ {nullptr};
3584514f5e3Sopenharmony_ci    uint64_t kind_ {0};
3594514f5e3Sopenharmony_ci};
3604514f5e3Sopenharmony_ci
3614514f5e3Sopenharmony_ci#define EXPLICIT_CALL_SIGNATURE_LIST(V)         \
3624514f5e3Sopenharmony_ci    V(Add)                                      \
3634514f5e3Sopenharmony_ci    V(Sub)                                      \
3644514f5e3Sopenharmony_ci    V(Mul)                                      \
3654514f5e3Sopenharmony_ci    V(MulGCTest)                                \
3664514f5e3Sopenharmony_ci    V(Div)                                      \
3674514f5e3Sopenharmony_ci    V(Mod)                                      \
3684514f5e3Sopenharmony_ci    V(TypeOf)                                   \
3694514f5e3Sopenharmony_ci    V(Equal)                                    \
3704514f5e3Sopenharmony_ci    V(NotEqual)                                 \
3714514f5e3Sopenharmony_ci    V(StrictEqual)                              \
3724514f5e3Sopenharmony_ci    V(StrictNotEqual)                           \
3734514f5e3Sopenharmony_ci    V(Less)                                     \
3744514f5e3Sopenharmony_ci    V(LessEq)                                   \
3754514f5e3Sopenharmony_ci    V(Greater)                                  \
3764514f5e3Sopenharmony_ci    V(GreaterEq)                                \
3774514f5e3Sopenharmony_ci    V(Shl)                                      \
3784514f5e3Sopenharmony_ci    V(Shr)                                      \
3794514f5e3Sopenharmony_ci    V(Ashr)                                     \
3804514f5e3Sopenharmony_ci    V(And)                                      \
3814514f5e3Sopenharmony_ci    V(Or)                                       \
3824514f5e3Sopenharmony_ci    V(Xor)                                      \
3834514f5e3Sopenharmony_ci    V(Instanceof)                               \
3844514f5e3Sopenharmony_ci    V(Inc)                                      \
3854514f5e3Sopenharmony_ci    V(Dec)                                      \
3864514f5e3Sopenharmony_ci    V(Neg)                                      \
3874514f5e3Sopenharmony_ci    V(Not)                                      \
3884514f5e3Sopenharmony_ci    V(ToBooleanTrue)                            \
3894514f5e3Sopenharmony_ci    V(ToBooleanFalse)                           \
3904514f5e3Sopenharmony_ci    V(SetPropertyByName)                        \
3914514f5e3Sopenharmony_ci    V(DeprecatedSetPropertyByName)              \
3924514f5e3Sopenharmony_ci    V(SetPropertyByNameWithOwn)                 \
3934514f5e3Sopenharmony_ci    V(SetPropertyByValue)                       \
3944514f5e3Sopenharmony_ci    V(DeprecatedSetPropertyByValue)             \
3954514f5e3Sopenharmony_ci    V(TryLdGlobalByName)                        \
3964514f5e3Sopenharmony_ci    V(TryStGlobalByName)                        \
3974514f5e3Sopenharmony_ci    V(LdGlobalVar)                              \
3984514f5e3Sopenharmony_ci    V(StGlobalVar)                              \
3994514f5e3Sopenharmony_ci    V(StOwnByIndex)                             \
4004514f5e3Sopenharmony_ci    V(StOwnByValue)                             \
4014514f5e3Sopenharmony_ci    V(StOwnByName)                              \
4024514f5e3Sopenharmony_ci    V(StOwnByValueWithNameSet)                  \
4034514f5e3Sopenharmony_ci    V(StOwnByNameWithNameSet)                   \
4044514f5e3Sopenharmony_ci    V(StObjByIndex)                             \
4054514f5e3Sopenharmony_ci    V(LdObjByIndex)                             \
4064514f5e3Sopenharmony_ci    V(SetPropertyByValueWithOwn)                \
4074514f5e3Sopenharmony_ci    V(GetPropertyByName)                        \
4084514f5e3Sopenharmony_ci    V(DeprecatedGetPropertyByName)              \
4094514f5e3Sopenharmony_ci    V(GetPropertyByIndex)                       \
4104514f5e3Sopenharmony_ci    V(SetPropertyByIndex)                       \
4114514f5e3Sopenharmony_ci    V(SetPropertyByIndexWithOwn)                \
4124514f5e3Sopenharmony_ci    V(GetPropertyByValue)                       \
4134514f5e3Sopenharmony_ci    V(DeprecatedGetPropertyByValue)             \
4144514f5e3Sopenharmony_ci    V(TryLoadICByName)                          \
4154514f5e3Sopenharmony_ci    V(TryLoadICByValue)                         \
4164514f5e3Sopenharmony_ci    V(TryStoreICByName)                         \
4174514f5e3Sopenharmony_ci    V(TryStoreICByValue)                        \
4184514f5e3Sopenharmony_ci    V(SetValueWithBarrier)                      \
4194514f5e3Sopenharmony_ci    V(SetNonSValueWithBarrier)                  \
4204514f5e3Sopenharmony_ci    V(SetValueWithEdenBarrier)                  \
4214514f5e3Sopenharmony_ci    V(SetNonSValueWithEdenBarrier)              \
4224514f5e3Sopenharmony_ci    V(SetSValueWithBarrier)                     \
4234514f5e3Sopenharmony_ci    V(NewLexicalEnv)                            \
4244514f5e3Sopenharmony_ci    V(CopyRestArgs)                             \
4254514f5e3Sopenharmony_ci    V(GetUnmappedArgs)                          \
4264514f5e3Sopenharmony_ci    V(GetCallSpreadArgs)                        \
4274514f5e3Sopenharmony_ci    V(NewThisObjectChecked)                     \
4284514f5e3Sopenharmony_ci    V(ConstructorCheck)                         \
4294514f5e3Sopenharmony_ci    V(CreateEmptyArray)                         \
4304514f5e3Sopenharmony_ci    V(CreateArrayWithBuffer)                    \
4314514f5e3Sopenharmony_ci    V(NewJSObject)                              \
4324514f5e3Sopenharmony_ci    V(GetTaggedArrayPtrTest)                    \
4334514f5e3Sopenharmony_ci    V(BytecodeHandler)                          \
4344514f5e3Sopenharmony_ci    V(Builtins)                                 \
4354514f5e3Sopenharmony_ci    V(BuiltinsWithArgv)                         \
4364514f5e3Sopenharmony_ci    V(BytecodeDebuggerHandler)                  \
4374514f5e3Sopenharmony_ci    V(CallRuntime)                              \
4384514f5e3Sopenharmony_ci    V(AsmInterpreterEntry)                      \
4394514f5e3Sopenharmony_ci    V(CallArg0AndCheckToBaseline)               \
4404514f5e3Sopenharmony_ci    V(CallArg1AndCheckToBaseline)               \
4414514f5e3Sopenharmony_ci    V(CallArgs2AndCheckToBaseline)              \
4424514f5e3Sopenharmony_ci    V(CallArgs3AndCheckToBaseline)              \
4434514f5e3Sopenharmony_ci    V(CallThisArg0AndCheckToBaseline)           \
4444514f5e3Sopenharmony_ci    V(CallThisArg1AndCheckToBaseline)           \
4454514f5e3Sopenharmony_ci    V(CallThisArgs2AndCheckToBaseline)          \
4464514f5e3Sopenharmony_ci    V(CallThisArgs3AndCheckToBaseline)          \
4474514f5e3Sopenharmony_ci    V(CallRangeAndCheckToBaseline)              \
4484514f5e3Sopenharmony_ci    V(CallNewAndCheckToBaseline)                \
4494514f5e3Sopenharmony_ci    V(SuperCallAndCheckToBaseline)              \
4504514f5e3Sopenharmony_ci    V(CallThisRangeAndCheckToBaseline)          \
4514514f5e3Sopenharmony_ci    V(GeneratorReEnterAsmInterp)                \
4524514f5e3Sopenharmony_ci    V(CallRuntimeWithArgv)                      \
4534514f5e3Sopenharmony_ci    V(OptimizedCallAndPushArgv)                 \
4544514f5e3Sopenharmony_ci    V(OptimizedFastCallAndPushArgv)             \
4554514f5e3Sopenharmony_ci    V(AOTCallToAsmInterBridge)                  \
4564514f5e3Sopenharmony_ci    V(FastCallToAsmInterBridge)                 \
4574514f5e3Sopenharmony_ci    V(PushCallArg0AndDispatch)                  \
4584514f5e3Sopenharmony_ci    V(PushCallArgsAndDispatchNative)            \
4594514f5e3Sopenharmony_ci    V(PushCallArg1AndDispatch)                  \
4604514f5e3Sopenharmony_ci    V(PushCallArgs2AndDispatch)                 \
4614514f5e3Sopenharmony_ci    V(PushCallArgs3AndDispatch)                 \
4624514f5e3Sopenharmony_ci    V(PushCallRangeAndDispatch)                 \
4634514f5e3Sopenharmony_ci    V(PushCallRangeAndDispatchNative)           \
4644514f5e3Sopenharmony_ci    V(PushCallThisRangeAndDispatch)             \
4654514f5e3Sopenharmony_ci    V(PushCallThisArg0AndDispatch)              \
4664514f5e3Sopenharmony_ci    V(PushCallThisArg1AndDispatch)              \
4674514f5e3Sopenharmony_ci    V(PushCallThisArgs2AndDispatch)             \
4684514f5e3Sopenharmony_ci    V(PushCallThisArgs3AndDispatch)             \
4694514f5e3Sopenharmony_ci    V(PushCallNewAndDispatchNative)             \
4704514f5e3Sopenharmony_ci    V(PushNewTargetAndDispatchNative)           \
4714514f5e3Sopenharmony_ci    V(PushCallNewAndDispatch)                   \
4724514f5e3Sopenharmony_ci    V(PushSuperCallAndDispatch)                 \
4734514f5e3Sopenharmony_ci    V(CallGetter)                               \
4744514f5e3Sopenharmony_ci    V(CallSetter)                               \
4754514f5e3Sopenharmony_ci    V(CallContainersArgs2)                      \
4764514f5e3Sopenharmony_ci    V(CallContainersArgs3)                      \
4774514f5e3Sopenharmony_ci    V(JSCallWithArgV)                           \
4784514f5e3Sopenharmony_ci    V(JSFastCallWithArgV)                       \
4794514f5e3Sopenharmony_ci    V(JSFastCallWithArgVAndPushArgv)            \
4804514f5e3Sopenharmony_ci    V(JSCallWithArgVAndPushArgv)                \
4814514f5e3Sopenharmony_ci    V(SuperCallWithArgV)                        \
4824514f5e3Sopenharmony_ci    V(ResumeRspAndDispatch)                     \
4834514f5e3Sopenharmony_ci    V(ResumeRspAndReturn)                       \
4844514f5e3Sopenharmony_ci    V(ResumeRspAndReturnBaseline)               \
4854514f5e3Sopenharmony_ci    V(ResumeCaughtFrameAndDispatch)             \
4864514f5e3Sopenharmony_ci    V(ResumeUncaughtFrameAndReturn)             \
4874514f5e3Sopenharmony_ci    V(ResumeRspAndRollback)                     \
4884514f5e3Sopenharmony_ci    V(StringsAreEquals)                         \
4894514f5e3Sopenharmony_ci    V(BigIntEquals)                             \
4904514f5e3Sopenharmony_ci    V(BigIntSameValueZero)                      \
4914514f5e3Sopenharmony_ci    V(CallBigIntAsIntN)                         \
4924514f5e3Sopenharmony_ci    V(CallBigIntAsUintN)                        \
4934514f5e3Sopenharmony_ci    V(Dump)                                     \
4944514f5e3Sopenharmony_ci    V(DebugDump)                                \
4954514f5e3Sopenharmony_ci    V(DumpWithHint)                             \
4964514f5e3Sopenharmony_ci    V(DebugDumpWithHint)                        \
4974514f5e3Sopenharmony_ci    V(DebugPrint)                               \
4984514f5e3Sopenharmony_ci    V(DebugPrintCustom)                         \
4994514f5e3Sopenharmony_ci    V(DebugPrintInstruction)                    \
5004514f5e3Sopenharmony_ci    V(DebugOsrEntry)                            \
5014514f5e3Sopenharmony_ci    V(Comment)                                  \
5024514f5e3Sopenharmony_ci    V(FatalPrint)                               \
5034514f5e3Sopenharmony_ci    V(FatalPrintCustom)                         \
5044514f5e3Sopenharmony_ci    V(GetActualArgvNoGC)                        \
5054514f5e3Sopenharmony_ci    V(InsertNewToEdenRSet)                      \
5064514f5e3Sopenharmony_ci    V(InsertOldToNewRSet)                       \
5074514f5e3Sopenharmony_ci    V(InsertLocalToShareRSet)                   \
5084514f5e3Sopenharmony_ci    V(SetBitAtomic)                             \
5094514f5e3Sopenharmony_ci    V(DoubleToInt)                              \
5104514f5e3Sopenharmony_ci    V(DoubleToLength)                           \
5114514f5e3Sopenharmony_ci    V(FloatMod)                                 \
5124514f5e3Sopenharmony_ci    V(FloatAcos)                                \
5134514f5e3Sopenharmony_ci    V(FloatAcosh)                               \
5144514f5e3Sopenharmony_ci    V(FloatAsin)                                \
5154514f5e3Sopenharmony_ci    V(FloatAsinh)                               \
5164514f5e3Sopenharmony_ci    V(FloatAtan)                                \
5174514f5e3Sopenharmony_ci    V(FloatAtan2)                               \
5184514f5e3Sopenharmony_ci    V(FloatAtanh)                               \
5194514f5e3Sopenharmony_ci    V(FloatCos)                                 \
5204514f5e3Sopenharmony_ci    V(FloatCosh)                                \
5214514f5e3Sopenharmony_ci    V(FloatSin)                                 \
5224514f5e3Sopenharmony_ci    V(FloatSinh)                                \
5234514f5e3Sopenharmony_ci    V(FloatTan)                                 \
5244514f5e3Sopenharmony_ci    V(FloatTanh)                                \
5254514f5e3Sopenharmony_ci    V(FloatTrunc)                               \
5264514f5e3Sopenharmony_ci    V(FloatLog)                                 \
5274514f5e3Sopenharmony_ci    V(FloatLog2)                                \
5284514f5e3Sopenharmony_ci    V(FloatLog10)                               \
5294514f5e3Sopenharmony_ci    V(FloatLog1p)                               \
5304514f5e3Sopenharmony_ci    V(FloatExp)                                 \
5314514f5e3Sopenharmony_ci    V(FloatExpm1)                               \
5324514f5e3Sopenharmony_ci    V(FloatCbrt)                                \
5334514f5e3Sopenharmony_ci    V(FloatClz32)                               \
5344514f5e3Sopenharmony_ci    V(FloatFloor)                               \
5354514f5e3Sopenharmony_ci    V(FloatPow)                                 \
5364514f5e3Sopenharmony_ci    V(FloatCeil)                                \
5374514f5e3Sopenharmony_ci    V(CallDateNow)                              \
5384514f5e3Sopenharmony_ci    V(NumberIsFinite)                           \
5394514f5e3Sopenharmony_ci    V(FindElementWithCache)                     \
5404514f5e3Sopenharmony_ci    V(UpdateFieldType)                          \
5414514f5e3Sopenharmony_ci    V(MarkingBarrier)                           \
5424514f5e3Sopenharmony_ci    V(MarkingBarrierWithEden)                   \
5434514f5e3Sopenharmony_ci    V(SharedGCMarkingBarrier)                   \
5444514f5e3Sopenharmony_ci    V(StoreBarrier)                             \
5454514f5e3Sopenharmony_ci    V(CallArg0)                                 \
5464514f5e3Sopenharmony_ci    V(CallArg1)                                 \
5474514f5e3Sopenharmony_ci    V(CallArgs2)                                \
5484514f5e3Sopenharmony_ci    V(CallArgs3)                                \
5494514f5e3Sopenharmony_ci    V(CallThisRange)                            \
5504514f5e3Sopenharmony_ci    V(CallRange)                                \
5514514f5e3Sopenharmony_ci    V(JSCall)                                   \
5524514f5e3Sopenharmony_ci    V(JSOptimizedCall)                          \
5534514f5e3Sopenharmony_ci    V(JSOptimizedFastCall)                      \
5544514f5e3Sopenharmony_ci    V(JSFunctionEntry)                          \
5554514f5e3Sopenharmony_ci    V(OptimizedFastCallEntry)                   \
5564514f5e3Sopenharmony_ci    V(JSProxyCallInternalWithArgV)              \
5574514f5e3Sopenharmony_ci    V(CreateArrayFromList)                      \
5584514f5e3Sopenharmony_ci    V(JSObjectGetMethod)                        \
5594514f5e3Sopenharmony_ci    V(JsProxyCallInternal)                      \
5604514f5e3Sopenharmony_ci    V(JsBoundCallInternal)                      \
5614514f5e3Sopenharmony_ci    V(DeoptHandlerAsm)                          \
5624514f5e3Sopenharmony_ci    V(JSCallNew)                                \
5634514f5e3Sopenharmony_ci    V(CallOptimized)                            \
5644514f5e3Sopenharmony_ci    V(TimeClip)                                 \
5654514f5e3Sopenharmony_ci    V(SetDateValues)                            \
5664514f5e3Sopenharmony_ci    V(CallReturnWithArgv)                       \
5674514f5e3Sopenharmony_ci    V(StartCallTimer)                           \
5684514f5e3Sopenharmony_ci    V(EndCallTimer)                             \
5694514f5e3Sopenharmony_ci    V(GetSingleCharCodeByIndex)                 \
5704514f5e3Sopenharmony_ci    V(CreateStringBySingleCharCode)             \
5714514f5e3Sopenharmony_ci    V(FastStringEqual)                          \
5724514f5e3Sopenharmony_ci    V(FastStringAdd)                            \
5734514f5e3Sopenharmony_ci    V(DeleteObjectProperty)                     \
5744514f5e3Sopenharmony_ci    V(Getpropiterator)                          \
5754514f5e3Sopenharmony_ci    V(Getnextpropname)                          \
5764514f5e3Sopenharmony_ci    V(CreateJSSetIterator)                      \
5774514f5e3Sopenharmony_ci    V(CreateJSMapIterator)                      \
5784514f5e3Sopenharmony_ci    V(JSMapGet)                                 \
5794514f5e3Sopenharmony_ci    V(JSMapHas)                                 \
5804514f5e3Sopenharmony_ci    V(JSMapKeys)                                \
5814514f5e3Sopenharmony_ci    V(JSMapValues)                              \
5824514f5e3Sopenharmony_ci    V(JSSetHas)                                 \
5834514f5e3Sopenharmony_ci    V(JSSetAdd)                                 \
5844514f5e3Sopenharmony_ci    V(JSMapDelete)                              \
5854514f5e3Sopenharmony_ci    V(JSSetDelete)                              \
5864514f5e3Sopenharmony_ci    V(CreateJSTypedArrayEntries)                \
5874514f5e3Sopenharmony_ci    V(CreateJSTypedArrayKeys)                   \
5884514f5e3Sopenharmony_ci    V(CreateJSTypedArrayValues)                 \
5894514f5e3Sopenharmony_ci    V(JSSetEntries)                             \
5904514f5e3Sopenharmony_ci    V(JSHClassFindProtoTransitions)             \
5914514f5e3Sopenharmony_ci    V(NumberHelperStringToDouble)               \
5924514f5e3Sopenharmony_ci    V(GetStringToListCacheArray)                \
5934514f5e3Sopenharmony_ci    V(FastArraySort)                            \
5944514f5e3Sopenharmony_ci    V(FastArraySortString)                      \
5954514f5e3Sopenharmony_ci    V(StringToNumber)                           \
5964514f5e3Sopenharmony_ci    V(StringGetStart)                           \
5974514f5e3Sopenharmony_ci    V(StringGetEnd)                             \
5984514f5e3Sopenharmony_ci    V(ArrayTrim)                                \
5994514f5e3Sopenharmony_ci    V(OptimizedFastJmp)                         \
6004514f5e3Sopenharmony_ci    V(CopyTypedArrayBuffer)                     \
6014514f5e3Sopenharmony_ci    V(CallArg0AndDispatchFromBaseline)          \
6024514f5e3Sopenharmony_ci    V(CallArg1AndDispatchFromBaseline)          \
6034514f5e3Sopenharmony_ci    V(CallArgs2AndDispatchFromBaseline)         \
6044514f5e3Sopenharmony_ci    V(CallArgs3AndDispatchFromBaseline)         \
6054514f5e3Sopenharmony_ci    V(CallThisArg0AndDispatchFromBaseline)      \
6064514f5e3Sopenharmony_ci    V(CallThisArg1AndDispatchFromBaseline)      \
6074514f5e3Sopenharmony_ci    V(CallThisArgs2AndDispatchFromBaseline)     \
6084514f5e3Sopenharmony_ci    V(CallThisArgs3AndDispatchFromBaseline)     \
6094514f5e3Sopenharmony_ci    V(CallRangeAndDispatchFromBaseline)         \
6104514f5e3Sopenharmony_ci    V(CallNewAndDispatchFromBaseline)           \
6114514f5e3Sopenharmony_ci    V(SuperCallAndDispatchFromBaseline)         \
6124514f5e3Sopenharmony_ci    V(CallThisRangeAndDispatchFromBaseline)     \
6134514f5e3Sopenharmony_ci    V(CallArg0AndCheckToBaselineFromBaseline)        \
6144514f5e3Sopenharmony_ci    V(CallArg1AndCheckToBaselineFromBaseline)        \
6154514f5e3Sopenharmony_ci    V(CallArgs2AndCheckToBaselineFromBaseline)       \
6164514f5e3Sopenharmony_ci    V(CallArgs3AndCheckToBaselineFromBaseline)       \
6174514f5e3Sopenharmony_ci    V(CallThisArg0AndCheckToBaselineFromBaseline)    \
6184514f5e3Sopenharmony_ci    V(CallThisArg1AndCheckToBaselineFromBaseline)    \
6194514f5e3Sopenharmony_ci    V(CallThisArgs2AndCheckToBaselineFromBaseline)   \
6204514f5e3Sopenharmony_ci    V(CallThisArgs3AndCheckToBaselineFromBaseline)   \
6214514f5e3Sopenharmony_ci    V(CallRangeAndCheckToBaselineFromBaseline)       \
6224514f5e3Sopenharmony_ci    V(CallNewAndCheckToBaselineFromBaseline)         \
6234514f5e3Sopenharmony_ci    V(SuperCallAndCheckToBaselineFromBaseline)       \
6244514f5e3Sopenharmony_ci    V(CallThisRangeAndCheckToBaselineFromBaseline)   \
6254514f5e3Sopenharmony_ci    V(SameValue)                                     \
6264514f5e3Sopenharmony_ci    V(GetBaselineBuiltinFp)                          \
6274514f5e3Sopenharmony_ci    V(StringIteratorNext)                            \
6284514f5e3Sopenharmony_ci    V(Definefunc)                                    \
6294514f5e3Sopenharmony_ci    V(DefineField)                                   \
6304514f5e3Sopenharmony_ci    V(ConvertCharToInt32)                            \
6314514f5e3Sopenharmony_ci    V(ConvertCharToDouble)                           \
6324514f5e3Sopenharmony_ci    V(ASMFastWriteBarrier)                           \
6334514f5e3Sopenharmony_ci    V(ASMWriteBarrierWithEden)                       \
6344514f5e3Sopenharmony_ci    V(VerifyBarrier)                                 \
6354514f5e3Sopenharmony_ci    V(IsFastRegExp)
6364514f5e3Sopenharmony_ci
6374514f5e3Sopenharmony_ci#define DECL_CALL_SIGNATURE(name)                                  \
6384514f5e3Sopenharmony_ciclass name##CallSignature final {                                  \
6394514f5e3Sopenharmony_ci    public:                                                        \
6404514f5e3Sopenharmony_ci        static void Initialize(CallSignature *descriptor);         \
6414514f5e3Sopenharmony_ci    };
6424514f5e3Sopenharmony_ciEXPLICIT_CALL_SIGNATURE_LIST(DECL_CALL_SIGNATURE)
6434514f5e3Sopenharmony_ci
6444514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
6454514f5e3Sopenharmony_ci#define DEF_CALL_SIGNATURE(name)                                  \
6464514f5e3Sopenharmony_ci    void name##CallSignature::Initialize([[maybe_unused]] CallSignature *callSign)
6474514f5e3Sopenharmony_ci}  // namespace panda::ecmascript::kungfu
6484514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_COMPILER_CALL_SIGNATURE_H
649