mirror of
https://github.com/neovim/neovim.git
synced 2025-10-05 01:16:31 +00:00
shada: Fix jump/change list merging code
Errors happens under following conditions: 1. Jump/change list is full. 2. New jump/change list item should go between some of the old ones.
This commit is contained in:
@@ -1213,10 +1213,10 @@ static inline bool marks_equal(const pos_T a, const pos_T b)
|
|||||||
if (i > 0) { \
|
if (i > 0) { \
|
||||||
if (jl_len == JUMPLISTSIZE) { \
|
if (jl_len == JUMPLISTSIZE) { \
|
||||||
free_func(jumps[0]); \
|
free_func(jumps[0]); \
|
||||||
if (i == JUMPLISTSIZE) { \
|
i--; \
|
||||||
i = JUMPLISTSIZE - 1; \
|
if (i > 0) { \
|
||||||
|
memmove(&jumps[0], &jumps[1], sizeof(jumps[1]) * (size_t) i); \
|
||||||
} \
|
} \
|
||||||
memmove(&jumps[0], &jumps[1], sizeof(jumps[1]) * (size_t) i); \
|
|
||||||
} else if (i != jl_len) { \
|
} else if (i != jl_len) { \
|
||||||
memmove(&jumps[i + 1], &jumps[i], \
|
memmove(&jumps[i + 1], &jumps[i], \
|
||||||
sizeof(jumps[0]) * (size_t) (jl_len - i)); \
|
sizeof(jumps[0]) * (size_t) (jl_len - i)); \
|
||||||
|
@@ -990,4 +990,46 @@ describe('ShaDa changes support code', function()
|
|||||||
end
|
end
|
||||||
eq(found, 100)
|
eq(found, 100)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('merges JUMPLISTSIZE changes when writing, with new items between old',
|
||||||
|
function()
|
||||||
|
nvim_command('edit /a/b/c')
|
||||||
|
nvim_command('keepjumps call setline(1, range(202))')
|
||||||
|
local shada = ''
|
||||||
|
for i = 1,101 do
|
||||||
|
local t = i * 2
|
||||||
|
shada = shada .. (
|
||||||
|
'\011\204%c\019\131\162mX\195\161f\196\006/a/b/c\161l\204%c'
|
||||||
|
):format(t, t)
|
||||||
|
end
|
||||||
|
wshada(shada)
|
||||||
|
eq(0, exc_exec(sdrcmd()))
|
||||||
|
local shada = ''
|
||||||
|
for i = 1,100 do
|
||||||
|
shada = shada .. ('\011%c\018\131\162mX\195\161f\196\006/a/b/c\161l%c'
|
||||||
|
):format(i, i)
|
||||||
|
end
|
||||||
|
local changes = {}
|
||||||
|
for i = 1, 100 do
|
||||||
|
changes[i] = {line=i}
|
||||||
|
end
|
||||||
|
for i = 1, 101 do
|
||||||
|
local t = i * 2
|
||||||
|
changes[(t > #changes + 1) and (#changes + 1) or t] = {line=t}
|
||||||
|
end
|
||||||
|
wshada(shada)
|
||||||
|
eq(0, exc_exec('wshada ' .. shada_fname))
|
||||||
|
local shift = #changes - 100
|
||||||
|
for i = 1,100 do
|
||||||
|
changes[i] = changes[i + shift]
|
||||||
|
end
|
||||||
|
local found = 0
|
||||||
|
for _, v in ipairs(read_shada_file(shada_fname)) do
|
||||||
|
if v.type == 11 and v.value.f == '/a/b/c' then
|
||||||
|
found = found + 1
|
||||||
|
eq(changes[found].line, v.value.l)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
eq(found, 100)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
Reference in New Issue
Block a user