14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 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_DFX_STACKINFO_JS_STACKGETTER_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_DFX_STACKINFO_JS_STACKGETTER_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <csignal>
204514f5e3Sopenharmony_ci
214514f5e3Sopenharmony_ci#include "ecmascript/compiler/share_gate_meta_data.h"
224514f5e3Sopenharmony_ci#include "ecmascript/deoptimizer/deoptimizer.h"
234514f5e3Sopenharmony_ci#include "ecmascript/interpreter/frame_handler.h"
244514f5e3Sopenharmony_ci
254514f5e3Sopenharmony_cinamespace panda::ecmascript {
264514f5e3Sopenharmony_cienum class RunningState : size_t {
274514f5e3Sopenharmony_ci    OTHER = 0,
284514f5e3Sopenharmony_ci    GC,
294514f5e3Sopenharmony_ci    CINT,
304514f5e3Sopenharmony_ci    AINT,
314514f5e3Sopenharmony_ci    AOT,
324514f5e3Sopenharmony_ci    AINT_D,
334514f5e3Sopenharmony_ci    BUILTIN,
344514f5e3Sopenharmony_ci    NAPI,
354514f5e3Sopenharmony_ci    ARKUI_ENGINE,
364514f5e3Sopenharmony_ci    RUNTIME,
374514f5e3Sopenharmony_ci    JIT
384514f5e3Sopenharmony_ci};
394514f5e3Sopenharmony_ci
404514f5e3Sopenharmony_cistruct MethodKey {
414514f5e3Sopenharmony_ci    void *methodIdentifier = nullptr;
424514f5e3Sopenharmony_ci    RunningState state = RunningState::OTHER;
434514f5e3Sopenharmony_ci    kungfu::DeoptType deoptType = kungfu::DeoptType::NONE;
444514f5e3Sopenharmony_ci    int lineNumber = 0;
454514f5e3Sopenharmony_ci    bool operator < (const MethodKey &methodKey) const
464514f5e3Sopenharmony_ci    {
474514f5e3Sopenharmony_ci        return state < methodKey.state ||
484514f5e3Sopenharmony_ci               (state == methodKey.state && methodIdentifier < methodKey.methodIdentifier) ||
494514f5e3Sopenharmony_ci               (state == methodKey.state && methodIdentifier == methodKey.methodIdentifier &&
504514f5e3Sopenharmony_ci               deoptType < methodKey.deoptType) ||
514514f5e3Sopenharmony_ci               (state == methodKey.state && methodIdentifier == methodKey.methodIdentifier &&
524514f5e3Sopenharmony_ci               deoptType == methodKey.deoptType && lineNumber < methodKey.lineNumber);
534514f5e3Sopenharmony_ci    }
544514f5e3Sopenharmony_ci};
554514f5e3Sopenharmony_ci
564514f5e3Sopenharmony_cistruct NodeKey {
574514f5e3Sopenharmony_ci    struct MethodKey methodKey = {0};
584514f5e3Sopenharmony_ci    int parentId = 0;
594514f5e3Sopenharmony_ci    bool operator < (const NodeKey &nodeKey) const
604514f5e3Sopenharmony_ci    {
614514f5e3Sopenharmony_ci        return parentId < nodeKey.parentId ||
624514f5e3Sopenharmony_ci               (parentId == nodeKey.parentId && methodKey < nodeKey.methodKey);
634514f5e3Sopenharmony_ci    }
644514f5e3Sopenharmony_ci};
654514f5e3Sopenharmony_ci
664514f5e3Sopenharmony_cistruct FrameInfoTemp {
674514f5e3Sopenharmony_ci    char codeType[20] = {0}; // 20:the maximum size of the codeType
684514f5e3Sopenharmony_ci    char functionName[100] = {0}; // 100:the maximum size of the functionName
694514f5e3Sopenharmony_ci    char recordName[500] = {0}; // 500:the maximum size of the recordName
704514f5e3Sopenharmony_ci    int columnNumber = -1;
714514f5e3Sopenharmony_ci    int lineNumber = -1;
724514f5e3Sopenharmony_ci    int scriptId = 0;
734514f5e3Sopenharmony_ci    char url[500] = {0}; // 500:the maximum size of the url
744514f5e3Sopenharmony_ci    struct MethodKey methodKey = {0};
754514f5e3Sopenharmony_ci};
764514f5e3Sopenharmony_ci
774514f5e3Sopenharmony_ciclass JsStackGetter {
784514f5e3Sopenharmony_cipublic:
794514f5e3Sopenharmony_ci    static bool CheckFrameType(JSThread *thread, JSTaggedType *sp);
804514f5e3Sopenharmony_ci    static bool ParseMethodInfo(struct MethodKey &methodKey,
814514f5e3Sopenharmony_ci                                const FrameIterator &it,
824514f5e3Sopenharmony_ci                                const EcmaVM *vm,
834514f5e3Sopenharmony_ci                                FrameInfoTemp &codeEntry,
844514f5e3Sopenharmony_ci                                bool isCpuProfiler = false);
854514f5e3Sopenharmony_ci    static bool CheckAndCopy(char *dest, size_t length, const char *src);
864514f5e3Sopenharmony_ci    static void GetNativeStack(const EcmaVM *vm, const FrameIterator &it, char *functionName,
874514f5e3Sopenharmony_ci                               size_t size, bool isCpuProfiler);
884514f5e3Sopenharmony_ci    static RunningState GetRunningState(const FrameIterator &it, const EcmaVM *vm, bool isNative,
894514f5e3Sopenharmony_ci                                        bool topFrame, bool enableVMTag = false);
904514f5e3Sopenharmony_ci    static void GetNativeMethodCallPos(FrameIterator &it, FrameInfoTemp &codeEntry);
914514f5e3Sopenharmony_ci    static void *GetMethodIdentifier(Method *method, const FrameIterator &it);
924514f5e3Sopenharmony_ci    static void GetCallLineNumber(const FrameIterator &it, int &LineNumber);
934514f5e3Sopenharmony_ci};
944514f5e3Sopenharmony_ci} // namespace panda::ecmascript
954514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_DFX_STACKINFO_JS_STACKGETTER_H
96