diff options
author | Gregory Anders <8965202+gpanders@users.noreply.github.com> | 2024-08-17 22:28:03 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-17 22:28:03 -0500 |
commit | 33464189bc02b2555e26dc4e9f7b3fbbcdd02490 (patch) | |
tree | dc02581e731cf032650d2d856b72b0bfe61aeb75 | |
parent | d1bdeacb00186ba72fa61f3c7f2951fd018ae21d (diff) | |
download | rneovim-33464189bc02b2555e26dc4e9f7b3fbbcdd02490.tar.gz rneovim-33464189bc02b2555e26dc4e9f7b3fbbcdd02490.tar.bz2 rneovim-33464189bc02b2555e26dc4e9f7b3fbbcdd02490.zip |
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.
-rw-r--r-- | runtime/lua/vim/text.lua | 5 | ||||
-rw-r--r-- | test/functional/lua/text_spec.lua | 6 |
2 files changed, 8 insertions, 3 deletions
diff --git a/runtime/lua/vim/text.lua b/runtime/lua/vim/text.lua index 0be3396464..d45c8021c6 100644 --- a/runtime/lua/vim/text.lua +++ b/runtime/lua/vim/text.lua @@ -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 diff --git a/test/functional/lua/text_spec.lua b/test/functional/lua/text_spec.lua index 9e77953c8c..be471bfd62 100644 --- a/test/functional/lua/text_spec.lua +++ b/test/functional/lua/text_spec.lua @@ -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) |