1/*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef ECMASCRIPT_DEBUGGER_JS_PT_LOCATION_H
17#define ECMASCRIPT_DEBUGGER_JS_PT_LOCATION_H
18
19#include <cstring>
20
21#include "ecmascript/jspandafile/js_pandafile.h"
22#include "libpandafile/file.h"
23#include "libpandabase/macros.h"
24
25namespace panda::ecmascript::tooling {
26class JSPtLocation {
27public:
28    using EntityId = panda_file::File::EntityId;
29
30    JSPtLocation(const JSPandaFile *jsPandaFile, EntityId methodId, uint32_t bytecodeOffset,
31        const std::string &sourceFile = "") : jsPandaFile_(jsPandaFile), methodId_(methodId),
32        bytecodeOffset_(bytecodeOffset), sourceFile_(sourceFile)
33    {
34    }
35
36    const JSPandaFile *GetJsPandaFile() const
37    {
38        return jsPandaFile_;
39    }
40
41    const std::string &GetSourceFile() const
42    {
43        return sourceFile_;
44    }
45
46    EntityId GetMethodId() const
47    {
48        return methodId_;
49    }
50
51    uint32_t GetBytecodeOffset() const
52    {
53        return bytecodeOffset_;
54    }
55
56    bool operator==(const JSPtLocation &location) const
57    {
58        return methodId_ == location.methodId_ && bytecodeOffset_ == location.bytecodeOffset_ &&
59               jsPandaFile_ == location.jsPandaFile_;
60    }
61
62    std::string ToString() const
63    {
64        std::stringstream location;
65        location << "[";
66        location << "methodId:" << methodId_ << ", ";
67        location << "bytecodeOffset:" << bytecodeOffset_ << ", ";
68        location << "sourceFile:" << "\""<< sourceFile_ << "\""<< ", ";
69        location << "jsPandaFile:" << "\"" << jsPandaFile_->GetJSPandaFileDesc() << "\"";
70        location << "]";
71        return location.str();
72    }
73
74    ~JSPtLocation() = default;
75
76    DEFAULT_COPY_SEMANTIC(JSPtLocation);
77    DEFAULT_MOVE_SEMANTIC(JSPtLocation);
78
79private:
80    const JSPandaFile *jsPandaFile_ {nullptr};
81    EntityId methodId_;
82    uint32_t bytecodeOffset_ {0};
83    std::string sourceFile_; // mainly used for breakpoint
84};
85}  // namespace panda::ecmascript::tooling
86
87#endif  // ECMASCRIPT_DEBUGGER_JS_PT_LOCATION_H
88