From 5f0ad86489e5870094c402b94345498609ed3c04 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 3 Oct 2021 10:52:29 +0200 Subject: [PATCH] Format array like objects. --- Heady | Bin 316128 -> 0 bytes Testing.py | 24 - include/angelscriptDebugger.hpp | 1795 ------------------------------- src/ASVariableFormatter.cpp | 38 + src/ASVariableFormatter.hpp | 4 + 5 files changed, 42 insertions(+), 1819 deletions(-) delete mode 100755 Heady delete mode 100644 Testing.py delete mode 100644 include/angelscriptDebugger.hpp diff --git a/Heady b/Heady deleted file mode 100755 index 42266bd2da956b98bf3396be7f4b6434d042da20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316128 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 diff --git a/Testing.py b/Testing.py deleted file mode 100644 index 9a5328d..0000000 --- a/Testing.py +++ /dev/null @@ -1,24 +0,0 @@ -import socket -import sys - -# Create a TCP/IP socket -sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - -# Connect the socket to the port where the server is listening -server_address = ('localhost', 8684) -print(sys.stderr, 'connecting to %s port %s' % server_address) -sock.connect(server_address) - -def send(msg): - b = bytes(msg, "utf-8") - sock.send(bytes("Content-Length: " + str(len(b)) + "\r\n\r\n", "ascii")) - sock.send(b) - -send('{"seq": 1, "type": "request", "command": "setBreakpoints", "arguments": {' - '"source": {"path": "TestScript"},' - '"breakpoints": [{ "line": 14} ]' - '} }') - -while True: - msg = sock.recv(128) - print(msg.decode("utf-8")) \ No newline at end of file diff --git a/include/angelscriptDebugger.hpp b/include/angelscriptDebugger.hpp deleted file mode 100644 index bd20686..0000000 --- a/include/angelscriptDebugger.hpp +++ /dev/null @@ -1,1795 +0,0 @@ - - -// begin --- DebugAdapterProtocol --- - - - -// end --- DebugAdapterProtocol --- - - - -// begin --- AngelscriptDebugger.cpp --- - - - -// begin --- AngelscriptDebugger.hpp --- - -#ifndef ANGELSCRIPTDEBUGGER_ANGELSCRIPTDEBUGGER_HPP -#define ANGELSCRIPTDEBUGGER_ANGELSCRIPTDEBUGGER_HPP -#include -#include -#include -#include - -// begin --- Breakpoint.hpp --- - -#ifndef ANGELSCRIPTDEBUGGER_BREAKPOINT_HPP -#define ANGELSCRIPTDEBUGGER_BREAKPOINT_HPP -#include -#include - -struct Breakpoint { - std::string Section; - int32_t Line; - - bool operator==(const Breakpoint& other) const { return (Section == other.Section && Line == other.Line); } -}; - -namespace std { - - template <> struct hash { - std::size_t operator()(const Breakpoint& k) const { - using std::hash; - using std::size_t; - using std::string; - - return ((hash()(k.Section) ^ (hash()(k.Line) << 1)) >> 1); - } - }; -} - -#endif // ANGELSCRIPTDEBUGGER_BREAKPOINT_HPP - - -// end --- Breakpoint.hpp --- - - - -// begin --- BaseProtocol.hpp --- - -#ifndef ANGELSCRIPTDEBUGGER_BASEPROTOCOL_HPP -#define ANGELSCRIPTDEBUGGER_BASEPROTOCOL_HPP -#include -#include -#include -#include -#include - -// begin --- Utils.hpp --- - -#ifndef ANGELSCRIPTDEBUGGER_UTILS_HPP -#define ANGELSCRIPTDEBUGGER_UTILS_HPP - -#define JsonSerializeOptional(obj, field) \ - if (field.has_value()) \ - obj[#field] = field.value() - -#define JsonDeserializeOptional(obj, field) \ - if (!obj[#field].empty()) \ - field = obj[#field] - -#endif // ANGELSCRIPTDEBUGGER_UTILS_HPP - - -// end --- Utils.hpp --- - - - -namespace DebugAdapterProtocol { - static size_t current_sequence = 0; - struct ProtocolMessage { - explicit ProtocolMessage(std::string t) : seq(current_sequence++), type(std::move(t)) {} - ProtocolMessage(std::string t, size_t s) : seq(s), type(std::move(t)) {} - - size_t seq; - std::string type{"event"}; - - static ProtocolMessage* FromJson(nlohmann::json& j); - [[nodiscard]] virtual nlohmann::json ToJson() const { return {{"seq", seq}, {"type", type}}; } - - virtual ~ProtocolMessage() = default; - }; - - struct RequestArguments { - RequestArguments(){}; - explicit RequestArguments(nlohmann::json&) {} - virtual ~RequestArguments() = default; - virtual nlohmann::json ToJson() const { return nlohmann::json ::object(); } - }; - - struct Request : public ProtocolMessage { - Request() : ProtocolMessage("request") {} - virtual std::string GetCommand() const = 0; - virtual std::optional GetArguments() const = 0; - - static ProtocolMessage* FromJson(nlohmann::json& j); - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ProtocolMessage::ToJson(); - o["command"] = GetCommand(); - if (GetArguments().has_value()) { - o["body"] = GetArguments().value()->ToJson(); - } - return o; - } - }; - - template - concept IsRequestArguments = std::is_base_of::value; - - template struct DefinedRequest : public Request { - std::optional arguments; - - static ProtocolMessage* FromJson(nlohmann::json& j); - ~DefinedRequest() override { - if (arguments.has_value()) { - delete arguments.value(); - } - } - [[nodiscard]] std::string GetCommand() const override { return S; } - [[nodiscard]] std::optional GetArguments() const override { return arguments; } - }; - - struct EventBody { - EventBody() = default; - explicit EventBody(nlohmann::json&) {} - virtual ~EventBody() = default; - - [[nodiscard]] virtual nlohmann::json ToJson() const { return nlohmann::json::object(); }; - }; - - template - concept IsEventBody = std::is_base_of::value; - - template struct Event : public ProtocolMessage { - Event() : ProtocolMessage("event") {} - explicit Event(T* b) : ProtocolMessage("event"), body(b) {} - - std::optional body; - - ~Event() override { - if (body.has_value()) { - delete body.value(); - } - } - - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ProtocolMessage::ToJson(); - o["event"] = S; - if (body.has_value()) { - o["body"] = body.value()->ToJson(); - } - return o; - } - }; - - struct ResponseBody { - ResponseBody() = default; - explicit ResponseBody(nlohmann::json&) {} - virtual ~ResponseBody() = default; - - [[nodiscard]] virtual nlohmann::json ToJson() const { return nlohmann::json::object(); }; - }; - - template - concept IsResponseBody = std::is_base_of::value; - - struct Response : public ProtocolMessage { - Response(size_t seq) : ProtocolMessage("response", seq), request_seq(seq) {} - size_t request_seq; - bool success = true; - std::optional message; - - virtual std::string GetCommand() const = 0; - virtual std::optional GetBody() const = 0; - }; - - template struct DefinedResponse : public Response { - DefinedResponse(size_t seq) : Response(seq) {} - - std::optional body; - - [[nodiscard]] std::string GetCommand() const override { return S; } - [[nodiscard]] std::optional GetBody() const override { return body; } - - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ProtocolMessage::ToJson(); - o["request_seq"] = request_seq; - o["success"] = success; - o["command"] = GetCommand(); - JsonSerializeOptional(o, message); - if (body.has_value()) { - o["body"] = body.value()->ToJson(); - } - return o; - } - }; - -} -#endif // ANGELSCRIPTDEBUGGER_BASEPROTOCOL_HPP - - -// end --- BaseProtocol.hpp --- - - - -class AngelscriptDebugger { -public: - ~AngelscriptDebugger() { - _server->close(); - delete _server; - } - - void Run(uint16_t port); - void Stop() { _server->close(); } - - void RegisterContext(asIScriptContext* ctx); - void Continue() { - std::cout << "Continuing from suspension" << std::endl; - _storedVariableReferences.clear(); - while (!_pausedContexts.empty()) { - auto* ctx = _pausedContexts[_pausedContexts.size() - 1]; - _pausedContexts.pop_back(); - std::thread([](asIScriptContext* ctx) { ctx->Execute(); }, ctx).detach(); - } - } - bool HasDebuggerAttached() const { - for (const auto& c : _connections) { - if (c->is_open()) { - return true; - } - } - return false; - } - - size_t StoreVariable(void* address, int typeId, const std::optional>& release) { - _storedVariableReferences.emplace_back(std::make_unique(address, typeId, release)); - return _storedVariableReferences.size(); - } - -private: - static void on_line_callback(asIScriptContext* ctx, AngelscriptDebugger* dbg); - static void on_exception_callback(asIScriptContext* ctx, AngelscriptDebugger* d); - - void EnterBreakpoint(asIScriptContext* ctx, const std::string& section, size_t line); - - [[noreturn]] void AcceptLoop(); - void ClientLoop(asio::ip::tcp::socket&); - void Send(DebugAdapterProtocol::ProtocolMessage* msg); - void Send(asio::ip::tcp::socket* client, DebugAdapterProtocol::ProtocolMessage* msg); - void OnMessage(asio::ip::tcp::socket* client, DebugAdapterProtocol::ProtocolMessage* msg); - void OnRequest(asio::ip::tcp::socket* client, DebugAdapterProtocol::Request* msg); - std::string GetResolvedScriptPath(const char* scriptSection); - - asio::io_context _ioContext; - asio::ip::tcp::acceptor* _server; - std::unordered_set _connections; - - std::unordered_map> _breakpoints; - std::vector _pausedContexts; - std::optional _scriptPath; - - struct StackScope { - size_t StackLevel; - uint8_t Type; - - StackScope(size_t stackLevel, uint8_t type) : StackLevel(stackLevel), Type(type) {} - }; - struct PointerVariable { - void* Address; - int TypeID; - std::optional> Release; - - PointerVariable(void* address, int typeId, std::optional> release) - : Address(address), TypeID(typeId), Release(release) {} - ~PointerVariable() { - if (Release.has_value()) { - Release.value()(Address); - } - } - }; - - std::vector, std::unique_ptr>> _storedVariableReferences; -}; - -#endif // ANGELSCRIPTDEBUGGER_ANGELSCRIPTDEBUGGER_HPP - - -// end --- AngelscriptDebugger.hpp --- - - - -// begin --- ASVariableFormatter.hpp --- - -#ifndef ANGELSCRIPTDEBUGGER_ASVARIABLEFORMATTER_HPP -#define ANGELSCRIPTDEBUGGER_ASVARIABLEFORMATTER_HPP -#include - -// begin --- Types.hpp --- - -#ifndef ANGELSCRIPTDEBUGGER_TYPES_HPP -#define ANGELSCRIPTDEBUGGER_TYPES_HPP -#include -#include - -namespace DebugAdapterProtocol { - struct Source { - std::optional name; - std::optional path; - std::optional sourceReference; - - Source() {} - Source(std::string path) : path(path) {} - explicit Source(nlohmann::json& j) { - JsonDeserializeOptional(j, name); - JsonDeserializeOptional(j, path); - JsonDeserializeOptional(j, sourceReference); - } - - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o = nlohmann::json::object(); - JsonSerializeOptional(o, name); - JsonSerializeOptional(o, path); - JsonSerializeOptional(o, sourceReference); - return o; - } - }; - - struct Breakpoint { - std::optional id; - bool verified; - std::optional message; - std::optional source; - std::optional line; - std::optional column; - std::optional endLine; - std::optional endColumn; - std::optional instructionReference; - std::optional offset; - - Breakpoint(size_t id, Source& s, size_t line) : id(id), verified(true), source(s), line(line) {} - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o; - JsonSerializeOptional(o, id); - o["verified"] = verified; - JsonSerializeOptional(o, message); - if (source.has_value()) { - o["source"] = source.value().ToJson(); - } - JsonSerializeOptional(o, line); - JsonSerializeOptional(o, column); - JsonSerializeOptional(o, endLine); - JsonSerializeOptional(o, endColumn); - JsonSerializeOptional(o, instructionReference); - JsonSerializeOptional(o, offset); - return o; - } - }; - - struct BreakpointLocation { - size_t line; - std::optional column; - std::optional endLine; - std::optional endColumn; - }; - - struct SourceBreakpoint { - size_t line; - std::optional column; - std::optional condition; - std::optional hitCondition; - std::optional logMessage; - - SourceBreakpoint(nlohmann::json j) { - line = j["line"]; - JsonDeserializeOptional(j, column); - JsonDeserializeOptional(j, condition); - JsonDeserializeOptional(j, hitCondition); - JsonDeserializeOptional(j, logMessage); - } - - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o; - o["line"] = line; - JsonSerializeOptional(o, column); - JsonSerializeOptional(o, condition); - JsonSerializeOptional(o, hitCondition); - JsonSerializeOptional(o, logMessage); - return o; - } - }; - - struct Module { - std::string id; - std::string name; - std::optional path; - std::optional isOptimized; - std::optional isUserCode; - std::optional version; - std::optional symbolStatus; - std::optional symbolFilePath; - std::optional dateTimeStamp; - std::optional addressRange; - - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o; - o["id"] = id; - o["name"] = name; - JsonSerializeOptional(o, path); - JsonSerializeOptional(o, isOptimized); - JsonSerializeOptional(o, isUserCode); - JsonSerializeOptional(o, version); - JsonSerializeOptional(o, symbolStatus); - JsonSerializeOptional(o, symbolFilePath); - JsonSerializeOptional(o, dateTimeStamp); - JsonSerializeOptional(o, addressRange); - return o; - } - }; - - struct Thread { - size_t id; - std::string name; - Thread(size_t id, std::string name) : id(id), name(name) {} - - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o; - o["id"] = id; - o["name"] = name; - return o; - } - }; - - struct StackFrame { - size_t id; - std::string name; - std::optional source; - size_t line; - size_t column; - std::optional endLine; - std::optional endColumn; - std::optional canRestart = false; - std::optional instructionPointerReference; - - StackFrame(){}; - StackFrame(size_t id, std::string name, Source source, size_t line, size_t column) - : id(id), name(name), source(source), line(line), column(column) {} - - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o; - o["id"] = id; - o["name"] = name; - if (source.has_value()) { - o["source"] = source.value().ToJson(); - } - o["line"] = line; - o["column"] = column; - JsonSerializeOptional(o, endLine); - JsonSerializeOptional(o, endColumn); - JsonSerializeOptional(o, canRestart); - JsonSerializeOptional(o, instructionPointerReference); - return o; - } - }; - - struct Scope { - std::string name; - std::optional presentationHint; - size_t variablesReference; - size_t namedVariables; - size_t indexedVariables = 0; - bool expensive = false; - std::optional source; - std::optional line; - std::optional column; - std::optional endLine; - std::optional endColumn; - - Scope(std::string name, size_t reference, std::string presentationHint, size_t namedVariables) - : name(std::move(name)), presentationHint(std::move(presentationHint)), variablesReference(reference), - namedVariables(namedVariables) {} - - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o; - o["name"] = name; - JsonSerializeOptional(o, presentationHint); - o["variablesReference"] = variablesReference; - o["namedVariables"] = namedVariables; - o["indexedVariables"] = indexedVariables; - o["expensive"] = expensive; - if (source.has_value()) { - o["source"] = source.value().ToJson(); - } - JsonSerializeOptional(o, line); - JsonSerializeOptional(o, column); - JsonSerializeOptional(o, endLine); - JsonSerializeOptional(o, endColumn); - return o; - } - }; - - struct VariablePresentationHint { - std::optional kind; - std::optional> attributes; - std::optional visibility; - - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o; - JsonSerializeOptional(o, kind); - JsonSerializeOptional(o, attributes); - JsonSerializeOptional(o, visibility); - return o; - } - }; - - struct Variable { - std::string name; - std::string value; - std::optional type; - std::optional presentationHint; - std::optional evaluateName; - std::optional variablesReference = 0; - std::optional namedVariables = 0; - std::optional indexedVariables = 0; - std::optional memoryReference; - - [[nodiscard]] nlohmann::json ToJson() const { - nlohmann::json o; - o["name"] = name; - o["value"] = value; - JsonSerializeOptional(o, type); - if (presentationHint.has_value()) { - o["presentationHint"] = presentationHint.value().ToJson(); - } - JsonSerializeOptional(o, evaluateName); - JsonSerializeOptional(o, variablesReference); - JsonSerializeOptional(o, namedVariables); - JsonSerializeOptional(o, indexedVariables); - JsonSerializeOptional(o, memoryReference); - - return o; - } - - Variable(std::string name, std::string value, std::string type, - std::optional presentationHint = {}) - : name(std::move(name)), value(std::move(value)), type(std::move(type)), - presentationHint(presentationHint) {} - - static Variable FromString(std::string name, std::string value) { - return Variable( - name, value, "string", - VariablePresentationHint{.kind = "data", .attributes = std::vector{"rawString"}}); - } - - static Variable FromNull(std::string name, std::string type) { - return Variable(name, "null", type, - VariablePresentationHint{.kind = "data", .attributes = std::vector{}}); - } - - static Variable FromPointer(std::string name, std::string type, std::string display, size_t variableReference) { - auto v = Variable( - std::move(name), std::move(display), type, - VariablePresentationHint{.kind = "class", .attributes = std::vector{"hasObjectId"}}); - v.variablesReference = variableReference; - return v; - } - }; -} - -#endif // ANGELSCRIPTDEBUGGER_TYPES_HPP - - -// end --- Types.hpp --- - - - -class ASVariableFormatter { -public: - static nlohmann::json GetAsJsonValue(asIScriptEngine* engine, int, void*, int32_t depth = 0); - static DebugAdapterProtocol::Variable GetAsDAPVariable(asIScriptEngine* engine, asIScriptContext* ctx, - AngelscriptDebugger* debugger, const std::string& name, int, - void*); - static void GetChildDAPVariables(std::vector&, asIScriptEngine* engine, - asIScriptContext* ctx, AngelscriptDebugger* debugger, int, void*); -}; - -#endif // ANGELSCRIPTDEBUGGER_ASVARIABLEFORMATTER_HPP - - -// end --- ASVariableFormatter.hpp --- - - - -// begin --- Events.hpp --- - -#ifndef ANGELSCRIPTDEBUGGER_EVENTS_HPP -#define ANGELSCRIPTDEBUGGER_EVENTS_HPP - -namespace DebugAdapterProtocol { -#define EventDefinition(name, jsonName, ...) \ - static const char __c##name[] = jsonName; \ - struct name##EventBody : public EventBody __VA_ARGS__; \ - using name##Event = Event - - EventDefinition(Breakpoint, "breakpoint", { - std::string reason; - Breakpoint breakpoint; - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["reason"] = reason; - o["breakpoint"] = breakpoint.ToJson(); - return o; - } - }); - - EventDefinition(Continued, "continued", { - size_t threadId; - std::optional allThreadsContinued; - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["threadId"] = threadId; - JsonSerializeOptional(o, allThreadsContinued); - return o; - } - }); - - EventDefinition(Exited, "exited", { - int64_t exitCode; - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["exitCode"] = exitCode; - return o; - } - }); - - EventDefinition(Initialized, "initialized", {}); - - EventDefinition(Invalidated, "invalidated", { - std::optional> invalidatedAreas; - std::optional threadId; - std::optional stackFrameId; - - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - JsonSerializeOptional(o, invalidatedAreas); - JsonSerializeOptional(o, threadId); - JsonSerializeOptional(o, stackFrameId); - return o; - } - }); - - EventDefinition(LoadedSource, "loadedSource", { - std::string reason; - Source source; - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["reason"] = reason; - o["source"] = source.ToJson(); - return o; - } - }); - - EventDefinition(Memory, "memory", { - std::string memoryReference; - size_t offset; - size_t count; - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["memoryReference"] = memoryReference; - o["offset"] = offset; - o["count"] = count; - return o; - } - }); - - EventDefinition(Module, "module", { - std::string reason; - Module module; - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["reason"] = reason; - o["module"] = module.ToJson(); - return o; - } - }); - - EventDefinition(Output, "output", { - std::optional category; - std::string output; - std::optional group; - std::optional variablesReference; - std::optional source; - std::optional line; - std::optional column; - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - JsonSerializeOptional(o, category); - o["output"] = output; - JsonSerializeOptional(o, group); - JsonSerializeOptional(o, variablesReference); - if (source.has_value()) { - o["source"] = source.value().ToJson(); - } - JsonSerializeOptional(o, line); - JsonSerializeOptional(o, column); - return o; - } - }); - - EventDefinition(Process, "process", { - std::string name; - std::optional systemProcessId; - std::optional isLocalProcess; - std::optional startMethod; - std::optional pointerSize; - - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["name"] = name; - JsonSerializeOptional(o, systemProcessId); - JsonSerializeOptional(o, isLocalProcess); - JsonSerializeOptional(o, startMethod); - JsonSerializeOptional(o, pointerSize); - return o; - } - }); - - EventDefinition(ProgressEnd, "progressEnd", { - std::string progressId; - std::optional message; - - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["progressId"] = progressId; - JsonSerializeOptional(o, message); - return o; - } - }); - - EventDefinition(ProgressStart, "progressStart", { - std::string progressId; - std::string title; - std::optional requestId; - std::optional cancellable; - std::optional message; - std::optional percentage; - - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["progressId"] = progressId; - o["title"] = title; - JsonSerializeOptional(o, requestId); - JsonSerializeOptional(o, cancellable); - JsonSerializeOptional(o, message); - JsonSerializeOptional(o, percentage); - return o; - } - }); - - EventDefinition(ProgressUpdate, "progressUpdate", { - std::string progressId; - std::optional message; - std::optional percentage; - - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["progressId"] = progressId; - JsonSerializeOptional(o, message); - JsonSerializeOptional(o, percentage); - return o; - } - }); - - EventDefinition(Stopped, "stopped", { - std::string reason; - std::optional description; - std::optional number; - std::optional preserveFocusHint = false; - std::optional text; - std::optional allThreadsStopped = true; - std::optional> hitBreakpointIds; - - explicit StoppedEventBody(size_t breakpoint) { - reason = "breakpoint"; - hitBreakpointIds = {breakpoint}; - } - - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["reason"] = reason; - JsonSerializeOptional(o, description); - JsonSerializeOptional(o, number); - JsonSerializeOptional(o, preserveFocusHint); - JsonSerializeOptional(o, text); - JsonSerializeOptional(o, allThreadsStopped); - JsonSerializeOptional(o, hitBreakpointIds); - return o; - } - }); - - EventDefinition(terminated, "terminated", {}); - - EventDefinition(Thread, "thread", { - std::string reason; - std::optional threadId; - - nlohmann::json ToJson() const override { - auto o = EventBody::ToJson(); - o["reason"] = reason; - JsonSerializeOptional(o, threadId); - return o; - } - }); - -} - -#endif // ANGELSCRIPTDEBUGGER_EVENTS_HPP - - -// end --- Events.hpp --- - - - -// begin --- Requests.hpp --- - -#ifndef ANGELSCRIPTDEBUGGER_REQUESTS_HPP -#define ANGELSCRIPTDEBUGGER_REQUESTS_HPP -#include -#include -#include -#include - -namespace DebugAdapterProtocol { - -#define RequestDefinition(name, jsonName, ...) \ - static const char __c##name[] = jsonName; \ - struct name##Arguments : public RequestArguments __VA_ARGS__; \ - using name##Request = DefinedRequest - -#define RequestResponseDefinition(name, jsonName, ...) \ - static const char __cResponse##name[] = jsonName; \ - struct name##ResponseBody : public ResponseBody __VA_ARGS__; \ - using name##Response = DefinedResponse - -#define EmptyRequest(name, jsonName) \ - RequestDefinition(name, jsonName, {explicit name##Arguments(nlohmann::json & j) : RequestArguments(j){}}) - - RequestDefinition(Attach, "attach", { - size_t port; - std::string scriptPath; - - explicit AttachArguments(nlohmann::json & j) - : RequestArguments(j), port(j["port"]), scriptPath(j["scriptPath"]) {} - }); - - RequestDefinition(BreakpointLocations, "breakpointLocations", { - Source source; - size_t line; - std::optional column; - std::optional endLine; - std::optional endColumn; - BreakpointLocationsArguments() {} - explicit BreakpointLocationsArguments(nlohmann::json & j) - : RequestArguments(j), source(j["source"]), line(j["line"]) { - JsonDeserializeOptional(j, column); - JsonDeserializeOptional(j, endLine); - JsonDeserializeOptional(j, endColumn); - } - - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = RequestArguments::ToJson(); - o["source"] = source.ToJson(); - o["line"] = line; - JsonSerializeOptional(o, column); - JsonSerializeOptional(o, endLine); - JsonSerializeOptional(o, endColumn); - return o; - } - }); - - EmptyRequest(Completions, "completions"); - EmptyRequest(ConfigurationDone, "configurationDone"); - EmptyRequest(Continue, "continue"); - EmptyRequest(DataBreakpointInfo, "dataBreakpointInfo"); - EmptyRequest(Disassemble, "disassemble"); - - RequestDefinition(Disconnect, "disconnect", { - std::optional restart; - std::optional terminateDebuggee; - std::optional suspendDebuggee; - - explicit DisconnectArguments(nlohmann::json & j) : RequestArguments(j) { - JsonDeserializeOptional(j, restart); - JsonDeserializeOptional(j, terminateDebuggee); - JsonDeserializeOptional(j, suspendDebuggee); - } - }); - - EmptyRequest(Evaluate, "evaluate"); - EmptyRequest(ExceptionInfo, "exceptionInfo"); - EmptyRequest(Goto, "goto"); - EmptyRequest(GotoTargets, "gotoTargets"); - EmptyRequest(Initialize, "initialize"); - RequestResponseDefinition(Initialize, "initialize", { - std::optional supportsConfigurationDoneRequest = true; - std::optional supportsFunctionBreakpoints; - std::optional supportsConditionalBreakpoints; - std::optional supportsHitConditionalBreakpoints; - std::optional supportsEvaluateForHovers; - std::optional supportsStepBack; - std::optional supportsSetVariable; - std::optional supportsRestartFrame; - std::optional supportsGotoTargetsRequest; - std::optional supportsStepInTargetsRequest; - std::optional supportsCompletionsRequest; - std::optional supportsModulesRequest; - std::optional supportsRestartRequest; - std::optional supportsExceptionOptions; - std::optional supportsValueFormattingOptions; - std::optional supportsExceptionInfoRequest; - std::optional supportTerminateDebuggee; - std::optional supportSuspendDebuggee; - std::optional supportsDelayedStackTraceLoading; - std::optional supportsLoadedSourcesRequest; - std::optional supportsLogPoints; - std::optional supportsTerminateThreadsRequest; - std::optional supportsSetExpression; - std::optional supportsTerminateRequest; - std::optional supportsDataBreakpoints; - std::optional supportsReadMemoryRequest; - std::optional supportsWriteMemoryRequest; - std::optional supportsDisassembleRequest; - std::optional supportsCancelRequest; - std::optional supportsBreakpointLocationsRequest; - std::optional supportsClipboardContext; - std::optional supportsSteppingGranularity; - std::optional supportsInstructionBreakpoints; - std::optional supportsExceptionFilterOptions; - - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ResponseBody::ToJson(); - JsonSerializeOptional(o, supportsConfigurationDoneRequest); - JsonSerializeOptional(o, supportsFunctionBreakpoints); - JsonSerializeOptional(o, supportsConditionalBreakpoints); - JsonSerializeOptional(o, supportsHitConditionalBreakpoints); - JsonSerializeOptional(o, supportsEvaluateForHovers); - JsonSerializeOptional(o, supportsStepBack); - JsonSerializeOptional(o, supportsSetVariable); - JsonSerializeOptional(o, supportsRestartFrame); - JsonSerializeOptional(o, supportsGotoTargetsRequest); - JsonSerializeOptional(o, supportsStepInTargetsRequest); - JsonSerializeOptional(o, supportsCompletionsRequest); - JsonSerializeOptional(o, supportsModulesRequest); - JsonSerializeOptional(o, supportsRestartRequest); - JsonSerializeOptional(o, supportsExceptionOptions); - JsonSerializeOptional(o, supportsValueFormattingOptions); - JsonSerializeOptional(o, supportsExceptionInfoRequest); - JsonSerializeOptional(o, supportTerminateDebuggee); - JsonSerializeOptional(o, supportSuspendDebuggee); - JsonSerializeOptional(o, supportsDelayedStackTraceLoading); - JsonSerializeOptional(o, supportsLoadedSourcesRequest); - JsonSerializeOptional(o, supportsLogPoints); - JsonSerializeOptional(o, supportsTerminateThreadsRequest); - JsonSerializeOptional(o, supportsSetExpression); - JsonSerializeOptional(o, supportsTerminateRequest); - JsonSerializeOptional(o, supportsDataBreakpoints); - JsonSerializeOptional(o, supportsReadMemoryRequest); - JsonSerializeOptional(o, supportsWriteMemoryRequest); - JsonSerializeOptional(o, supportsDisassembleRequest); - JsonSerializeOptional(o, supportsCancelRequest); - JsonSerializeOptional(o, supportsBreakpointLocationsRequest); - JsonSerializeOptional(o, supportsClipboardContext); - JsonSerializeOptional(o, supportsSteppingGranularity); - JsonSerializeOptional(o, supportsInstructionBreakpoints); - JsonSerializeOptional(o, supportsExceptionFilterOptions); - return o; - } - }); - - EmptyRequest(Launch, "launch"); - EmptyRequest(LoadedSources, "loadedSources"); - EmptyRequest(Modules, "modules"); - EmptyRequest(Next, "next"); - EmptyRequest(Pause, "pause"); - EmptyRequest(ReadMemory, "readMemory"); - EmptyRequest(Restart, "restart"); - EmptyRequest(RestartFrame, "restartFrame"); - EmptyRequest(ReverseContinue, "reverseContinue"); - - RequestDefinition(Scopes, "scopes", { - size_t frameId; - explicit ScopesArguments(nlohmann::json & j) : RequestArguments(j), frameId(j["frameId"]) {} - }); - RequestResponseDefinition(Scopes, "scopes", { - std::vector scopes; - - ScopesResponseBody(const std::vector& scopes) : scopes(scopes) {} - - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ResponseBody::ToJson(); - o["scopes"] = nlohmann::json::array(); - for (auto& t : scopes) { - o["scopes"].push_back(t.ToJson()); - } - return o; - } - }); - - RequestDefinition(SetBreakpoints, "setBreakpoints", { - Source source; - std::optional> breakpoints; - std::optional sourceModified; - - explicit SetBreakpointsArguments(nlohmann::json & j) : RequestArguments(j), source(j["source"]) { - if (!j["breakpoints"].empty()) { - std::vector v; - for (auto& i : j["breakpoints"]) { - v.emplace_back(i); - } - breakpoints = v; - } - JsonDeserializeOptional(j, sourceModified); - } - }); - RequestResponseDefinition(SetBreakpoints, "setBreakpoints", { - std::vector breakpoints; - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ResponseBody::ToJson(); - o["breakpoints"] = nlohmann::json::array(); - for (auto& bp : breakpoints) { - o["breakpoints"].push_back(bp.ToJson()); - } - return o; - } - }); - - EmptyRequest(SetDataBreakpoints, "setDataBreakpoints"); - EmptyRequest(SetExceptionBreakpoints, "setExceptionBreakpoints"); - EmptyRequest(SetExpression, "setExpression"); - EmptyRequest(SetFunctionBreakpoints, "setFunctionBreakpoints"); - EmptyRequest(SetInstructionBreakpoints, "setInstructionBreakpoints"); - EmptyRequest(SetVariable, "setVariable"); - EmptyRequest(Source, "source"); - EmptyRequest(StackTrace, "stackTrace"); - - RequestResponseDefinition(StackTrace, "stackTrace", { - std::vector stackFrames; - std::optional totalFrames; - - StackTraceResponseBody(std::vector stackFrames) - : stackFrames(stackFrames), totalFrames(stackFrames.size()) {} - - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ResponseBody::ToJson(); - o["stackFrames"] = nlohmann::json::array(); - for (auto& t : stackFrames) { - o["stackFrames"].push_back(t.ToJson()); - } - JsonSerializeOptional(o, totalFrames); - return o; - } - }); - - EmptyRequest(StepBack, "stepBack"); - EmptyRequest(StepIn, "stepIn"); - EmptyRequest(StepInTargets, "stepInTargets"); - EmptyRequest(StepOut, "stepOut"); - - RequestDefinition(Terminate, "terminate", { - std::optional restart; - explicit TerminateArguments(nlohmann::json & j) : RequestArguments(j), restart(j["restart"]) {} - }); - - EmptyRequest(TerminateThreads, "terminateThreads"); - RequestResponseDefinition(Threads, "threads", { - std::vector threads; - - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ResponseBody::ToJson(); - o["threads"] = nlohmann::json::array(); - for (auto& t : threads) { - o["threads"].push_back(t.ToJson()); - } - return o; - } - }); - - EmptyRequest(Threads, "threads"); - - RequestDefinition(Variables, "variables", { - size_t variablesReference; - - explicit VariablesArguments(nlohmann::json & j) - : RequestArguments(j), variablesReference(j["variablesReference"]) {} - }); - RequestResponseDefinition(Variables, "variables", { - std::vector variables; - - VariablesResponseBody(const std::vector& v) : variables(v) {} - - [[nodiscard]] nlohmann::json ToJson() const override { - auto o = ResponseBody::ToJson(); - o["variables"] = nlohmann::json::array(); - for (auto& t : variables) { - o["variables"].push_back(t.ToJson()); - } - return o; - } - }); - - EmptyRequest(WriteMemory, "writeMemory"); - -#undef EmptyRequest -#undef RequestDefinition -} - -#endif // ANGELSCRIPTDEBUGGER_REQUESTS_HPP - - -// end --- Requests.hpp --- - - - -void AngelscriptDebugger::Run(uint16_t port) { - // Listen on port 9012 - _server = new asio::ip::tcp::acceptor(_ioContext, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)); - std::thread([this]() { AcceptLoop(); }).detach(); -} - -template std::string string_format(const std::string& format, Args... args) { - int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; // Extra space for '\0' - if (size_s <= 0) { - throw std::runtime_error("Error during formatting."); - } - auto size = static_cast(size_s); - auto buf = std::make_unique(size); - std::snprintf(buf.get(), size, format.c_str(), args...); - return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside -} - -std::string AngelscriptDebugger::GetResolvedScriptPath(const char* scriptSection) { - if (_scriptPath.has_value()) { - return string_format(_scriptPath.value(), scriptSection); - } - return scriptSection; -} - -void AngelscriptDebugger::on_line_callback(asIScriptContext* ctx, AngelscriptDebugger* d) { - if (ctx->GetState() == asEXECUTION_SUSPENDED) { - return; - } - const char* scriptSection = nullptr; - int column = 0; - int line = ctx->GetLineNumber(0, &column, &scriptSection); - if (line == 0) - return; - - auto resolvedScriptPath = d->GetResolvedScriptPath(scriptSection); - auto sectionBreakpoints = d->_breakpoints.find(resolvedScriptPath); - if (sectionBreakpoints != d->_breakpoints.end()) { - if (sectionBreakpoints->second.contains(line)) { - d->EnterBreakpoint(ctx, resolvedScriptPath, line); - } - } -} - -size_t GetBreakpointHash(const std::string& section, size_t line) { - using std::hash; - using std::size_t; - using std::string; - - return ((hash()(section) ^ (hash()(line) << 1)) >> 1); -} - -void AngelscriptDebugger::on_exception_callback(asIScriptContext*, AngelscriptDebugger*) { - return; - // const char* scriptSection = nullptr; - // int column = 0; - // int line = ctx->GetExceptionLineNumber(&column, &scriptSection); - // if (line == 0) - // return; - // auto b = Breakpoint{.Section = scriptSection, .Line = line}; - // d->EnterBreakpoint(ctx, b); -} - -void AngelscriptDebugger::EnterBreakpoint(asIScriptContext* ctx, const std::string& section, size_t line) { - ctx->Suspend(); - _pausedContexts.push_back(ctx); - - auto* o = new DebugAdapterProtocol::StoppedEvent( - new DebugAdapterProtocol::StoppedEventBody(GetBreakpointHash(section, line))); - - Send(o); -} - -void AngelscriptDebugger::RegisterContext(asIScriptContext* ctx) { - ctx->SetLineCallback(asFUNCTION(on_line_callback), this, asCALL_CDECL); - ctx->SetExceptionCallback(asFUNCTION(on_exception_callback), this, asCALL_CDECL); -} - -[[noreturn]] void AngelscriptDebugger::AcceptLoop() { - while (true) { - auto* client = new asio::ip::tcp::socket(_ioContext); - _server->accept(*client); - std::thread([this, client]() { ClientLoop(*client); }).detach(); - } -} - -inline std::string trim(const std::string& s) { - auto wsfront = std::find_if_not(s.begin(), s.end(), [](int c) { return std::isspace(c); }); - auto wsback = std::find_if_not(s.rbegin(), s.rend(), [](int c) { return std::isspace(c); }).base(); - return (wsback <= wsfront ? std::string() : std::string(wsfront, wsback)); -} - -void AngelscriptDebugger::ClientLoop(asio::ip::tcp::socket& client) { - std::unordered_map headers; - bool in_header_mode = true; - asio::streambuf buffer; - while (true) { - if (!client.is_open()) { - break; - } - if (client.available() == 0 && buffer.size() == 0) { - continue; - } - if (client.available() > 0 && buffer.size() == 0) { - asio::error_code error; - asio::read_until(client, buffer, "\r\n", error); - } - - if (in_header_mode) { - std::istream str(&buffer); - std::string s; - std::getline(str, s); - if (s == "\r") { - if (headers.contains("content-length")) { - in_header_mode = false; - } - continue; - } - auto delimiter = s.find(':'); - std::string key = trim(s.substr(0, delimiter)); - std::transform(key.begin(), key.end(), key.begin(), [](unsigned char c) { return std::tolower(c); }); - std::string value = trim(s.substr(delimiter + 1)); - headers[key] = value; - } else { - auto contentLength = headers["content-length"]; - auto size = (size_t)std::strtol(contentLength.c_str(), nullptr, 10); - std::cout << "message length: " << size << std::endl; - std::stringstream msg; - int64_t to_fetch = (int64_t)size - (int64_t)buffer.size(); - auto to_read = std::min(buffer.size(), size); - asio::streambuf::const_buffers_type constBuffer = buffer.data(); - std::copy(asio::buffers_begin(constBuffer), asio::buffers_end(constBuffer), - std::ostream_iterator(msg)); - buffer.consume(to_read); - if (to_fetch > 0) { - std::vector v(to_fetch); - asio::read(client, asio::buffer(v), asio::transfer_exactly(to_fetch)); - msg << std::string(v.begin(), v.end()); - } - - auto m = msg.str(); - std::cout << "found message: " << m << std::endl; - nlohmann::json j = nlohmann::json::parse(m.begin(), m.end()); - auto protocolMessage = DebugAdapterProtocol::ProtocolMessage::FromJson(j); - OnMessage(&client, protocolMessage); - - in_header_mode = true; - } - } -} - -void AngelscriptDebugger::Send(DebugAdapterProtocol::ProtocolMessage* msg) { - auto body = msg->ToJson().dump(); - std::vector vec(body.begin(), body.end()); - for (const auto& conn : _connections) { - if (conn->is_open()) { - asio::error_code ignored_error; - asio::write(*conn, asio::buffer("Content-Length: " + std::to_string(vec.size()) + "\r\n\r\n"), - ignored_error); - asio::write(*conn, asio::buffer(vec), ignored_error); - } - } - std::cout << "Sent message: " << body << std::endl; - delete msg; -} - -void AngelscriptDebugger::Send(asio::ip::tcp::socket* client, DebugAdapterProtocol::ProtocolMessage* msg) { - auto body = msg->ToJson().dump(); - std::vector vec(body.begin(), body.end()); - if (client->is_open()) { - asio::error_code ignored_error; - asio::write(*client, asio::buffer("Content-Length: " + std::to_string(vec.size()) + "\r\n\r\n"), ignored_error); - asio::write(*client, asio::buffer(vec), ignored_error); - } - std::cout << "Sent message: " << body << std::endl; - delete msg; -} - -void AngelscriptDebugger::OnMessage(asio::ip::tcp::socket* client, DebugAdapterProtocol::ProtocolMessage* msg) { - if (msg->type == "request") { - OnRequest(client, dynamic_cast(msg)); - } - delete msg; -} - -const char empty[] = ""; -void AngelscriptDebugger::OnRequest(asio::ip::tcp::socket* client, DebugAdapterProtocol::Request* msg) { - if (msg->GetCommand() == "setBreakpoints") { - auto* t = dynamic_cast(msg); - auto& args = t->arguments.value(); - auto& path = args->source.path.value(); - auto* response = new DebugAdapterProtocol::SetBreakpointsResponse(msg->seq); - auto* body = new DebugAdapterProtocol::SetBreakpointsResponseBody(); - response->body = body; - std::unordered_set sectionBreakpoints; - if (args->breakpoints.has_value()) { - for (auto& bp : args->breakpoints.value()) { - sectionBreakpoints.insert(bp.line); - body->breakpoints.emplace_back(GetBreakpointHash(path, bp.line), args->source, bp.line); - } - } - _breakpoints[path] = sectionBreakpoints; - Send(client, response); - } else if (msg->GetCommand() == "initialize") { - auto response = new DebugAdapterProtocol::InitializeResponse(msg->seq); - auto* body = new DebugAdapterProtocol::InitializeResponseBody(); - response->body = body; - Send(client, response); - - auto r = new DebugAdapterProtocol::InitializedEvent(); - Send(client, r); - - } else if (msg->GetCommand() == "disconnect") { - auto response = new DebugAdapterProtocol::DefinedResponse(msg->seq); - Send(client, response); - _connections.erase(client); - } else if (msg->GetCommand() == "configurationDone") { - _connections.insert(client); - Send(client, new DebugAdapterProtocol::DefinedResponse(msg->seq)); - } else if (msg->GetCommand() == "attach") { - auto t = dynamic_cast(msg); - _scriptPath = t->arguments.value()->scriptPath; - Send(client, new DebugAdapterProtocol::DefinedResponse(msg->seq)); - } else if (msg->GetCommand() == "threads") { - auto response = new DebugAdapterProtocol::ThreadsResponse(msg->seq); - auto* body = new DebugAdapterProtocol::ThreadsResponseBody(); - response->body = body; - body->threads = {DebugAdapterProtocol::Thread(0, "main")}; - Send(client, response); - } else if (msg->GetCommand() == "continue") { - Continue(); - Send(client, new DebugAdapterProtocol::DefinedResponse(msg->seq)); - } else if (msg->GetCommand() == "stackTrace") { - auto ctx = _pausedContexts[0]; - auto response = new DebugAdapterProtocol::StackTraceResponse(msg->seq); - auto stackTrace = std::vector(); - stackTrace.reserve(ctx->GetCallstackSize()); - for (asUINT i = 0; i < ctx->GetCallstackSize(); ++i) { - auto func = ctx->GetFunction(i); - const char* scriptSection = nullptr; - int column = 0; - int line = ctx->GetLineNumber(i, &column, &scriptSection); - - stackTrace.emplace_back(i, func->GetName(), - DebugAdapterProtocol::Source(GetResolvedScriptPath(scriptSection)), line, column); - } - auto body = new DebugAdapterProtocol::StackTraceResponseBody(stackTrace); - response->body = body; - Send(client, response); - } else if (msg->GetCommand() == "scopes") { - auto t = dynamic_cast(msg); - auto ctx = _pausedContexts[0]; - auto response = new DebugAdapterProtocol::ScopesResponse(msg->seq); - auto scopes = std::vector(); - auto frameId = t->arguments.value()->frameId; - auto varCount = 0; - for (int i = 0; i < ctx->GetVarCount(t->arguments.value()->frameId); ++i) { - if (ctx->IsVarInScope(i, frameId)) { - varCount++; - } - } - _storedVariableReferences.emplace_back(std::make_unique(frameId, 0)); - scopes.emplace_back("Locals", _storedVariableReferences.size(), "locals", varCount); - auto body = new DebugAdapterProtocol::ScopesResponseBody(scopes); - response->body = body; - Send(client, response); - } else if (msg->GetCommand() == "variables") { - auto t = dynamic_cast(msg); - auto ctx = _pausedContexts[0]; - auto response = new DebugAdapterProtocol::VariablesResponse(msg->seq); - auto variables = std::vector(); - auto reference = t->arguments.value()->variablesReference - 1; - if (reference >= _storedVariableReferences.size() || reference < 0) - return; - - auto& variant = _storedVariableReferences[reference]; - auto e = ctx->GetEngine(); - // We currently can't use asIScriptContext::PushBack on suspended script contexts due to limitations in - // angelscript. Hence we make a new contenxt - auto c = e->CreateContext(); - - if (holds_alternative>(variant)) { - auto frameId = std::get>(variant)->StackLevel; - // auto scopeType = get(variant).Type; - auto varCount = ctx->GetVarCount(frameId); - for (int i = 0; i < varCount; ++i) { - if (!ctx->IsVarInScope(i, frameId)) { - continue; - } - auto name = ctx->GetVarName(i, frameId); - auto type = ctx->GetVarTypeId(i, frameId); - auto val = ctx->GetAddressOfVar(i, frameId); - variables.push_back(ASVariableFormatter::GetAsDAPVariable(e, c, this, name, type, val)); - } - } else { - auto& v = std::get>(variant); - try { - ASVariableFormatter::GetChildDAPVariables(variables, e, c, this, v->TypeID, v->Address); - } catch (const std::exception& e) { - std::cout << e.what() << std::endl; - } - } - c->Release(); - auto body = new DebugAdapterProtocol::VariablesResponseBody(variables); - response->body = body; - Send(client, response); - } else { - Send(client, new DebugAdapterProtocol::DefinedResponse(msg->seq)); - } -} - - -// end --- AngelscriptDebugger.cpp --- - - - -// begin --- BaseProtocol.cpp --- - - - -namespace DebugAdapterProtocol { - ProtocolMessage* ProtocolMessage::FromJson(nlohmann::json& j) { - auto t = j["type"]; - ProtocolMessage* msg; - if (t == "request") { - msg = Request::FromJson(j); - } else if (t == "event") { - throw std::logic_error("Unhandled type"); - // msg = Event::FromJson(j); - } else if (t == "response") { - msg = Response::FromJson(j); - } else { - throw std::logic_error("Unknown type"); - } - msg->type = t; - msg->seq = j["seq"]; - return msg; - } - - template ProtocolMessage* DefinedRequest::FromJson(nlohmann::json& j) { - std::string c = j["command"]; - auto o = new DefinedRequest(); - auto a = j["arguments"]; - if (!a.empty()) { - o->arguments = dynamic_cast(new T(a)); - } - return o; - } - ProtocolMessage* Request::FromJson(nlohmann::json& j) { - std::string c = j["command"]; - // This is the worst, we need to fix this eventually. - if (c == "attach") - return AttachRequest::FromJson(j); - if (c == "breakpointLocations") - return BreakpointLocationsRequest::FromJson(j); - if (c == "completions") - return CompletionsRequest::FromJson(j); - if (c == "configurationDone") - return ConfigurationDoneRequest ::FromJson(j); - if (c == "continue") - return ContinueRequest ::FromJson(j); - if (c == "dataBreakpointInfo") - return DataBreakpointInfoRequest ::FromJson(j); - if (c == "disassemble") - return DisassembleRequest ::FromJson(j); - if (c == "disconnect") - return DisconnectRequest ::FromJson(j); - if (c == "evaluate") - return EvaluateRequest ::FromJson(j); - if (c == "exceptionInfo") - return ExceptionInfoRequest ::FromJson(j); - if (c == "Goto") - return GotoRequest ::FromJson(j); - if (c == "GotoTargets") - return GotoTargetsRequest ::FromJson(j); - if (c == "initialize") - return InitializeRequest ::FromJson(j); - if (c == "launch") - return LaunchRequest ::FromJson(j); - if (c == "loadedSources") - return LoadedSourcesRequest ::FromJson(j); - if (c == "modules") - return ModulesRequest ::FromJson(j); - if (c == "next") - return NextRequest ::FromJson(j); - if (c == "pause") - return PauseRequest ::FromJson(j); - if (c == "readMemory") - return ReadMemoryRequest ::FromJson(j); - if (c == "restart") - return RestartRequest ::FromJson(j); - if (c == "restartFrame") - return RestartFrameRequest ::FromJson(j); - if (c == "reverseContinue") - return RestartFrameRequest ::FromJson(j); - if (c == "scopes") - return ScopesRequest ::FromJson(j); - if (c == "setBreakpoints") - return SetBreakpointsRequest ::FromJson(j); - if (c == "setDataBreakpoints") - return SetDataBreakpointsRequest ::FromJson(j); - if (c == "setExceptionBreakpoints") - return SetExceptionBreakpointsRequest ::FromJson(j); - if (c == "setExpression") - return SetExpressionRequest ::FromJson(j); - if (c == "setFunctionBreakpoints") - return SetFunctionBreakpointsRequest ::FromJson(j); - if (c == "setInstructionBreakpoints") - return SetInstructionBreakpointsRequest ::FromJson(j); - if (c == "setVariable") - return SetVariableRequest ::FromJson(j); - if (c == "source") - return SourceRequest ::FromJson(j); - if (c == "stackTrace") - return StackTraceRequest ::FromJson(j); - if (c == "stepBack") - return StepBackRequest ::FromJson(j); - if (c == "stepIn") - return StepInRequest ::FromJson(j); - if (c == "stepInTargets") - return StepInTargetsRequest ::FromJson(j); - if (c == "stepOut") - return StepOutRequest ::FromJson(j); - if (c == "terminate") - return TerminateRequest ::FromJson(j); - if (c == "terminateThreads") - return TerminateThreadsRequest ::FromJson(j); - if (c == "threads") - return ThreadsRequest ::FromJson(j); - if (c == "variables") - return VariablesRequest ::FromJson(j); - if (c == "writeMemory") - return WriteMemoryRequest ::FromJson(j); - throw std::logic_error("Unknown command"); - } -} - -// end --- BaseProtocol.cpp --- - - - -// begin --- ASVariableFormatter.cpp --- - - -#include - -DebugAdapterProtocol::Variable ASVariableFormatter::GetAsDAPVariable(asIScriptEngine* engine, asIScriptContext* ctx, - AngelscriptDebugger* debugger, - const std::string& name, int type, void* address) { - if ((type & asTYPEID_OBJHANDLE) != 0) { - address = *static_cast(address); - } - switch (type) { - case asTYPEID_BOOL: { - auto v = *static_cast(address); - return {name, v ? "true" : "false", "bool"}; - }; - - case asTYPEID_INT8: { - auto v = *static_cast(address); - return {name, std::to_string(v), "int8"}; - }; - case asTYPEID_INT16: { - auto v = *static_cast(address); - return {name, std::to_string(v), "int16"}; - } - case asTYPEID_INT32: { - auto v = *static_cast(address); - return {name, std::to_string(v), "int32"}; - }; - case asTYPEID_INT64: { - auto v = *static_cast(address); - return {name, std::to_string(v), "int64"}; - }; - - case asTYPEID_UINT8: { - auto v = *static_cast(address); - return {name, std::to_string(v), "uint8"}; - }; - case asTYPEID_UINT16: { - auto v = *static_cast(address); - return {name, std::to_string(v), "uint16"}; - }; - case asTYPEID_UINT32: { - auto v = *static_cast(address); - return {name, std::to_string(v), "uint32"}; - }; - case asTYPEID_UINT64: { - auto v = *static_cast(address); - return {name, std::to_string(v), "uint64"}; - }; - - case asTYPEID_FLOAT: { - auto v = *static_cast(address); - return {name, std::to_string(v), "float"}; - }; - case asTYPEID_DOUBLE: { - auto v = *static_cast(address); - return {name, std::to_string(v), "double"}; - }; - - default: break; - } - if ((type & asTYPEID_SCRIPTOBJECT) != 0) { - auto* obj = static_cast(address); - std::string typeName = engine->GetTypeInfoById(type)->GetName(); - if (obj == nullptr) { - return DebugAdapterProtocol::Variable::FromNull(name, typeName); - } - auto typeData = obj->GetObjectType(); - std::string stringified = typeName + "(*" + std::to_string((size_t)address) + ")"; - auto stringifiedFunc = typeData->GetMethodByDecl("string opImplConv()"); - if (stringifiedFunc != nullptr) { - ctx->PushState(); - ctx->Prepare(stringifiedFunc); - ctx->SetObject(address); - if (ctx->Execute() == asEXECUTION_FINISHED) { - stringified = *(std::string*)ctx->GetAddressOfReturnValue(); - } - ctx->PopState(); - } - - size_t reference = 0; - if (obj->GetPropertyCount() > 0) { - std::cout << "Storing scriptObj " << name << std::endl; - obj->AddRef(); - reference = debugger->StoreVariable(address, type, [](void* a) { - if (a != nullptr) { - ((asIScriptObject*)a)->Release(); - } - }); - } - return DebugAdapterProtocol::Variable::FromPointer(name, typeName, stringified, reference); - } - // TODO: Caching of type id - if (type == engine->GetTypeIdByDecl("string")) { - auto* str = static_cast(address); - if (str == nullptr) { - return DebugAdapterProtocol::Variable::FromNull(name, "string"); - } - return DebugAdapterProtocol::Variable::FromString(name, "\"" + *str + "\""); - } - auto* typeData = engine->GetTypeInfoById(type); - if ((typeData->GetFlags() & asOBJ_ENUM) != 0) { - const auto* enumValue = typeData->GetEnumValueByIndex(*static_cast(address), nullptr); - return {name, enumValue, typeData->GetName()}; - } - - if (address == nullptr) { - return DebugAdapterProtocol::Variable::FromNull(name, typeData->GetName()); - } - - std::string stringified = std::string(typeData->GetName()) + "(*" + std::to_string((size_t)address) + ")"; - auto stringifiedFunc = typeData->GetMethodByDecl("string opImplConv()"); - if (stringifiedFunc != nullptr) { - ctx->Prepare(stringifiedFunc); - ctx->SetObject(*(void**)address); - if (ctx->Execute() == asEXECUTION_FINISHED) { - stringified = "\"" + *(std::string*)ctx->GetAddressOfReturnValue() + "\""; - } - } - - size_t reference = 0; - size_t varCount = typeData->GetPropertyCount(); - for (asUINT i = 0; i < typeData->GetMethodCount(); ++i) { - if (typeData->GetMethodByIndex(i, true)->IsProperty()) { - varCount++; - } - } - if (varCount > 0) { - - // If we want to re-use an object, we need to make sure to add a reference to it, so it doesn't get accidentally - // cleaned up. This is currently somewhat clunky, we look up the AddRef behaviour, and execute that in a new - // context. - auto b = static_cast(-1); - asIScriptFunction* releaseFunc = nullptr; - bool hasAddRef = false; - for (asUINT i = 0; i < typeData->GetBehaviourCount(); ++i) { - auto* f = typeData->GetBehaviourByIndex(i, &b); - if (b == asBEHAVE_ADDREF) { - // If we push state or re-use the active context, we might lose the reference to the object we have. - // To resolve this we need a new context. - auto* c = ctx->GetEngine()->CreateContext(); - assert(c->Prepare(f) >= 0); - assert(c->SetObject(address) >= 0); - assert(c->Execute() >= 0); - c->Release(); - hasAddRef = true; - } - if (b == asBEHAVE_RELEASE) { - releaseFunc = f; - } - } - if (!hasAddRef) { - releaseFunc = nullptr; - } - - reference = debugger->StoreVariable(address, type, [engine, releaseFunc](void* a) { - if (releaseFunc != nullptr) { - auto* c = engine->CreateContext(); - c->Prepare(releaseFunc); - c->SetObject(a); - c->Execute(); - c->Release(); - } - }); - } - return DebugAdapterProtocol::Variable::FromPointer(name, typeData->GetName(), stringified, reference); -} -void ASVariableFormatter::GetChildDAPVariables(std::vector& vars, - asIScriptEngine* engine, asIScriptContext* ctx, - AngelscriptDebugger* debugger, int type, void* address) { - if (address == nullptr) { - return; - } - - if ((type & asTYPEID_SCRIPTOBJECT) != 0) { - auto* obj = static_cast(address); - for (asUINT i = 0; i < obj->GetPropertyCount(); ++i) { - const auto* propertyName = obj->GetPropertyName(i); - auto propertyType = obj->GetPropertyTypeId(i); - auto* propertyAddress = obj->GetAddressOfProperty(i); - vars.push_back(GetAsDAPVariable(engine, ctx, debugger, propertyName, propertyType, propertyAddress)); - } - return; - } - - auto* typeData = engine->GetTypeInfoById(type); - for (asUINT i = 0; i < typeData->GetPropertyCount(); ++i) { - const char* propertyName = nullptr; - int propertyType = 0; - int offset = 0; - - typeData->GetProperty(i, &propertyName, &propertyType, nullptr, nullptr, &offset); - vars.push_back( - GetAsDAPVariable(engine, ctx, debugger, propertyName, propertyType, (void*)((size_t)address + offset))); - } - for (asUINT i = 0; i < typeData->GetMethodCount(); ++i) { - auto func = typeData->GetMethodByIndex(i, true); - if (func->IsProperty()) { - assert(ctx->Prepare(func) >= 0); - ctx->SetObject(address); - auto state = ctx->Execute(); - if (state == asEXECUTION_FINISHED) { - auto name = std::string(func->GetName()).substr(4); - vars.push_back(GetAsDAPVariable(engine, ctx, debugger, name, func->GetReturnTypeId(), - ctx->GetAddressOfReturnValue())); - } - } - } -} - - -// end --- ASVariableFormatter.cpp --- - diff --git a/src/ASVariableFormatter.cpp b/src/ASVariableFormatter.cpp index ed4c969..b50f289 100644 --- a/src/ASVariableFormatter.cpp +++ b/src/ASVariableFormatter.cpp @@ -164,6 +164,23 @@ DebugAdapterProtocol::Variable ASVariableFormatter::GetAsDAPVariable(asIScriptEn } return DebugAdapterProtocol::Variable::FromPointer(name, typeData->GetName(), stringified, reference); } + +template +void ASVariableFormatter::FormatArrayLike(std::vector& vars, asIScriptEngine* engine, + asIScriptContext* ctx, void* address, AngelscriptDebugger* debugger, + asIScriptFunction* indexFunc) { + auto length = (ctx->*GetLength)(); + for (T i = 0; i < length; ++i) { + assert(ctx->Prepare(indexFunc) >= 0); + ctx->SetObject(address); + (ctx->*SetArg)(0, i); + ctx->Execute(); + auto name = std::to_string(i); + vars.push_back(GetAsDAPVariable(engine, ctx, debugger, name, indexFunc->GetReturnTypeId(), + ctx->GetAddressOfReturnValue())); + } +} + void ASVariableFormatter::GetChildDAPVariables(std::vector& vars, asIScriptEngine* engine, asIScriptContext* ctx, AngelscriptDebugger* debugger, int type, void* address) { @@ -205,4 +222,25 @@ void ASVariableFormatter::GetChildDAPVariables(std::vectorGetMethodByName("get_opIndex", true); + if (indexFunc != nullptr && indexFunc->GetParamCount() == 1) { + auto lengthFunc = typeData->GetMethodByName("get_Length", true); + int t; + indexFunc->GetParam(0, &t); + if (lengthFunc != nullptr && lengthFunc->GetParamCount() == 0 && lengthFunc->GetReturnTypeId() == t) { + assert(ctx->Prepare(lengthFunc) >= 0); + ctx->SetObject(address); + ctx->Execute(); + if (t == asTYPEID_UINT64) { + FormatArrayLike( + vars, engine, ctx, address, debugger, indexFunc); + } + else if (t == asTYPEID_INT32){ + FormatArrayLike( + vars, engine, ctx, address, debugger, indexFunc); + } + } + // vars.push_back(DebugAdapterProtocol::Variable("has_indexer", "true", "string", {})); + } } diff --git a/src/ASVariableFormatter.hpp b/src/ASVariableFormatter.hpp index ec3fad2..af8d175 100644 --- a/src/ASVariableFormatter.hpp +++ b/src/ASVariableFormatter.hpp @@ -11,6 +11,10 @@ public: static DebugAdapterProtocol::Variable GetAsDAPVariable(asIScriptEngine* engine, asIScriptContext* ctx, AngelscriptDebugger* debugger, const std::string& name, int, void*); + template + static void FormatArrayLike(std::vector& vars, asIScriptEngine* engine, + asIScriptContext* ctx, void* address, AngelscriptDebugger* debugger, + asIScriptFunction* indexFunc); static void GetChildDAPVariables(std::vector&, asIScriptEngine* engine, asIScriptContext* ctx, AngelscriptDebugger* debugger, int, void*); };