fix(vim.text): handle very long strings (#30075)

Lua's string.byte has a maximum (undocumented) allowable length, so
vim.text.hencode fails on large strings with the error "string slice too
long".

Instead of converting the string to an array of bytes up front, convert
each character to a byte one at a time.
This commit is contained in:
Gregory Anders 2024-08-17 22:28:03 -05:00 committed by GitHub
parent d1bdeacb00
commit 33464189bc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 3 deletions

View File

@ -7,10 +7,9 @@ local M = {}
--- @param str string String to encode
--- @return string : Hex encoded string
function M.hexencode(str)
local bytes = { str:byte(1, #str) }
local enc = {} ---@type string[]
for i = 1, #bytes do
enc[i] = string.format('%02X', bytes[i])
for i = 1, #str do
enc[i] = string.format('%02X', str:byte(i, i + 1))
end
return table.concat(enc)
end

View File

@ -20,5 +20,11 @@ describe('vim.text', function()
eq(input, vim.text.hexdecode(output))
end
end)
it('works with very large strings', function()
local input, output = string.rep('😂', 2 ^ 16), string.rep('F09F9882', 2 ^ 16)
eq(output, vim.text.hexencode(input))
eq(input, vim.text.hexdecode(output))
end)
end)
end)