//===-- 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 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 unset_filters; for (const auto &bp : *dap.exception_breakpoints) unset_filters.insert(bp.GetFilter()); 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