Skip to content

Commit 044fd90

Browse files
committed
add python Source class wrapper for request_setBreakpoints
1 parent 15e7294 commit 044fd90

File tree

7 files changed

+57
-45
lines changed

7 files changed

+57
-45
lines changed

lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,36 @@ def dump_dap_log(log_file):
105105
print("========= END =========", file=sys.stderr)
106106

107107

108+
class Source(object):
109+
def __init__(
110+
self, path: Optional[str] = None, source_reference: Optional[int] = None
111+
):
112+
self._name = None
113+
self._path = None
114+
self._source_reference = None
115+
116+
if path is not None:
117+
self._name = os.path.basename(path)
118+
self._path = path
119+
elif source_reference is not None:
120+
self._source_reference = source_reference
121+
else:
122+
raise ValueError("Either path or source_reference must be provided")
123+
124+
def __str__(self):
125+
return f"Source(name={self.name}, path={self.path}), source_reference={self.source_reference})"
126+
127+
def as_dict(self):
128+
source_dict = {}
129+
if self._name is not None:
130+
source_dict["name"] = self._name
131+
if self._path is not None:
132+
source_dict["path"] = self._path
133+
if self._source_reference is not None:
134+
source_dict["sourceReference"] = self._source_reference
135+
return source_dict
136+
137+
108138
class DebugCommunication(object):
109139
def __init__(
110140
self,
@@ -551,14 +581,6 @@ def get_local_variable_child(
551581
return child
552582
return None
553583

554-
def get_source_for_source_reference(self, source_reference):
555-
return {"sourceReference": source_reference}
556-
557-
def get_source_for_path(self, file_path):
558-
(dir, base) = os.path.split(file_path)
559-
source_dict = {"name": base, "path": file_path}
560-
return source_dict
561-
562584
def replay_packets(self, replay_file_path):
563585
f = open(replay_file_path, "r")
564586
mode = "invalid"
@@ -956,13 +978,13 @@ def request_scopes(self, frameId):
956978
command_dict = {"command": "scopes", "type": "request", "arguments": args_dict}
957979
return self.send_recv(command_dict)
958980

959-
def request_setBreakpoints(self, source_dict, line_array, data=None):
981+
def request_setBreakpoints(self, source: Source, line_array, data=None):
960982
"""data is array of parameters for breakpoints in line_array.
961983
Each parameter object is 1:1 mapping with entries in line_entry.
962984
It contains optional location/hitCondition/logMessage parameters.
963985
"""
964986
args_dict = {
965-
"source": source_dict,
987+
"source": source.as_dict(),
966988
"sourceModified": False,
967989
}
968990
if line_array is not None:
@@ -1387,9 +1409,7 @@ def run_vscode(dbg, args, options):
13871409
else:
13881410
source_to_lines[path] = [int(line)]
13891411
for source in source_to_lines:
1390-
dbg.request_setBreakpoints(
1391-
dbg.get_source_for_path(source), source_to_lines[source]
1392-
)
1412+
dbg.request_setBreakpoints(Source(source), source_to_lines[source])
13931413
if options.funcBreakpoints:
13941414
dbg.request_setFunctionBreakpoints(options.funcBreakpoints)
13951415

lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import uuid
55

66
import dap_server
7+
from dap_server import Source
78
from lldbsuite.test.lldbtest import *
89
from lldbsuite.test import lldbplatformutil
910
import lldbgdbserverutils
@@ -56,7 +57,7 @@ def set_source_breakpoints(self, source_path, lines, data=None):
5657
It contains optional location/hitCondition/logMessage parameters.
5758
"""
5859
response = self.dap_server.request_setBreakpoints(
59-
self.dap_server.get_source_for_path(source_path), lines, data
60+
Source(source_path), lines, data
6061
)
6162
if response is None or not response["success"]:
6263
return []
@@ -68,7 +69,7 @@ def set_source_breakpoints(self, source_path, lines, data=None):
6869

6970
def set_source_breakpoints_assembly(self, source_reference, lines, data=None):
7071
response = self.dap_server.request_setBreakpoints(
71-
self.dap_server.get_source_for_source_reference(source_reference),
72+
Source(source_reference=source_reference),
7273
lines,
7374
data,
7475
)

lldb/test/API/tools/lldb-dap/breakpoint-assembly/TestDAP_breakpointAssembly.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55

66
from lldbsuite.test.decorators import *
7+
from dap_server import Source
78
import lldbdap_testcase
89

910

@@ -49,7 +50,7 @@ def test_break_on_invalid_source_reference(self):
4950

5051
# Verify that setting a breakpoint on an invalid source reference fails
5152
response = self.dap_server.request_setBreakpoints(
52-
self.dap_server.get_source_for_source_reference(-1), [1]
53+
Source(source_reference=-1), [1]
5354
)
5455
self.assertIsNotNone(response)
5556
breakpoints = response["body"]["breakpoints"]
@@ -66,7 +67,7 @@ def test_break_on_invalid_source_reference(self):
6667

6768
# Verify that setting a breakpoint on a source reference without a symbol also fails
6869
response = self.dap_server.request_setBreakpoints(
69-
self.dap_server.get_source_for_source_reference(0), [1]
70+
Source(source_reference=0), [1]
7071
)
7172
self.assertIsNotNone(response)
7273
breakpoints = response["body"]["breakpoints"]

lldb/test/API/tools/lldb-dap/breakpoint-events/TestDAP_breakpointEvents.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Test lldb-dap setBreakpoints request
33
"""
44

5-
import dap_server
5+
from dap_server import Source
66
from lldbsuite.test.decorators import *
77
from lldbsuite.test.lldbtest import *
88
from lldbsuite.test import lldbutil
@@ -58,7 +58,7 @@ def test_breakpoint_events(self):
5858
# Set breakpoints and verify that they got set correctly
5959
dap_breakpoint_ids = []
6060
response = self.dap_server.request_setBreakpoints(
61-
self.dap_server.get_source_for_path(main_source_path), [main_bp_line]
61+
Source(main_source_path), [main_bp_line]
6262
)
6363
self.assertTrue(response["success"])
6464
breakpoints = response["body"]["breakpoints"]
@@ -70,7 +70,7 @@ def test_breakpoint_events(self):
7070
)
7171

7272
response = self.dap_server.request_setBreakpoints(
73-
self.dap_server.get_source_for_path(foo_source_path), [foo_bp1_line]
73+
Source(foo_source_path), [foo_bp1_line]
7474
)
7575
self.assertTrue(response["success"])
7676
breakpoints = response["body"]["breakpoints"]

lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_setBreakpoints.py

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44

55

6-
import dap_server
6+
from dap_server import Source
77
import shutil
88
from lldbsuite.test.decorators import *
99
from lldbsuite.test.lldbtest import *
@@ -59,7 +59,7 @@ def test_source_map(self):
5959

6060
# breakpoint in main.cpp
6161
response = self.dap_server.request_setBreakpoints(
62-
self.dap_server.get_source_for_path(new_main_path), [main_line]
62+
Source(new_main_path), [main_line]
6363
)
6464
breakpoints = response["body"]["breakpoints"]
6565
self.assertEqual(len(breakpoints), 1)
@@ -71,7 +71,7 @@ def test_source_map(self):
7171

7272
# 2nd breakpoint, which is from a dynamically loaded library
7373
response = self.dap_server.request_setBreakpoints(
74-
self.dap_server.get_source_for_path(new_other_path), [other_line]
74+
Source(new_other_path), [other_line]
7575
)
7676
breakpoints = response["body"]["breakpoints"]
7777
breakpoint = breakpoints[0]
@@ -86,7 +86,7 @@ def test_source_map(self):
8686

8787
# 2nd breakpoint again, which should be valid at this point
8888
response = self.dap_server.request_setBreakpoints(
89-
self.dap_server.get_source_for_path(new_other_path), [other_line]
89+
Source(new_other_path), [other_line]
9090
)
9191
breakpoints = response["body"]["breakpoints"]
9292
breakpoint = breakpoints[0]
@@ -130,9 +130,7 @@ def test_set_and_clear(self):
130130
self.build_and_launch(program)
131131

132132
# Set 3 breakpoints and verify that they got set correctly
133-
response = self.dap_server.request_setBreakpoints(
134-
self.dap_server.get_source_for_path(self.main_path), lines
135-
)
133+
response = self.dap_server.request_setBreakpoints(Source(self.main_path), lines)
136134
line_to_id = {}
137135
breakpoints = response["body"]["breakpoints"]
138136
self.assertEqual(
@@ -157,9 +155,7 @@ def test_set_and_clear(self):
157155
lines.remove(second_line)
158156
# Set 2 breakpoints and verify that the previous breakpoints that were
159157
# set above are still set.
160-
response = self.dap_server.request_setBreakpoints(
161-
self.dap_server.get_source_for_path(self.main_path), lines
162-
)
158+
response = self.dap_server.request_setBreakpoints(Source(self.main_path), lines)
163159
breakpoints = response["body"]["breakpoints"]
164160
self.assertEqual(
165161
len(breakpoints),
@@ -204,9 +200,7 @@ def test_set_and_clear(self):
204200
# Now clear all breakpoints for the source file by passing down an
205201
# empty lines array
206202
lines = []
207-
response = self.dap_server.request_setBreakpoints(
208-
self.dap_server.get_source_for_path(self.main_path), lines
209-
)
203+
response = self.dap_server.request_setBreakpoints(Source(self.main_path), lines)
210204
breakpoints = response["body"]["breakpoints"]
211205
self.assertEqual(
212206
len(breakpoints),
@@ -226,9 +220,7 @@ def test_set_and_clear(self):
226220
# Now set a breakpoint again in the same source file and verify it
227221
# was added.
228222
lines = [second_line]
229-
response = self.dap_server.request_setBreakpoints(
230-
self.dap_server.get_source_for_path(self.main_path), lines
231-
)
223+
response = self.dap_server.request_setBreakpoints(Source(self.main_path), lines)
232224
if response:
233225
breakpoints = response["body"]["breakpoints"]
234226
self.assertEqual(
@@ -279,9 +271,7 @@ def test_clear_breakpoints_unset_breakpoints(self):
279271
self.build_and_launch(program)
280272

281273
# Set one breakpoint and verify that it got set correctly.
282-
response = self.dap_server.request_setBreakpoints(
283-
self.dap_server.get_source_for_path(self.main_path), lines
284-
)
274+
response = self.dap_server.request_setBreakpoints(Source(self.main_path), lines)
285275
line_to_id = {}
286276
breakpoints = response["body"]["breakpoints"]
287277
self.assertEqual(
@@ -297,9 +287,7 @@ def test_clear_breakpoints_unset_breakpoints(self):
297287
# Now clear all breakpoints for the source file by not setting the
298288
# lines array.
299289
lines = None
300-
response = self.dap_server.request_setBreakpoints(
301-
self.dap_server.get_source_for_path(self.main_path), lines
302-
)
290+
response = self.dap_server.request_setBreakpoints(Source(self.main_path), lines)
303291
breakpoints = response["body"]["breakpoints"]
304292
self.assertEqual(len(breakpoints), 0, "expect no source breakpoints")
305293

@@ -375,7 +363,7 @@ def test_column_breakpoints(self):
375363
# Set two breakpoints on the loop line at different columns.
376364
columns = [13, 39]
377365
response = self.dap_server.request_setBreakpoints(
378-
self.dap_server.get_source_for_path(self.main_path),
366+
Source(self.main_path),
379367
[loop_line, loop_line],
380368
list({"column": c} for c in columns),
381369
)

lldb/test/API/tools/lldb-dap/instruction-breakpoint/TestDAP_instruction_breakpoint.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import dap_server
1+
from dap_server import Source
22
import shutil
33
from lldbsuite.test.decorators import *
44
from lldbsuite.test.lldbtest import *
@@ -34,7 +34,7 @@ def instruction_breakpoint_test(self):
3434

3535
# Set source breakpoint 1
3636
response = self.dap_server.request_setBreakpoints(
37-
self.dap_server.get_source_for_path(self.main_path), [main_line]
37+
Source(self.main_path), [main_line]
3838
)
3939
breakpoints = response["body"]["breakpoints"]
4040
self.assertEqual(len(breakpoints), 1)

lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ BreakpointLocationsRequestHandler::GetAssemblyBreakpointLocations(
116116

117117
// start_line is relative to the symbol's start address
118118
lldb::SBInstructionList insts = symbol.GetInstructions(dap.target);
119+
if (insts.GetSize() > (start_line - 1))
120+
locations.reserve(insts.GetSize() - (start_line - 1));
119121
for (uint32_t i = start_line - 1; i < insts.GetSize() && i <= (end_line - 1);
120122
++i) {
121123
locations.emplace_back(i, 1);

0 commit comments

Comments
 (0)