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_INTERPRETER_INTERPRETER_INL_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_INTERPRETER_INTERPRETER_INL_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include "ecmascript/debugger/js_debugger_manager.h"
204514f5e3Sopenharmony_ci#include "ecmascript/ecma_context.h"
214514f5e3Sopenharmony_ci#include "ecmascript/ecma_string.h"
224514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h"
234514f5e3Sopenharmony_ci#include "ecmascript/global_env.h"
244514f5e3Sopenharmony_ci#include "ecmascript/ic/ic_runtime_stub-inl.h"
254514f5e3Sopenharmony_ci#include "ecmascript/interpreter/fast_runtime_stub-inl.h"
264514f5e3Sopenharmony_ci#include "ecmascript/interpreter/interpreter.h"
274514f5e3Sopenharmony_ci#include "ecmascript/interpreter/interpreter_assembly.h"
284514f5e3Sopenharmony_ci#include "ecmascript/interpreter/frame_handler.h"
294514f5e3Sopenharmony_ci#include "ecmascript/interpreter/slow_runtime_stub.h"
304514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/literal_data_extractor.h"
314514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/program_object.h"
324514f5e3Sopenharmony_ci#include "ecmascript/js_async_generator_object.h"
334514f5e3Sopenharmony_ci#include "ecmascript/js_generator_object.h"
344514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h"
354514f5e3Sopenharmony_ci#include "ecmascript/jit/jit_task.h"
364514f5e3Sopenharmony_ci#include "ecmascript/mem/concurrent_marker.h"
374514f5e3Sopenharmony_ci#include "ecmascript/module/js_module_manager.h"
384514f5e3Sopenharmony_ci#include "ecmascript/module/js_module_source_text.h"
394514f5e3Sopenharmony_ci#include "ecmascript/runtime_call_id.h"
404514f5e3Sopenharmony_ci#include "ecmascript/stubs/runtime_stubs.h"
414514f5e3Sopenharmony_ci#include "ecmascript/sendable_env.h"
424514f5e3Sopenharmony_ci#include "ecmascript/template_string.h"
434514f5e3Sopenharmony_ci#include "ecmascript/checkpoint/thread_state_transition.h"
444514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER)
454514f5e3Sopenharmony_ci#include "ecmascript/dfx/cpu_profiler/cpu_profiler.h"
464514f5e3Sopenharmony_ci#endif
474514f5e3Sopenharmony_ci
484514f5e3Sopenharmony_cinamespace panda::ecmascript {
494514f5e3Sopenharmony_ciusing CommonStubCSigns = kungfu::CommonStubCSigns;
504514f5e3Sopenharmony_ci#if defined(__clang__)
514514f5e3Sopenharmony_ci#pragma clang diagnostic push
524514f5e3Sopenharmony_ci#pragma clang diagnostic ignored "-Wvoid-ptr-dereference"
534514f5e3Sopenharmony_ci#pragma clang diagnostic ignored "-Wgnu-label-as-value"
544514f5e3Sopenharmony_ci#elif defined(__GNUC__)
554514f5e3Sopenharmony_ci#pragma GCC diagnostic push
564514f5e3Sopenharmony_ci#pragma GCC diagnostic ignored "-Wpedantic"
574514f5e3Sopenharmony_ci#endif
584514f5e3Sopenharmony_ci
594514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_INTERPRETER_LOG
604514f5e3Sopenharmony_ci#define HANDLE_OPCODE(opcode)                                           \
614514f5e3Sopenharmony_ci    HANDLE_##opcode:                                                    \
624514f5e3Sopenharmony_ci    {                                                                   \
634514f5e3Sopenharmony_ci        RuntimeStubs::DebugPrintInstruction(thread->GetGlueAddr(), pc); \
644514f5e3Sopenharmony_ci    }
654514f5e3Sopenharmony_ci#else
664514f5e3Sopenharmony_ci#define HANDLE_OPCODE(opcode)       \
674514f5e3Sopenharmony_ci    HANDLE_##opcode:
684514f5e3Sopenharmony_ci#endif
694514f5e3Sopenharmony_ci
704514f5e3Sopenharmony_ci#define NOPRINT_HANDLE_OPCODE(opcode) \
714514f5e3Sopenharmony_ci    HANDLE_##opcode:
724514f5e3Sopenharmony_ci
734514f5e3Sopenharmony_ci#define LOG_INST() false && LOG_INTERPRETER(DEBUG)
744514f5e3Sopenharmony_ci
754514f5e3Sopenharmony_ci#define DEBUG_HANDLE_OPCODE(opcode) \
764514f5e3Sopenharmony_ci    DEBUG_HANDLE_##opcode:
774514f5e3Sopenharmony_ci
784514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
794514f5e3Sopenharmony_ci#define ADVANCE_PC(offset) \
804514f5e3Sopenharmony_ci    pc += (offset);  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic, cppcoreguidelines-macro-usage)
814514f5e3Sopenharmony_ci
824514f5e3Sopenharmony_ci#define GOTO_NEXT()  // NOLINT(clang-diagnostic-gnu-label-as-value, cppcoreguidelines-macro-usage)
834514f5e3Sopenharmony_ci
844514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
854514f5e3Sopenharmony_ci#define DISPATCH(curOpcode)                                       \
864514f5e3Sopenharmony_ci    do {                                                          \
874514f5e3Sopenharmony_ci        ADVANCE_PC(BytecodeInstruction::Size(EcmaOpcode::curOpcode))  \
884514f5e3Sopenharmony_ci        opcode = READ_INST_OP(); goto *dispatchTable[opcode];     \
894514f5e3Sopenharmony_ci    } while (false)
904514f5e3Sopenharmony_ci
914514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
924514f5e3Sopenharmony_ci#define DISPATCH_OFFSET(offset)                               \
934514f5e3Sopenharmony_ci    do {                                                      \
944514f5e3Sopenharmony_ci        ADVANCE_PC(offset)                                    \
954514f5e3Sopenharmony_ci        opcode = READ_INST_OP(); goto *dispatchTable[opcode]; \
964514f5e3Sopenharmony_ci    } while (false)
974514f5e3Sopenharmony_ci
984514f5e3Sopenharmony_ci#define DISPATCH_THROW()                  \
994514f5e3Sopenharmony_ci    do {                                  \
1004514f5e3Sopenharmony_ci        opcode = *(pc + 1);               \
1014514f5e3Sopenharmony_ci        goto *throwDispatchTable[opcode]; \
1024514f5e3Sopenharmony_ci    } while (false)
1034514f5e3Sopenharmony_ci
1044514f5e3Sopenharmony_ci#define DISPATCH_WIDE()                  \
1054514f5e3Sopenharmony_ci    do {                                 \
1064514f5e3Sopenharmony_ci        opcode = *(pc + 1);              \
1074514f5e3Sopenharmony_ci        goto *wideDispatchTable[opcode]; \
1084514f5e3Sopenharmony_ci    } while (false)
1094514f5e3Sopenharmony_ci
1104514f5e3Sopenharmony_ci#define DISPATCH_DEPRECATED()                  \
1114514f5e3Sopenharmony_ci    do {                                       \
1124514f5e3Sopenharmony_ci        opcode = *(pc + 1);                    \
1134514f5e3Sopenharmony_ci        goto *deprecatedDispatchTable[opcode]; \
1144514f5e3Sopenharmony_ci    } while (false)
1154514f5e3Sopenharmony_ci
1164514f5e3Sopenharmony_ci#define DISPATCH_CALLRUNTIME()                  \
1174514f5e3Sopenharmony_ci    do {                                        \
1184514f5e3Sopenharmony_ci        opcode = *(pc + 1);                     \
1194514f5e3Sopenharmony_ci        goto *callRuntimeDispatchTable[opcode]; \
1204514f5e3Sopenharmony_ci    } while (false)
1214514f5e3Sopenharmony_ci
1224514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1234514f5e3Sopenharmony_ci#define GET_FRAME(CurrentSp) \
1244514f5e3Sopenharmony_ci    (reinterpret_cast<InterpretedFrame *>(CurrentSp) - 1)  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1254514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1264514f5e3Sopenharmony_ci#define GET_ENTRY_FRAME(sp) \
1274514f5e3Sopenharmony_ci    (reinterpret_cast<InterpretedEntryFrame *>(sp) - 1)  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1284514f5e3Sopenharmony_ci#define GET_BUILTIN_FRAME(sp) \
1294514f5e3Sopenharmony_ci    (reinterpret_cast<InterpretedBuiltinFrame *>(sp) - 1)  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1304514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1314514f5e3Sopenharmony_ci#define SAVE_PC() (GET_FRAME(sp)->pc = pc)  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1324514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1334514f5e3Sopenharmony_ci#define SAVE_ACC() (GET_FRAME(sp)->acc = acc)  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1344514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1354514f5e3Sopenharmony_ci#define RESTORE_ACC() (acc = GET_FRAME(sp)->acc)  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1364514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1374514f5e3Sopenharmony_ci#define GET_VREG(idx) (sp[idx])  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1384514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1394514f5e3Sopenharmony_ci#define GET_VREG_VALUE(idx) (JSTaggedValue(sp[idx]))  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1404514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1414514f5e3Sopenharmony_ci#define SET_VREG(idx, val) (sp[idx] = (val));  // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
1424514f5e3Sopenharmony_ci#define GET_ACC() (acc)                        // NOLINT(cppcoreguidelines-macro-usage)
1434514f5e3Sopenharmony_ci#define SET_ACC(val) (acc = val)               // NOLINT(cppcoreguidelines-macro-usage)
1444514f5e3Sopenharmony_ci
1454514f5e3Sopenharmony_ci#define GET_METHOD_FROM_CACHE(index) \
1464514f5e3Sopenharmony_ci    ConstantPool::GetMethodFromCache(thread, constpool, index)
1474514f5e3Sopenharmony_ci
1484514f5e3Sopenharmony_ci#define GET_STR_FROM_CACHE(index) \
1494514f5e3Sopenharmony_ci    ConstantPool::GetStringFromCache(thread, constpool, index)
1504514f5e3Sopenharmony_ci
1514514f5e3Sopenharmony_ci#define GET_LITERA_FROM_CACHE(index, type, module) \
1524514f5e3Sopenharmony_ci    ConstantPool::GetLiteralFromCache<type>(thread, constpool, index, module)
1534514f5e3Sopenharmony_ci
1544514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1554514f5e3Sopenharmony_ci#define INTERPRETER_GOTO_EXCEPTION_HANDLER()          \
1564514f5e3Sopenharmony_ci    do {                                              \
1574514f5e3Sopenharmony_ci        SAVE_PC();                                    \
1584514f5e3Sopenharmony_ci        goto *dispatchTable[EXCEPTION_OPCODE]; \
1594514f5e3Sopenharmony_ci    } while (false)
1604514f5e3Sopenharmony_ci
1614514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1624514f5e3Sopenharmony_ci#define INTERPRETER_HANDLE_RETURN()                                                     \
1634514f5e3Sopenharmony_ci    do {                                                                                \
1644514f5e3Sopenharmony_ci        size_t jumpSize = GetJumpSizeAfterCall(pc);                                     \
1654514f5e3Sopenharmony_ci        DISPATCH_OFFSET(jumpSize);                                                      \
1664514f5e3Sopenharmony_ci    } while (false)
1674514f5e3Sopenharmony_ci
1684514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1694514f5e3Sopenharmony_ci#define CHECK_SWITCH_TO_DEBUGGER_TABLE()                 \
1704514f5e3Sopenharmony_ci    if (ecmaVm->GetJsDebuggerManager()->IsDebugMode()) { \
1714514f5e3Sopenharmony_ci        dispatchTable = debugDispatchTable.data();       \
1724514f5e3Sopenharmony_ci    }
1734514f5e3Sopenharmony_ci
1744514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1754514f5e3Sopenharmony_ci#define REAL_GOTO_DISPATCH_OPCODE(opcode)                       \
1764514f5e3Sopenharmony_ci    do {                                                        \
1774514f5e3Sopenharmony_ci        ASSERT(static_cast<uint16_t>(opcode) <= 0xff);          \
1784514f5e3Sopenharmony_ci        goto *instDispatchTable[static_cast<uint8_t>(opcode)];  \
1794514f5e3Sopenharmony_ci    } while (false)
1804514f5e3Sopenharmony_ci
1814514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1824514f5e3Sopenharmony_ci#define REAL_GOTO_EXCEPTION_HANDLER()                     \
1834514f5e3Sopenharmony_ci    do {                                                  \
1844514f5e3Sopenharmony_ci        SAVE_PC();                                        \
1854514f5e3Sopenharmony_ci        goto *instDispatchTable[EXCEPTION_OPCODE]; \
1864514f5e3Sopenharmony_ci    } while (false)
1874514f5e3Sopenharmony_ci
1884514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1894514f5e3Sopenharmony_ci#define INTERPRETER_RETURN_IF_ABRUPT(result)      \
1904514f5e3Sopenharmony_ci    do {                                          \
1914514f5e3Sopenharmony_ci        if (result.IsException()) {               \
1924514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER(); \
1934514f5e3Sopenharmony_ci        }                                         \
1944514f5e3Sopenharmony_ci    } while (false)
1954514f5e3Sopenharmony_ci
1964514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1974514f5e3Sopenharmony_ci#define HANDLE_EXCEPTION_IF_ABRUPT_COMPLETION(_thread)    \
1984514f5e3Sopenharmony_ci    do {                                                  \
1994514f5e3Sopenharmony_ci        if (UNLIKELY((_thread)->HasPendingException())) { \
2004514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();         \
2014514f5e3Sopenharmony_ci        }                                                 \
2024514f5e3Sopenharmony_ci    } while (false)
2034514f5e3Sopenharmony_ci
2044514f5e3Sopenharmony_ci#define JUMP_IF_ENTRYFRAME_PENDING()                \
2054514f5e3Sopenharmony_ci    do {                                            \
2064514f5e3Sopenharmony_ci        if (thread->IsEntryFrameDroppedPending()) { \
2074514f5e3Sopenharmony_ci            thread->ResetEntryFrameDroppedState();  \
2084514f5e3Sopenharmony_ci            DROPFRAME_JUMP();                       \
2094514f5e3Sopenharmony_ci        }                                           \
2104514f5e3Sopenharmony_ci    } while (false)
2114514f5e3Sopenharmony_ci
2124514f5e3Sopenharmony_ci#define DROPFRAME_JUMP()                                              \
2134514f5e3Sopenharmony_ci    do {                                                              \
2144514f5e3Sopenharmony_ci        thread->ResetFrameDroppedState();                             \
2154514f5e3Sopenharmony_ci        sp = const_cast<JSTaggedType *>(thread->GetCurrentSPFrame()); \
2164514f5e3Sopenharmony_ci        InterpretedFrame *state = GET_FRAME(sp);                      \
2174514f5e3Sopenharmony_ci        pc = state->pc;                                               \
2184514f5e3Sopenharmony_ci        RESTORE_ACC();                                                \
2194514f5e3Sopenharmony_ci        DISPATCH_OFFSET(0);                                           \
2204514f5e3Sopenharmony_ci    } while (false)
2214514f5e3Sopenharmony_ci
2224514f5e3Sopenharmony_ci#define RESET_AND_JUMP_IF_DROPFRAME()                \
2234514f5e3Sopenharmony_ci    do {                                             \
2244514f5e3Sopenharmony_ci        if (thread->IsFrameDropped()) {              \
2254514f5e3Sopenharmony_ci            if (thread->IsEntryFrameDroppedTrue()) { \
2264514f5e3Sopenharmony_ci                return;                              \
2274514f5e3Sopenharmony_ci            }                                        \
2284514f5e3Sopenharmony_ci            DROPFRAME_JUMP();                        \
2294514f5e3Sopenharmony_ci        }                                            \
2304514f5e3Sopenharmony_ci    } while (false)
2314514f5e3Sopenharmony_ci
2324514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
2334514f5e3Sopenharmony_ci#define NOTIFY_DEBUGGER_EVENT()          \
2344514f5e3Sopenharmony_ci    do {                                 \
2354514f5e3Sopenharmony_ci        JUMP_IF_ENTRYFRAME_PENDING();    \
2364514f5e3Sopenharmony_ci        SAVE_ACC();                      \
2374514f5e3Sopenharmony_ci        SAVE_PC();                       \
2384514f5e3Sopenharmony_ci        NotifyBytecodePcChanged(thread); \
2394514f5e3Sopenharmony_ci        RESET_AND_JUMP_IF_DROPFRAME();   \
2404514f5e3Sopenharmony_ci        RESTORE_ACC();                   \
2414514f5e3Sopenharmony_ci    } while (false)
2424514f5e3Sopenharmony_ci
2434514f5e3Sopenharmony_ci/*
2444514f5e3Sopenharmony_ci * reasons of set acc with hole:
2454514f5e3Sopenharmony_ci * 1. acc will become illegal when new error
2464514f5e3Sopenharmony_ci * 2. debugger logic will save acc, so illegal acc will set to frame
2474514f5e3Sopenharmony_ci * 3. when debugger trigger gc, will mark an invalid acc and crash
2484514f5e3Sopenharmony_ci * 4. acc will set to exception later, so it can set to hole template
2494514f5e3Sopenharmony_ci */
2504514f5e3Sopenharmony_ci#define NOTIFY_DEBUGGER_EXCEPTION_EVENT() \
2514514f5e3Sopenharmony_ci    do {                                  \
2524514f5e3Sopenharmony_ci        SET_ACC(JSTaggedValue::Hole());   \
2534514f5e3Sopenharmony_ci        NOTIFY_DEBUGGER_EVENT();          \
2544514f5e3Sopenharmony_ci    } while (false)
2554514f5e3Sopenharmony_ci
2564514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
2574514f5e3Sopenharmony_ci#define DEPRECATED_CALL_INITIALIZE()                                            \
2584514f5e3Sopenharmony_ci    do {                                                                        \
2594514f5e3Sopenharmony_ci        SAVE_PC();                                                              \
2604514f5e3Sopenharmony_ci        thread->CheckSafepoint();                                               \
2614514f5e3Sopenharmony_ci        funcTagged = sp[startReg];                                              \
2624514f5e3Sopenharmony_ci        JSTaggedValue funcValue(funcTagged);                                    \
2634514f5e3Sopenharmony_ci        if (!funcValue.IsCallable()) {                                          \
2644514f5e3Sopenharmony_ci            {                                                                   \
2654514f5e3Sopenharmony_ci                [[maybe_unused]] EcmaHandleScope handleScope(thread);           \
2664514f5e3Sopenharmony_ci                JSHandle<JSObject> error = factory->GetJSError(                 \
2674514f5e3Sopenharmony_ci                    ErrorType::TYPE_ERROR, "is not callable", StackCheck::NO);  \
2684514f5e3Sopenharmony_ci                thread->SetException(error.GetTaggedValue());                   \
2694514f5e3Sopenharmony_ci            }                                                                   \
2704514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                               \
2714514f5e3Sopenharmony_ci        }                                                                       \
2724514f5e3Sopenharmony_ci        funcObject = ECMAObject::Cast(funcValue.GetTaggedObject());             \
2734514f5e3Sopenharmony_ci        methodHandle.Update(JSTaggedValue(funcObject->GetCallTarget()));        \
2744514f5e3Sopenharmony_ci        newSp = sp - InterpretedFrame::NumOfMembers();                          \
2754514f5e3Sopenharmony_ci    } while (false)
2764514f5e3Sopenharmony_ci
2774514f5e3Sopenharmony_ci#define CALL_INITIALIZE()                                                       \
2784514f5e3Sopenharmony_ci    do {                                                                        \
2794514f5e3Sopenharmony_ci        SAVE_PC();                                                              \
2804514f5e3Sopenharmony_ci        SAVE_ACC();                                                             \
2814514f5e3Sopenharmony_ci        thread->CheckSafepoint();                                               \
2824514f5e3Sopenharmony_ci        RESTORE_ACC();                                                          \
2834514f5e3Sopenharmony_ci        funcTagged = acc.GetRawData();                                          \
2844514f5e3Sopenharmony_ci        JSTaggedValue funcValue = acc;                                          \
2854514f5e3Sopenharmony_ci        if (!funcValue.IsCallable()) {                                          \
2864514f5e3Sopenharmony_ci            {                                                                   \
2874514f5e3Sopenharmony_ci                [[maybe_unused]] EcmaHandleScope handleScope(thread);           \
2884514f5e3Sopenharmony_ci                JSHandle<JSObject> error = factory->GetJSError(                 \
2894514f5e3Sopenharmony_ci                    ErrorType::TYPE_ERROR, "is not callable", StackCheck::NO);  \
2904514f5e3Sopenharmony_ci                thread->SetException(error.GetTaggedValue());                   \
2914514f5e3Sopenharmony_ci            }                                                                   \
2924514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                               \
2934514f5e3Sopenharmony_ci        }                                                                       \
2944514f5e3Sopenharmony_ci        funcObject = ECMAObject::Cast(funcValue.GetTaggedObject());             \
2954514f5e3Sopenharmony_ci        methodHandle.Update(JSTaggedValue(funcObject->GetCallTarget()));        \
2964514f5e3Sopenharmony_ci        newSp = sp - InterpretedFrame::NumOfMembers();                          \
2974514f5e3Sopenharmony_ci    } while (false)
2984514f5e3Sopenharmony_ci
2994514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3004514f5e3Sopenharmony_ci#define CALL_PUSH_UNDEFINED(n)                           \
3014514f5e3Sopenharmony_ci    do {                                                 \
3024514f5e3Sopenharmony_ci        for (int i = 0; i < (n); i++) {                  \
3034514f5e3Sopenharmony_ci            *(--newSp) = JSTaggedValue::VALUE_UNDEFINED; \
3044514f5e3Sopenharmony_ci        }                                                \
3054514f5e3Sopenharmony_ci    } while (false)
3064514f5e3Sopenharmony_ci
3074514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3084514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_0()          \
3094514f5e3Sopenharmony_ci    do {                            \
3104514f5e3Sopenharmony_ci        /* do nothing when 0 arg */ \
3114514f5e3Sopenharmony_ci    } while (false)
3124514f5e3Sopenharmony_ci
3134514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3144514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_0() CALL_PUSH_ARGS_0()
3154514f5e3Sopenharmony_ci
3164514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3174514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_1()   \
3184514f5e3Sopenharmony_ci    do {                     \
3194514f5e3Sopenharmony_ci        *(--newSp) = sp[a0]; \
3204514f5e3Sopenharmony_ci    } while (false)
3214514f5e3Sopenharmony_ci
3224514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3234514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_1() CALL_PUSH_ARGS_1()
3244514f5e3Sopenharmony_ci
3254514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3264514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_2()   \
3274514f5e3Sopenharmony_ci    do {                     \
3284514f5e3Sopenharmony_ci        *(--newSp) = sp[a1]; \
3294514f5e3Sopenharmony_ci        CALL_PUSH_ARGS_1();  \
3304514f5e3Sopenharmony_ci    } while (false)
3314514f5e3Sopenharmony_ci
3324514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3334514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_2() CALL_PUSH_ARGS_2()
3344514f5e3Sopenharmony_ci
3354514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3364514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_3()   \
3374514f5e3Sopenharmony_ci    do {                     \
3384514f5e3Sopenharmony_ci        *(--newSp) = sp[a2]; \
3394514f5e3Sopenharmony_ci        CALL_PUSH_ARGS_2();  \
3404514f5e3Sopenharmony_ci    } while (false)
3414514f5e3Sopenharmony_ci
3424514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3434514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_3() CALL_PUSH_ARGS_3()
3444514f5e3Sopenharmony_ci
3454514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3464514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_RANGE()                                               \
3474514f5e3Sopenharmony_ci    do {                                                                     \
3484514f5e3Sopenharmony_ci        if (UNLIKELY(thread->DoStackOverflowCheck(newSp - actualNumArgs))) { \
3494514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                            \
3504514f5e3Sopenharmony_ci        }                                                                    \
3514514f5e3Sopenharmony_ci        for (int i = actualNumArgs - 1; i >= 0; i--) {                           \
3524514f5e3Sopenharmony_ci            *(--newSp) = sp[startReg + static_cast<uint32_t>(i)];            \
3534514f5e3Sopenharmony_ci        }                                                                    \
3544514f5e3Sopenharmony_ci    } while (false)
3554514f5e3Sopenharmony_ci
3564514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3574514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_RANGE()                                               \
3584514f5e3Sopenharmony_ci    do {                                                                     \
3594514f5e3Sopenharmony_ci        if (UNLIKELY(thread->DoStackOverflowCheck(newSp - actualNumArgs))) { \
3604514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                            \
3614514f5e3Sopenharmony_ci        }                                                                    \
3624514f5e3Sopenharmony_ci        for (int i = actualNumArgs; i > 0; i--) {                            \
3634514f5e3Sopenharmony_ci            *(--newSp) = sp[startReg + static_cast<uint32_t>(i)];             \
3644514f5e3Sopenharmony_ci        }                                                                    \
3654514f5e3Sopenharmony_ci    } while (false)
3664514f5e3Sopenharmony_ci
3674514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3684514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_THISRANGE()                                          \
3694514f5e3Sopenharmony_ci    do {                                                                     \
3704514f5e3Sopenharmony_ci        if (UNLIKELY(thread->DoStackOverflowCheck(newSp - actualNumArgs))) { \
3714514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                            \
3724514f5e3Sopenharmony_ci        }                                                                    \
3734514f5e3Sopenharmony_ci        /* 1: skip this */                                                   \
3744514f5e3Sopenharmony_ci        for (int i = actualNumArgs; i > 0; i--) {                        \
3754514f5e3Sopenharmony_ci            *(--newSp) = sp[startReg + static_cast<uint32_t>(i)];             \
3764514f5e3Sopenharmony_ci        }                                                                    \
3774514f5e3Sopenharmony_ci    } while (false)
3784514f5e3Sopenharmony_ci
3794514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3804514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_THISRANGE()                                          \
3814514f5e3Sopenharmony_ci    do {                                                                     \
3824514f5e3Sopenharmony_ci        if (UNLIKELY(thread->DoStackOverflowCheck(newSp - actualNumArgs))) { \
3834514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                            \
3844514f5e3Sopenharmony_ci        }                                                                    \
3854514f5e3Sopenharmony_ci        /* 1: skip this */                                                   \
3864514f5e3Sopenharmony_ci        for (int i = actualNumArgs + 1; i > 1; i--) {                        \
3874514f5e3Sopenharmony_ci            *(--newSp) = sp[startReg + static_cast<uint32_t>(i)];             \
3884514f5e3Sopenharmony_ci        }                                                                    \
3894514f5e3Sopenharmony_ci    } while (false)
3904514f5e3Sopenharmony_ci
3914514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3924514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_0_NO_EXTRA() \
3934514f5e3Sopenharmony_ci    do {                            \
3944514f5e3Sopenharmony_ci        /* do nothing when 0 arg */ \
3954514f5e3Sopenharmony_ci    } while (false)
3964514f5e3Sopenharmony_ci
3974514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
3984514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_0_NO_EXTRA() CALL_PUSH_ARGS_0_NO_EXTRA()
3994514f5e3Sopenharmony_ci
4004514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4014514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_1_NO_EXTRA()                             \
4024514f5e3Sopenharmony_ci    do {                                                        \
4034514f5e3Sopenharmony_ci        if (declaredNumArgs >= ActualNumArgsOfCall::CALLARG1) { \
4044514f5e3Sopenharmony_ci            *(--newSp) = sp[a0];                                \
4054514f5e3Sopenharmony_ci        }                                                       \
4064514f5e3Sopenharmony_ci    } while (false)
4074514f5e3Sopenharmony_ci
4084514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4094514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_1_NO_EXTRA() CALL_PUSH_ARGS_1_NO_EXTRA()
4104514f5e3Sopenharmony_ci
4114514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4124514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_2_NO_EXTRA()                              \
4134514f5e3Sopenharmony_ci    do {                                                         \
4144514f5e3Sopenharmony_ci        if (declaredNumArgs >= ActualNumArgsOfCall::CALLARGS2) { \
4154514f5e3Sopenharmony_ci            *(--newSp) = sp[a1];                                 \
4164514f5e3Sopenharmony_ci        }                                                        \
4174514f5e3Sopenharmony_ci        DEPRECATED_CALL_PUSH_ARGS_1_NO_EXTRA();                             \
4184514f5e3Sopenharmony_ci    } while (false)
4194514f5e3Sopenharmony_ci
4204514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4214514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_2_NO_EXTRA() CALL_PUSH_ARGS_2_NO_EXTRA()
4224514f5e3Sopenharmony_ci
4234514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4244514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_3_NO_EXTRA()                              \
4254514f5e3Sopenharmony_ci    do {                                                         \
4264514f5e3Sopenharmony_ci        if (declaredNumArgs >= ActualNumArgsOfCall::CALLARGS3) { \
4274514f5e3Sopenharmony_ci            *(--newSp) = sp[a2];                                 \
4284514f5e3Sopenharmony_ci        }                                                        \
4294514f5e3Sopenharmony_ci        DEPRECATED_CALL_PUSH_ARGS_2_NO_EXTRA();                             \
4304514f5e3Sopenharmony_ci    } while (false)
4314514f5e3Sopenharmony_ci
4324514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4334514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_3_NO_EXTRA() CALL_PUSH_ARGS_3_NO_EXTRA()
4344514f5e3Sopenharmony_ci
4354514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4364514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_RANGE_NO_EXTRA()                                      \
4374514f5e3Sopenharmony_ci    do {                                                                     \
4384514f5e3Sopenharmony_ci        int num = std::min(actualNumArgs, declaredNumArgs);                  \
4394514f5e3Sopenharmony_ci        if (UNLIKELY(thread->DoStackOverflowCheck(newSp - num))) {           \
4404514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                            \
4414514f5e3Sopenharmony_ci        }                                                                    \
4424514f5e3Sopenharmony_ci        for (int i = num - 1; i >= 0; i--) {                                 \
4434514f5e3Sopenharmony_ci            *(--newSp) = sp[startReg + static_cast<uint32_t>(i)];            \
4444514f5e3Sopenharmony_ci        }                                                                    \
4454514f5e3Sopenharmony_ci    } while (false)
4464514f5e3Sopenharmony_ci
4474514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4484514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_RANGE_NO_EXTRA()                           \
4494514f5e3Sopenharmony_ci    do {                                                                     \
4504514f5e3Sopenharmony_ci        int num = std::min(actualNumArgs, declaredNumArgs);                  \
4514514f5e3Sopenharmony_ci        if (UNLIKELY(thread->DoStackOverflowCheck(newSp - num))) {           \
4524514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                            \
4534514f5e3Sopenharmony_ci        }                                                                    \
4544514f5e3Sopenharmony_ci        for (int i = num; i > 0; i--) {                                      \
4554514f5e3Sopenharmony_ci            *(--newSp) = sp[startReg + static_cast<uint32_t>(i)];            \
4564514f5e3Sopenharmony_ci        }                                                                    \
4574514f5e3Sopenharmony_ci    } while (false)
4584514f5e3Sopenharmony_ci
4594514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4604514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS_THISRANGE_NO_EXTRA()                                      \
4614514f5e3Sopenharmony_ci    do {                                                                         \
4624514f5e3Sopenharmony_ci        int num = std::min(actualNumArgs, declaredNumArgs);                      \
4634514f5e3Sopenharmony_ci        if (UNLIKELY(thread->DoStackOverflowCheck(newSp - num))) {               \
4644514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                                \
4654514f5e3Sopenharmony_ci        }                                                                        \
4664514f5e3Sopenharmony_ci        /* 1: skip this */                                                       \
4674514f5e3Sopenharmony_ci        for (int i = num; i > 0; i--) {                                          \
4684514f5e3Sopenharmony_ci            *(--newSp) = sp[startReg + static_cast<uint32_t>(i)];                \
4694514f5e3Sopenharmony_ci        }                                                                        \
4704514f5e3Sopenharmony_ci    } while (false)
4714514f5e3Sopenharmony_ci
4724514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4734514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS_THISRANGE_NO_EXTRA()                                      \
4744514f5e3Sopenharmony_ci    do {                                                                         \
4754514f5e3Sopenharmony_ci        int num = std::min(actualNumArgs, declaredNumArgs);                      \
4764514f5e3Sopenharmony_ci        if (UNLIKELY(thread->DoStackOverflowCheck(newSp - num))) {               \
4774514f5e3Sopenharmony_ci            INTERPRETER_GOTO_EXCEPTION_HANDLER();                                \
4784514f5e3Sopenharmony_ci        }                                                                        \
4794514f5e3Sopenharmony_ci        /* 1: skip this */                                                       \
4804514f5e3Sopenharmony_ci        for (int i = num + 1; i > 1; i--) {                                      \
4814514f5e3Sopenharmony_ci            *(--newSp) = sp[startReg + static_cast<uint32_t>(i)];                 \
4824514f5e3Sopenharmony_ci        }                                                                        \
4834514f5e3Sopenharmony_ci    } while (false)
4844514f5e3Sopenharmony_ci
4854514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
4864514f5e3Sopenharmony_ci#define CALL_PUSH_ARGS(ARG_TYPE)                                                   \
4874514f5e3Sopenharmony_ci    do {                                                                           \
4884514f5e3Sopenharmony_ci        if (methodHandle->IsNativeWithCallField()) {                               \
4894514f5e3Sopenharmony_ci            /* native, just push all args directly */                              \
4904514f5e3Sopenharmony_ci            CALL_PUSH_ARGS_##ARG_TYPE();                                           \
4914514f5e3Sopenharmony_ci            goto setVregsAndFrameNative;                                           \
4924514f5e3Sopenharmony_ci        }                                                                          \
4934514f5e3Sopenharmony_ci        int32_t declaredNumArgs =                                                  \
4944514f5e3Sopenharmony_ci            static_cast<int32_t>(methodHandle->GetNumArgsWithCallField());         \
4954514f5e3Sopenharmony_ci        if (actualNumArgs == declaredNumArgs) {                                    \
4964514f5e3Sopenharmony_ci            /* fast path, just push all args directly */                           \
4974514f5e3Sopenharmony_ci            CALL_PUSH_ARGS_##ARG_TYPE();                                           \
4984514f5e3Sopenharmony_ci            goto setVregsAndFrameNotNative;                                        \
4994514f5e3Sopenharmony_ci        }                                                                          \
5004514f5e3Sopenharmony_ci        /* slow path */                                                            \
5014514f5e3Sopenharmony_ci        if (!methodHandle->HaveExtraWithCallField()) {                             \
5024514f5e3Sopenharmony_ci            /* push length = declaredNumArgs, may push undefined */                \
5034514f5e3Sopenharmony_ci            CALL_PUSH_UNDEFINED(declaredNumArgs - actualNumArgs);                  \
5044514f5e3Sopenharmony_ci            CALL_PUSH_ARGS_##ARG_TYPE##_NO_EXTRA();                                \
5054514f5e3Sopenharmony_ci        } else {                                                                   \
5064514f5e3Sopenharmony_ci            /* push actualNumArgs in the end, then all args, may push undefined */ \
5074514f5e3Sopenharmony_ci            *(--newSp) = JSTaggedValue(actualNumArgs).GetRawData();                \
5084514f5e3Sopenharmony_ci            CALL_PUSH_UNDEFINED(declaredNumArgs - actualNumArgs);                  \
5094514f5e3Sopenharmony_ci            CALL_PUSH_ARGS_##ARG_TYPE();                                           \
5104514f5e3Sopenharmony_ci        }                                                                          \
5114514f5e3Sopenharmony_ci        goto setVregsAndFrameNotNative;                                            \
5124514f5e3Sopenharmony_ci    } while (false)
5134514f5e3Sopenharmony_ci
5144514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
5154514f5e3Sopenharmony_ci#define DEPRECATED_CALL_PUSH_ARGS(ARG_TYPE)                                                   \
5164514f5e3Sopenharmony_ci    do {                                                                           \
5174514f5e3Sopenharmony_ci        if (methodHandle->IsNativeWithCallField()) {                                     \
5184514f5e3Sopenharmony_ci            /* native, just push all args directly */                              \
5194514f5e3Sopenharmony_ci            DEPRECATED_CALL_PUSH_ARGS_##ARG_TYPE();                                           \
5204514f5e3Sopenharmony_ci            goto deprecatedSetVregsAndFrameNative;                                           \
5214514f5e3Sopenharmony_ci        }                                                                          \
5224514f5e3Sopenharmony_ci        int32_t declaredNumArgs =                                                  \
5234514f5e3Sopenharmony_ci            static_cast<int32_t>(methodHandle->GetNumArgsWithCallField());               \
5244514f5e3Sopenharmony_ci        if (actualNumArgs == declaredNumArgs) {                                    \
5254514f5e3Sopenharmony_ci            /* fast path, just push all args directly */                           \
5264514f5e3Sopenharmony_ci            DEPRECATED_CALL_PUSH_ARGS_##ARG_TYPE();                                           \
5274514f5e3Sopenharmony_ci            goto deprecatedSetVregsAndFrameNotNative;                                        \
5284514f5e3Sopenharmony_ci        }                                                                          \
5294514f5e3Sopenharmony_ci        /* slow path */                                                            \
5304514f5e3Sopenharmony_ci        if (!methodHandle->HaveExtraWithCallField()) {                                   \
5314514f5e3Sopenharmony_ci            /* push length = declaredNumArgs, may push undefined */                \
5324514f5e3Sopenharmony_ci            CALL_PUSH_UNDEFINED(declaredNumArgs - actualNumArgs);                  \
5334514f5e3Sopenharmony_ci            DEPRECATED_CALL_PUSH_ARGS_##ARG_TYPE##_NO_EXTRA();                                \
5344514f5e3Sopenharmony_ci        } else {                                                                   \
5354514f5e3Sopenharmony_ci            /* push actualNumArgs in the end, then all args, may push undefined */ \
5364514f5e3Sopenharmony_ci            *(--newSp) = JSTaggedValue(actualNumArgs).GetRawData();                \
5374514f5e3Sopenharmony_ci            CALL_PUSH_UNDEFINED(declaredNumArgs - actualNumArgs);                  \
5384514f5e3Sopenharmony_ci            DEPRECATED_CALL_PUSH_ARGS_##ARG_TYPE();                                           \
5394514f5e3Sopenharmony_ci        }                                                                          \
5404514f5e3Sopenharmony_ci        goto deprecatedSetVregsAndFrameNotNative;                                            \
5414514f5e3Sopenharmony_ci    } while (false)
5424514f5e3Sopenharmony_ci
5434514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_IC
5444514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
5454514f5e3Sopenharmony_ci#define UPDATE_HOTNESS_COUNTER_NON_ACC(offset)   (UpdateHotnessCounter(thread, sp, acc, offset))
5464514f5e3Sopenharmony_ci
5474514f5e3Sopenharmony_ci#define UPDATE_HOTNESS_COUNTER(offset)                       \
5484514f5e3Sopenharmony_ci    do {                                                     \
5494514f5e3Sopenharmony_ci        if (UpdateHotnessCounter(thread, sp, acc, offset)) { \
5504514f5e3Sopenharmony_ci            HANDLE_EXCEPTION_IF_ABRUPT_COMPLETION(thread);   \
5514514f5e3Sopenharmony_ci            RESTORE_ACC();                                   \
5524514f5e3Sopenharmony_ci        }                                                    \
5534514f5e3Sopenharmony_ci    } while (false)
5544514f5e3Sopenharmony_ci#else
5554514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
5564514f5e3Sopenharmony_ci#define UPDATE_HOTNESS_COUNTER(offset) static_cast<void>(0)
5574514f5e3Sopenharmony_ci#define UPDATE_HOTNESS_COUNTER_NON_ACC(offset) static_cast<void>(0)
5584514f5e3Sopenharmony_ci#endif
5594514f5e3Sopenharmony_ci
5604514f5e3Sopenharmony_ci#define READ_INST_OP() READ_INST_8(0)               // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5614514f5e3Sopenharmony_ci#define READ_INST_4_0() (READ_INST_8(1) & 0xf)      // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5624514f5e3Sopenharmony_ci#define READ_INST_4_1() (READ_INST_8(1) >> 4 & 0xf) // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5634514f5e3Sopenharmony_ci#define READ_INST_4_2() (READ_INST_8(2) & 0xf)      // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5644514f5e3Sopenharmony_ci#define READ_INST_4_3() (READ_INST_8(2) >> 4 & 0xf) // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5654514f5e3Sopenharmony_ci#define READ_INST_8_0() READ_INST_8(1)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5664514f5e3Sopenharmony_ci#define READ_INST_8_1() READ_INST_8(2)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5674514f5e3Sopenharmony_ci#define READ_INST_8_2() READ_INST_8(3)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5684514f5e3Sopenharmony_ci#define READ_INST_8_3() READ_INST_8(4)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5694514f5e3Sopenharmony_ci#define READ_INST_8_4() READ_INST_8(5)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5704514f5e3Sopenharmony_ci#define READ_INST_8_5() READ_INST_8(6)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5714514f5e3Sopenharmony_ci#define READ_INST_8_6() READ_INST_8(7)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5724514f5e3Sopenharmony_ci#define READ_INST_8_7() READ_INST_8(8)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5734514f5e3Sopenharmony_ci#define READ_INST_8_8() READ_INST_8(9)              // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5744514f5e3Sopenharmony_ci#define READ_INST_8_9() READ_INST_8(10)             // NOLINT(hicpp-signed-bitwise, cppcoreguidelines-macro-usage)
5754514f5e3Sopenharmony_ci#define READ_INST_8(offset) (*(pc + (offset)))
5764514f5e3Sopenharmony_ci#define MOVE_AND_READ_INST_8(currentInst, offset) \
5774514f5e3Sopenharmony_ci    currentInst <<= 8;                            \
5784514f5e3Sopenharmony_ci    currentInst += READ_INST_8(offset);           \
5794514f5e3Sopenharmony_ci
5804514f5e3Sopenharmony_ci#define READ_INST_16_0() READ_INST_16(2)
5814514f5e3Sopenharmony_ci#define READ_INST_16_1() READ_INST_16(3)
5824514f5e3Sopenharmony_ci#define READ_INST_16_2() READ_INST_16(4)
5834514f5e3Sopenharmony_ci#define READ_INST_16_3() READ_INST_16(5)
5844514f5e3Sopenharmony_ci#define READ_INST_16_4() READ_INST_16(6)
5854514f5e3Sopenharmony_ci#define READ_INST_16_5() READ_INST_16(7)
5864514f5e3Sopenharmony_ci#define READ_INST_16_6() READ_INST_16(8)
5874514f5e3Sopenharmony_ci#define READ_INST_16_7() READ_INST_16(9)
5884514f5e3Sopenharmony_ci#define READ_INST_16(offset)                          \
5894514f5e3Sopenharmony_ci    ({                                                \
5904514f5e3Sopenharmony_ci        uint16_t currentInst = READ_INST_8(offset);   \
5914514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, offset - 1) \
5924514f5e3Sopenharmony_ci    })
5934514f5e3Sopenharmony_ci
5944514f5e3Sopenharmony_ci#define READ_INST_32_0() READ_INST_32(4)
5954514f5e3Sopenharmony_ci#define READ_INST_32_1() READ_INST_32(5)
5964514f5e3Sopenharmony_ci#define READ_INST_32_2() READ_INST_32(6)
5974514f5e3Sopenharmony_ci#define READ_INST_32(offset)                          \
5984514f5e3Sopenharmony_ci    ({                                                \
5994514f5e3Sopenharmony_ci        uint32_t currentInst = READ_INST_8(offset);   \
6004514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, offset - 1) \
6014514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, offset - 2) \
6024514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, offset - 3) \
6034514f5e3Sopenharmony_ci    })
6044514f5e3Sopenharmony_ci
6054514f5e3Sopenharmony_ci#define READ_INST_64_0()                       \
6064514f5e3Sopenharmony_ci    ({                                         \
6074514f5e3Sopenharmony_ci        uint64_t currentInst = READ_INST_8(8); \
6084514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, 7)   \
6094514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, 6)   \
6104514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, 5)   \
6114514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, 4)   \
6124514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, 3)   \
6134514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, 2)   \
6144514f5e3Sopenharmony_ci        MOVE_AND_READ_INST_8(currentInst, 1)   \
6154514f5e3Sopenharmony_ci    })
6164514f5e3Sopenharmony_ci
6174514f5e3Sopenharmony_ci#undef LOG_INST
6184514f5e3Sopenharmony_ci#undef HANDLE_OPCODE
6194514f5e3Sopenharmony_ci#undef ADVANCE_PC
6204514f5e3Sopenharmony_ci#undef GOTO_NEXT
6214514f5e3Sopenharmony_ci#undef DISPATCH
6224514f5e3Sopenharmony_ci#undef DISPATCH_OFFSET
6234514f5e3Sopenharmony_ci#undef GET_FRAME
6244514f5e3Sopenharmony_ci#undef GET_ENTRY_FRAME
6254514f5e3Sopenharmony_ci#undef SAVE_PC
6264514f5e3Sopenharmony_ci#undef SAVE_ACC
6274514f5e3Sopenharmony_ci#undef RESTORE_ACC
6284514f5e3Sopenharmony_ci#undef INTERPRETER_GOTO_EXCEPTION_HANDLER
6294514f5e3Sopenharmony_ci#undef CHECK_SWITCH_TO_DEBUGGER_TABLE
6304514f5e3Sopenharmony_ci#undef REAL_GOTO_DISPATCH_OPCODE
6314514f5e3Sopenharmony_ci#undef REAL_GOTO_EXCEPTION_HANDLER
6324514f5e3Sopenharmony_ci#undef INTERPRETER_RETURN_IF_ABRUPT
6334514f5e3Sopenharmony_ci#undef NOTIFY_DEBUGGER_EVENT
6344514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_INITIALIZE
6354514f5e3Sopenharmony_ci#undef CALL_PUSH_UNDEFINED
6364514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_0
6374514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_1
6384514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_2
6394514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_3
6404514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_RANGE
6414514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_THISRANGE
6424514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_0_NO_EXTRA
6434514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_1_NO_EXTRA
6444514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_2_NO_EXTRA
6454514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_3_NO_EXTRA
6464514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_RANGE_NO_EXTRA
6474514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS_THISRANGE_NO_EXTRA
6484514f5e3Sopenharmony_ci#undef DEPRECATED_CALL_PUSH_ARGS
6494514f5e3Sopenharmony_ci#undef UPDATE_HOTNESS_COUNTER_NON_ACC
6504514f5e3Sopenharmony_ci#undef UPDATE_HOTNESS_COUNTER
6514514f5e3Sopenharmony_ci#undef GET_VREG
6524514f5e3Sopenharmony_ci#undef GET_VREG_VALUE
6534514f5e3Sopenharmony_ci#undef SET_VREG
6544514f5e3Sopenharmony_ci#undef GET_ACC
6554514f5e3Sopenharmony_ci#undef SET_ACC
6564514f5e3Sopenharmony_ci#if defined(__clang__)
6574514f5e3Sopenharmony_ci#pragma clang diagnostic pop
6584514f5e3Sopenharmony_ci#elif defined(__GNUC__)
6594514f5e3Sopenharmony_ci#pragma GCC diagnostic pop
6604514f5e3Sopenharmony_ci#endif
6614514f5e3Sopenharmony_ci}  // namespace panda::ecmascript
6624514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_INTERPRETER_INTERPRETER_INL_H
663