| //===-- SetExceptionBreakpointsRequestHandler.cpp -------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "DAP.h" |
| #include "EventHelper.h" |
| #include "JSONUtils.h" |
| #include "RequestHandler.h" |
| #include <set> |
| |
| namespace lldb_dap { |
| |
| // "SetExceptionBreakpointsRequest": { |
| // "allOf": [ { "$ref": "#/definitions/Request" }, { |
| // "type": "object", |
| // "description": "SetExceptionBreakpoints request; value of command field |
| // is 'setExceptionBreakpoints'. The request configures the debuggers |
| // response to thrown exceptions. If an exception is configured to break, a |
| // StoppedEvent is fired (event type 'exception').", "properties": { |
| // "command": { |
| // "type": "string", |
| // "enum": [ "setExceptionBreakpoints" ] |
| // }, |
| // "arguments": { |
| // "$ref": "#/definitions/SetExceptionBreakpointsArguments" |
| // } |
| // }, |
| // "required": [ "command", "arguments" ] |
| // }] |
| // }, |
| // "SetExceptionBreakpointsArguments": { |
| // "type": "object", |
| // "description": "Arguments for 'setExceptionBreakpoints' request.", |
| // "properties": { |
| // "filters": { |
| // "type": "array", |
| // "items": { |
| // "type": "string" |
| // }, |
| // "description": "IDs of checked exception options. The set of IDs is |
| // returned via the 'exceptionBreakpointFilters' capability." |
| // }, |
| // "exceptionOptions": { |
| // "type": "array", |
| // "items": { |
| // "$ref": "#/definitions/ExceptionOptions" |
| // }, |
| // "description": "Configuration options for selected exceptions." |
| // } |
| // }, |
| // "required": [ "filters" ] |
| // }, |
| // "SetExceptionBreakpointsResponse": { |
| // "allOf": [ { "$ref": "#/definitions/Response" }, { |
| // "type": "object", |
| // "description": "Response to 'setExceptionBreakpoints' request. This is |
| // just an acknowledgement, so no body field is required." |
| // }] |
| // } |
| void SetExceptionBreakpointsRequestHandler::operator()( |
| const llvm::json::Object &request) const { |
| llvm::json::Object response; |
| lldb::SBError error; |
| FillResponse(request, response); |
| const auto *arguments = request.getObject("arguments"); |
| const auto *filters = arguments->getArray("filters"); |
| // Keep a list of any exception breakpoint filter names that weren't set |
| // so we can clear any exception breakpoints if needed. |
| std::set<std::string> unset_filters; |
| for (const auto &bp : *dap.exception_breakpoints) |
| unset_filters.insert(bp.filter); |
| |
| for (const auto &value : *filters) { |
| const auto filter = GetAsString(value); |
| auto *exc_bp = dap.GetExceptionBreakpoint(std::string(filter)); |
| if (exc_bp) { |
| exc_bp->SetBreakpoint(); |
| unset_filters.erase(std::string(filter)); |
| } |
| } |
| for (const auto &filter : unset_filters) { |
| auto *exc_bp = dap.GetExceptionBreakpoint(filter); |
| if (exc_bp) |
| exc_bp->ClearBreakpoint(); |
| } |
| dap.SendJSON(llvm::json::Value(std::move(response))); |
| } |
| |
| } // namespace lldb_dap |