diff --git a/lib/gdb_commands.py b/lib/gdb_commands.py index 7b7d9b0..04803d8 100644 --- a/lib/gdb_commands.py +++ b/lib/gdb_commands.py @@ -145,7 +145,7 @@ def _get_breaks(self, fname: str): try: for path, line, bid in self._get_breaks_provider(): - if fname == os.path.normpath(path): + if fname.endswith(os.path.normpath(path)): breaks.setdefault(line, []).append(bid) except AttributeError: self.fallback_to_parsing = True @@ -178,15 +178,41 @@ def _enum_breaks_fallback(self): # on the second line if the screen is too narrow. bid = None response = gdb.execute('info breakpoints', False, True) - for line in re.split(r"[\n\r]+", response): - fields = re.split(r"[\s]+", line) - if len(fields) >= 5 and re.match("0x[0-9a-zA-Z]+", fields[4]): - if fields[3] != 'y': # Is enabled? - bid = None - else: - bid = re.match("[^.]+", fields[0]).group(0) + column_idx = {} + header = response.splitlines()[0] + contents = response.splitlines()[1:] + + for f in re.finditer(r"(\w+)\s*", header): + s, e, str = f.start(), f.end(), f.group(1) + e = None if e == len(header) else e + column_idx[str] = (s, e) + + def get_column_value(line, column_name): + if column_name not in column_idx: + return "" + s, e = column_idx[column_name] + return line[s:e].strip() + + last_enabled = False + + for line in contents: + bid, enabled, address, what = ( + get_column_value(line, "Num"), + get_column_value(line, "Enb"), + get_column_value(line, "Address"), + get_column_value(line, "What"), + ) + + if enabled == '': + enabled = last_enabled + + if not bid or enabled != 'y' or re.match(r"0x[0-9a-zA-Z]+", address) is None: + continue + + bid = bid.split(".")[0] + fields = re.split(r"\s+", what) if len(fields) >= 2 and fields[-2] == "at": # file.cpp:line m = re.match(r"^([^:]+):(\d+)$", fields[-1]) diff --git a/test/10_generic_spec.lua b/test/10_generic_spec.lua index 23a8057..b62c543 100644 --- a/test/10_generic_spec.lua +++ b/test/10_generic_spec.lua @@ -31,7 +31,13 @@ describe("generic", function() local function check_signs(signs) -- different for different compilers - return vim.deep_equal(signs, {cur = 'test.cpp:17'}) or vim.deep_equal(signs, {cur = 'test.cpp:19'}) + local lines = {17, 19, 20} + for _, line in ipairs(lines) do + if vim.deep_equal(signs, {cur = 'test.cpp:' .. line}) then + return true + end + end + return false end assert.is_true(eng.wait_for(eng.get_signs, check_signs)) @@ -70,7 +76,7 @@ describe("generic", function() eng.feed('') assert.is_true(eng.wait_running(5000)) eng.feed(':GdbInterrupt\n') - if not utils.is_windows then + if utils.is_linux then assert.is_true(eng.wait_signs({cur = 'test.cpp:22'})) else -- Most likely to break in the kernel code @@ -180,7 +186,22 @@ describe("generic", function() eng.feed('n') assert.is_true(eng.wait_signs({cur = 'test.cpp:19'})) eng.feed('') - assert.is_true(eng.wait_signs({cur = 'test.cpp:17'})) + + if utils.is_darwin then + local function check_signs(signs) + -- different for different compilers + local lines = {17, 20} + for _, line in ipairs(lines) do + if vim.deep_equal(signs, {cur = 'test.cpp:' .. line}) then + return true + end + end + return false + end + assert.is_true(eng.wait_for(eng.get_signs, check_signs)) + else + assert.is_true(eng.wait_signs({cur = 'test.cpp:17'})) + end end) end) diff --git a/test/all.py b/test/all.py index 44a0371..f416135 100755 --- a/test/all.py +++ b/test/all.py @@ -36,6 +36,8 @@ Prerequisites() test_cmd = ["nvim", "-l", "run-tests.lua", ".", "--no-keep-going"] + # Use the following command to see neovim screen + # test_cmd = ["python", "nvim.py", "+luafile main.lua"] print(f"Run `{' '.join(test_cmd)}`") res = subprocess.run(test_cmd) if res.returncode != 0: diff --git a/utils/testenv_darwin.py b/utils/testenv_darwin.py index 734e7bd..82fb33d 100644 --- a/utils/testenv_darwin.py +++ b/utils/testenv_darwin.py @@ -1,4 +1,5 @@ import os +import platform import subprocess import urllib.request @@ -16,14 +17,17 @@ def __init__(self, url: str): subprocess.run('pip install --user six', shell=True, check=True) - urllib.request.urlretrieve(f"{url}/nvim-macos.tar.gz", - "nvim-macos.tar.gz") + # Macos may be running on arm64 + machine = platform.machine() + + urllib.request.urlretrieve(f"{url}/nvim-macos-{machine}.tar.gz", + f"nvim-macos-{machine}.tar.gz") subprocess.run( - r''' -tar -xf nvim-macos.tar.gz + f''' +tar -xf nvim-macos-{machine}.tar.gz cat >"$HOME/bin/nvim" <