|
18 | 18 | from dis import findlinestarts |
19 | 19 | from pyficache import code_line_info |
20 | 20 | from trepan.misc import wrapped_lines, pretty_modfunc_name |
| 21 | +from trepan.lib.stack import get_column_start_from_code |
21 | 22 | from trepan.processor.parse.semantics import build_bp_expr |
22 | 23 | from trepan.processor.parse.parser import LocationError |
23 | 24 | from trepan.processor.parse.scanner import ScannerError |
@@ -52,7 +53,7 @@ def set_break( |
52 | 53 | if isinstance(func_or_code, str): |
53 | 54 | func_or_code = code_map.get(func_or_code, func_or_code) |
54 | 55 | if not line_info: |
55 | | - linestarts = dict(findlinestarts(cmd_obj.proc.curframe.f_code)) |
| 56 | + linestarts = dict(findlinestarts(cmd_obj.curframe.f_code)) |
56 | 57 | if line_number not in linestarts.values(): |
57 | 58 | part1 = f"File {cmd_obj.core.filename(filename)}" |
58 | 59 | msg = wrapped_lines( |
@@ -102,18 +103,23 @@ def set_break( |
102 | 103 | ) |
103 | 104 | cmd_obj.msg(msg) |
104 | 105 | else: |
| 106 | + code = None |
105 | 107 | if hasattr(func_or_code, "co_name"): |
| 108 | + code = func_or_code |
106 | 109 | code_name = func_or_code.co_name |
107 | 110 | if not code_name.startswith("<"): |
108 | 111 | code_name += "()" |
109 | 112 | func_str = f" in {code_name}" |
110 | 113 | else: |
111 | 114 | func_str = "" |
112 | 115 | if bp.column is not None: |
113 | | - # Adjust 0-origin to 1-origin column numbers |
114 | | - column_str = f", column {bp.column + 1}" |
| 116 | + column_str = f", column {bp.column}" |
115 | 117 | else: |
116 | 118 | column_str = "" |
| 119 | + if offset is not None and offset >= 0: |
| 120 | + if code is not None: |
| 121 | + column_start = get_column_start_from_code(code, offset) |
| 122 | + column_str = f", column {column_start}" |
117 | 123 |
|
118 | 124 | part1 = (f"Breakpoint {bp.number} set at line " |
119 | 125 | f"{line_number}{column_str}{func_str} of file") |
@@ -196,15 +202,15 @@ def parse_break_cmd(proc, args): |
196 | 202 | cmdproc.setup() |
197 | 203 | # FIXME: we should not need ot set setting |
198 | 204 | cmdproc.settings = d.settings |
199 | | - set_break(cmdproc, "set_break", __file__, 50, True, False, []) |
| 205 | + set_break(cmdproc, "set_break", __file__, 51, True, False, []) |
200 | 206 | for cmd in ( |
201 | 207 | "break '''c:\\tmp\\foo.bat''':1", |
202 | 208 | 'break """/Users/My Documents/foo.py""":2', |
203 | 209 | "break", |
204 | 210 | "break 10", |
205 | 211 | "break if True", |
206 | 212 | f"break {__file__}:5", |
207 | | - f"break {__file__}:{cmdproc.frame.f_line_number}", |
| 213 | + f"break {__file__}:{cmdproc.frame.f_lineno}", |
208 | 214 | "break set_break()", |
209 | 215 | "break 4 if i==5", |
210 | 216 | "break cmdproc.setup()", |
|
0 commit comments