aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval/typval.c
Commit message (Collapse)AuthorAge
* vim-patch:partial:9.2.1145: repeat() can cause an integer overflowzeertzjq2026-09-30
| | | | | | | | | | | | Problem: repeat() with a large number can cause an overflow (Yuyao Jiang) Solution: Add overflow check for the various repeat() functions. related: vim/vim#21373 https://github.com/vim/vim/commit/70903d2be29ddf759ea55cfa6d343c026ea04779 Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:9.2.1139: list2blob() can be improved (#42138)zeertzjq2026-09-29
| | | | | | | | | | | | | | | Problem: list2blob() appends one byte at a time. Solution: Preallocate the buffer and write the bytes directly (Yasuhiro Matsumoto). Cover large conversions, descending ranges, and invalid trailing items. All 33 blob tests pass. Local five-run medians improve by 17% for 4096 items and 19% for 65536 items. closes: vim/vim#21385 https://github.com/vim/vim/commit/c77608d35e899a0103d022fb9edb19c58ea00396 Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
* docs: misc #41452Justin M. Keyes2026-08-23
| | | | | Co-authored-by: darkdi <rantovov5@gmail.com> Co-authored-by: Qiaoxi Guo <28090444+breadtitor@users.noreply.github.com> Co-authored-by: zaveshaa <zaveshaa@gmail.com>
* vim-patch:9.2.0945: sort() with a numeric option can be improvedzeertzjq2026-08-13
| | | | | | | | | | | | | | | | Problem: The comments on the precomputed sort keys explain the code by contrasting it with the previous implementation, and one of them exceeds 80 columns (after v9.2.0937). Solution: Drop the redundant comments and shorten the union member ones (Hirohito Higashi). related: vim/vim#21003 closes: vim/vim#21030 https://github.com/vim/vim/commit/722f4292e55d48520b7e32cabb4b8640293d0977 Co-authored-by: Hirohito Higashi <h.east.727@gmail.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* vim-patch:9.2.0937: sort() with a numeric option converts each item on every ↵zeertzjq2026-08-12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | comparison (#41286) Problem: sort() with "n", "N" or "f" converts an item to its number on every comparison. For "n" that is a tv2string() plus strtod() per comparison, so sorting a list of numbers turns each number into a string and back O(n log n) times, dwarfing the sort. Solution: Compute the numeric key of each item once, before the sort, and compare the stored key (Samuel Schlesinger). Only the builtin numeric compare modes are affected; uniq(), which passes a bare list item to the compare function, and the string and user-function paths are unchanged. Sorting a list of 100000 numbers (min of 3, macOS arm64): - sort(l, 'n'): 0.205s -> 0.017s - sort(l, 'N'): 0.017s -> 0.010s - sort(l, 'f'): 0.014s -> 0.010s The result is identical, including that a string is still treated as 0 in "n" mode and that "N" keeps full 64-bit precision. Add Test_sort_numeric_precomputed(): a large shuffled list sorted with "n", mixed integers and floats, int64 values beyond the exact range of a double for "N", and uniq() over the non-precomputed path. closes: vim/vim#21003 https://github.com/vim/vim/commit/c8c59db9dfdc2db5f17aa0a78ea1464f035bdf5e Co-authored-by: Samuel Schlesinger <sgschlesinger@gmail.com> Co-authored-by: Claude <noreply@anthropic.com>
* vim-patch:8.2.1475: Vim9: can't use v:true for option flags (#41249)Jan Edmund Lazo2026-08-09
| | | | | | | | | | | | | | | | | | | | Problem: Vim9: can't use v:true for option flags. Solution: Add tv_get_bool_chk(). (closes vim/vim#6725) ---- "tv_get_bool_or_number_chk()" without vim9 params is identical to "tv_get_number_chk()". "tv_get_number_chk()" and tv"_get_bool_chk()" are identical after excluding new vim9 params. Yes, "want_bool" param is N/A because of "in_vim9script()". If I port it, then I will refactor these macros or "static inline" functions within "src/nvim/eval/typval.h". ---- https://github.com/vim/vim/commit/36967b32fd02eaab4273c1a1e7a1210a5fe45d09 Co-authored-by: Bram Moolenaar <Bram@vim.org>
* vim-patch:8.2.1478: Vim9: cannot use "true" for some popup options (#41236)Jan Edmund Lazo2026-08-08
| | | | | | | | Problem: Vim9: cannot use "true" for some popup options. Solution: Add dict_get_bool(). (closes vim/vim#6725) https://github.com/vim/vim/commit/558813314d63dd0263a7a86c0496c1e89b5c8cba Co-authored-by: Bram Moolenaar <Bram@vim.org>
* fix(options): ":set foo?" for Lua callbacks #41100Justin M. Keyes2026-08-01
| | | | | | | | | | | | | | | | | Problem: `:set foo=<tab>` and `:set foo?` for func/expr options set to a Lua function, always displays "v:lua". The existing "<Lua N: file:line>" form was avoided because the ref id N changes on every read of the same option. Solution: - Don't attempt to tab-complete Lua functions. - Show "<Lua file:line>" (or "<Lua>" if source file is unknown). Example: :set operatorfunc? operatorfunc=<Lua ~/.config/nvim/init.lua:42>
* feat(options): lua closure/function optionsJustin M. Keyes2026-07-31
| | | | | | | | | | | | | | | Problem: Cannot assign Lua functions/closures to "func" ('completefunc', 'tagfun', …) or "expr" ('foldexpr', 'indentexpr', …) options. Solution: - Store "func"/"expr" options as `Callback` instead of string. - Delete oceans of copy-pasted code. - BREAKING: LuaRef returned via RPC/Vimscript is now represented as `"<Lua N: file:line>"` (like what `:map` shows) instead of `nil`. - Note: `man.vim` still uses `v:lua` string, bc it's a vimscript ftplugin. Helped-by: Lewis Russell <lewis6991@gmail.com>
* vim-patch:9.2.0813: dict_add_func() may corrupt funcref count on failure ↵zeertzjq2026-07-21
| | | | | | | | | | | | | | | | | (#40877) Problem: dict_add_func() references the function only after a successful dict_add(), on failure dictitem_free() calls func_unref() without a matching func_ref(), corrupting the reference count of a lambda or numbered function. Solution: Take the reference before dict_add() so the unref on the failure path is balanced (Yasuhiro Matsumoto). related: vim/vim#20668 closes: vim/vim#20742 https://github.com/vim/vim/commit/4a403b48c653461f3c2fa331664d68585f59ea4c Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
* vim-patch:9.2.0771: dict_add_list() has inconsistent ownership on failurezeertzjq2026-07-03
| | | | | | | | | | | | | | | | | Problem: dict_add_list() frees the passed list on failure path (when dict_add() fails) but not on the other (when dictitem_alloc() fails), so a caller cannot tell whether it still owns the list after a failure. Solution: On failure leave the passed list untouched and owned by the caller; only take a reference on success. related: vim/vim#20668 Supported by AI. https://github.com/vim/vim/commit/3ae1443d10da03019d4b37c090daee38926da215 Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:9.2.0770: dict_add_dict() has inconsistent ownership on failurezeertzjq2026-07-03
| | | | | | | | | | | | | | | | | | | | Problem: dict_add_dict() frees the passed dict on one failure path (when dict_add() fails) but not on the other (when dictitem_alloc() fails), so a caller cannot tell whether it still owns the dict after a failure. Callers that unref the dict on failure (e.g. in window.c) then double-free it when dict_add() fails. Solution: Make the failure contract consistent: on failure leave the passed dict untouched and owned by the caller; only take a reference on success. related: vim/vim#20668 Supported by AI. https://github.com/vim/vim/commit/12dbe788d461f7f01a908e9e9ecc844f85d71cb4 Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:8.2.1821: Vim9: concatenating to a NULL list doesn't workJan Edmund Lazo2026-06-14
| | | | | | | | | Problem: Vim9: concatenating to a NULL list doesn't work. Solution: Handle a NULL list like an empty list. (closes vim/vim#7064) https://github.com/vim/vim/commit/1a73923705744ab8297dd856d194e20297563456 Co-authored-by: Bram Moolenaar <Bram@vim.org>
* refactor(typval.c): fix wrong argument to macro (#38813)nameearly2026-04-06
|
* vim-patch:9.2.0031: Inefficient use of ga_concat()zeertzjq2026-02-22
| | | | | | | | | | | | | Problem: Inefficient use of ga_concat() Solution: Use ga_concat_len() when the length is already known to avoid use of strlen() (John Marriott). closes: vim/vim#19422 https://github.com/vim/vim/commit/ed202035b1904c84d92adb76d7e1a95b7540e048 Co-authored-by: John Marriott <basilisk@internode.on.net> Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
* vim-patch:9.1.1954: Setting a byte in a blob, accepts values outside 0-255zeertzjq2026-02-16
| | | | | | | | | | | | Problem: Setting a byte in a blob, accepts values outside 0-255 Solution: When setting a byte in a blob, check for valid values (Yegappan Lakshmanan) closes: vim/vim#18870 https://github.com/vim/vim/commit/f4a299700e211a728f0f7398eb8fceaf44165711 Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
* vim-patch:partial:9.1.1668: items() does not work for Blobszeertzjq2026-02-16
| | | | | | | | | | | | Problem: items() does not work for Blobs Solution: Extend items() to support Blob (Yegappan Lakshmanan). closes: vim/vim#18080 https://github.com/vim/vim/commit/da34f84847d40dc5b1eaad477440e513968047dc Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
* vim-patch:8.2.3841: Vim9: outdated TODO items, disabled tests that work (#37900)zeertzjq2026-02-16
| | | | | | | | | Problem: Vim9: outdated TODO items, disabled tests that work. Solution: Remove TODO items, run tests that work now. Check that a dict item isn't locked. https://github.com/vim/vim/commit/71b768509250b12696e8cc90e5902029f1b5433d Co-authored-by: Bram Moolenaar <Bram@vim.org>
* fix(restart): append `-c <cmd>` at end, drop `-- [files…]` #37846Justin M. Keyes2026-02-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: - `:restart <cmd>` prepends `-c <cmd>` before the original `-c` args (if any). So the original `-c` args may "override" it, which is surprising. - Confusing logic: `v:argv` is partially prepared in `ex_docmd.c`, and then later `ui.c` skips other parts of it. Current behavior is nonsense, for example this sequence: :restart echo "Hello" :restart +qall echo "Hello" | echo "World" results in this v:argv: [ 'nvim' '-c' 'echo "Hello" | echo "World"' '--embed' '-c' 'echo "Hello"' ... ] Whereas after this commit, v:argv is: [ 'nvim' '--embed' ... '-c' 'echo "Hello" | echo "World"' ] Solution: - Append `-c <cmd>` at the _end_ of `v:argv`, not the start. - Use a dummy placeholder `+:::` to mark where the "restart command" appears in `v:argv`. - Do all `v:argv` preparation in `ex_docmd.c`. This simplifies `ui.c`. - Drop `-- [files…]` from `v:argv` since it is probably more annoying than useful. (Users can use sessions to restore files on restart.)
* fix(typval): allocated dynamic size must be at least the static sizebfredl2026-01-15
| | | | fixes #37160
* fix(marks): wrong line('w$', win) with conceal_lines (#37047)Jaehwang Jung2025-12-22
| | | | | | | | | | | | | | | | | Background: Suppose a window has concealed lines, and sets conceallevel>2, concealcursor="". The concealed lines are displayed if the window is curwin and the cursor is on the those lines. Problem: line('w$', win) switches curwin to win, and then does validate_botline for curwin. It computes botline assuming the concealed lines displayed, resulting in a smaller value than the actual botline that the user sees. Solution: Evaluate line('w$', win) without switching curwin. Apply similar changes to other functions that switches curwin. Co-authored-by: zeertzjq <zeertzjq@outlook.com>
* vim-patch:8.2.3766: converting a funcref to a string leaves out "g:"zeertzjq2025-12-20
| | | | | | | | | | | Problem: Converting a funcref to a string leaves out "g:", causing the meaning of the name depending on the context. Solution: Prepend "g:" for a global function. https://github.com/vim/vim/commit/c4ec338fb80ebfb5d631f0718fdd1a1c04d9ed82 Co-authored-by: Bram Moolenaar <Bram@vim.org> Co-authored-by: Jan Edmund Lazo <jan.lazo@mail.utoronto.ca>
* refactor: clint.py => clint.luaJustin M. Keyes2025-12-08
| | | | | | | | | | | | | | | | | | | | | | | | Problem: `clint.py` is the last python in our codebase, and beyond that it needs some cleanup. And it lacks tests, so modifying it can be painful. Also, we need a way to add ad-hoc lint rules for *Lua*, so it will help to have our ad-hoc rules for C in the same language (the scripts may share functions/techniques): https://github.com/neovim/neovim/issues/28372 Solution: - convert to `clint.lua` (mostly AI-generated, but it now has test coverage, unlike `clint.py`) - drop rules that are no longer needed: - "readability/multiline_string" - technially still relevant, but very uncommon so doesn't really matter. - "--line-length" - Not used in the old clint.py, nor the new clint.lua. - "comment whitespace" check - It is enforced by uncrustify. - "TODO" check - The `-google-readability-function-size` clang-tidy rule enforces "TODO(user)" format. (It was already enabled long ago.)
* vim-patch:partial:9.1.1955: sort() does not handle large numbers correctly ↵zeertzjq2025-12-06
| | | | | | | | | | | | | | | | (#36840) Problem: sort() does not handle large numbers correctly (Igbanam Ogbuluijah) Solution: Don't truncate the return value of tv_get_number_chk() (Yegappan Lakshmanan) closes: vim/vim#18868 https://github.com/vim/vim/commit/04794efe12863eb96a489531c299879e6c8d15d4 Use a Lua test for now, as the Vimscript test uses tuples. Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
* vim-patch:9.0.0433: Coverity warns for not checking allocation failureJan Edmund Lazo2025-10-19
| | | | | | | | | Problem: Coverity warns for not checking allocation failure. Solution: Check that allocating a list or blob succeeded. https://github.com/vim/vim/commit/12553ada3b1ceee0179527abc9980b8392fd6c7e Co-authored-by: Bram Moolenaar <Bram@vim.org>
* vim-patch:8.1.1957: more code can be moved to evalvars.cJan Edmund Lazo2025-10-05
| | | | | | | | | | Problem: More code can be moved to evalvars.c. Solution: Move code to where it fits better. (Yegappan Lakshmanan, closes vim/vim#4883) https://github.com/vim/vim/commit/da6c03342117fb7f4a8110bd9e8627b612a05a64 Co-authored-by: Bram Moolenaar <Bram@vim.org>
* docs: misc, dev-api-fast, $XDG_STATE_HOME #35138Justin M. Keyes2025-08-17
|
* refactor(build): remove INCLUDE_GENERATED_DECLARATIONS guardsbfredl2025-08-14
| | | | | | | | | These are not needed after #35129 but making uncrustify still play nice with them was a bit tricky. Unfortunately `uncrustify --update-config-with-doc` breaks strings with backslashes. This issue has been reported upstream, and in the meanwhile auto-update on every single run has been disabled.
* vim-patch:8.1.1891: functions used in one file are globalJan Edmund Lazo2025-07-20
| | | | | | | | | Problem: Functions used in one file are global. Solution: Add "static". (Yegappan Lakshmanan, closes vim/vim#4840) https://github.com/vim/vim/commit/5843f5f37b0632e2d706abc9014bfd7d98f7b02e Co-authored-by: Bram Moolenaar <Bram@vim.org>
* vim-patch:9.1.1063: too many strlen() calls in userfunc.czeertzjq2025-02-03
| | | | | | | | | | | | | | | | | Problem: too many strlen() calls in userfunc.c Solution: refactor userfunc.c and remove calls to strlen(), drop set_ufunc_name() and roll it into alloc_ufunc(), check for out-of-memory condition in trans_function_name_ext() (John Marriott) closes: vim/vim#16537 https://github.com/vim/vim/commit/b32800f7c51c866dc0e87244eb4902540982309d Add missing change to call_user_func() from patch 8.1.1007. Consistently use PRIdSCID instead of PRId64 for script IDs. Co-authored-by: John Marriott <basilisk@internode.on.net>
* vim-patch:9.1.1068: getchar() can't distinguish between C-I and Tab (#32295)zeertzjq2025-02-02
| | | | | | | | | | | | Problem: getchar() can't distinguish between C-I and Tab. Solution: Add {opts} to pass extra flags to getchar() and getcharstr(), with "number" and "simplify" keys. related: vim/vim#10603 closes: vim/vim#16554 https://github.com/vim/vim/commit/e0a2ab397fd13a71efec85b017d5d4d62baf7f63 Cherry-pick tv_dict_has_key() from patch 8.2.4683.
* vim-patch:9.1.0984: exception handling can be improvedzeertzjq2025-01-07
| | | | | | | | | | | | Problem: exception handling can be improved Solution: add v:stacktrace and getstacktrace() closes: vim/vim#16360 https://github.com/vim/vim/commit/663d18d6102f40d14e36096ec590445e61026ed6 Co-authored-by: ichizok <gclient.gaap@gmail.com> Co-authored-by: Naruhiko Nishino <naru123456789@gmail.com>
* refactor: iwyu #31637Justin M. Keyes2024-12-23
| | | Result of `make iwyu` (after some "fixups").
* refactor(shada): rework msgpack decoding without msgpack-cbfredl2024-08-05
| | | | | | | This also makes shada reading slightly faster due to avoiding some copying and allocation. Use keysets to drive decoding of msgpack maps for shada entries.
* refactor: move some functions out of eval.c (#29964)zeertzjq2024-08-02
| | | | | | - common_function() has always been in evalfunc.c in Vim - return_register() has always been in evalfunc.c in Vim - get_user_input() was moved to ex_getln.c in Vim 8.1.1957 - tv_get_lnum_buf() was moved to typval.c in Vim 8.2.0847
* vim-patch:9.0.0331: cannot use items() on a stringzeertzjq2024-07-30
| | | | | | | | | Problem: Cannot use items() on a string. Solution: Make items() work on a string. (closes vim/vim#11016) https://github.com/vim/vim/commit/3e518a8ec74065aedd67d352c93d6ae6be550316 Co-authored-by: Bram Moolenaar <Bram@vim.org>
* vim-patch:partial:9.0.0327: items() does not work on a listzeertzjq2024-07-30
| | | | | | | | | | | Problem: items() does not work on a list. (Sergey Vlasov) Solution: Make items() work on a list. (closes vim/vim#11013) https://github.com/vim/vim/commit/976f859763b215050a03248dbc2bb62fa5d0d059 Skip CHECK_LIST_MATERIALIZE. Co-authored-by: Bram Moolenaar <Bram@vim.org>
* vim-patch:9.1.0524: the recursive parameter in the *_equal functions can be ↵zeertzjq2024-07-05
| | | | | | | | | | | | | | | removed (#29572) Problem: the recursive parameter in the *_equal functions can be removed Solution: Remove the recursive parameter in dict_equal(), list_equal() object_equal and tv_equal(). Use a comparison of the static var recursive_cnt == 0 to determine whether or not tv_equal() has been called recursively (Yinzuo Jiang). closes: vim/vim#15070 https://github.com/vim/vim/commit/7ccd1a2e858dbb2ac7fb09971dfcbfad62baa677 Co-authored-by: Yinzuo Jiang <jiangyinzuo@foxmail.com>
* refactor(typval): don't use msgpack_packer for msgpackdump()bfredl2024-06-24
| | | | Step towords completely eliminating msgpack_packer.
* fixup: apply the change on more filesJames Tirta Halim2024-06-04
|
* refactor: move shared messages to errors.h #26214Justin M. Keyes2024-06-01
|
* vim-patch:8.2.2318: Vim9: string and list index work differentlyzeertzjq2024-03-23
| | | | | | | | | Problem: Vim9: string and list index work differently. Solution: Make string index work like list index. (closes vim/vim#7643) https://github.com/vim/vim/commit/e7525c552060dd04aacdbca6bb5fe6460cf4da60 Co-authored-by: Bram Moolenaar <Bram@vim.org>
* refactor(api): use an arena for mappingsbfredl2024-02-18
|
* vim-patch:partial:9.0.1196: code is indented more than necessary (#27315)zeertzjq2024-02-03
| | | | | | | | | | | Problem: Code is indented more than necessary. Solution: Use an early return where it makes sense. (Yegappan Lakshmanan, closes vim/vim#11813) https://github.com/vim/vim/commit/e8575988969579f9e1439181ae338b2ff74054a8 Skip list_alloc_with_items(). Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
* vim-patch:9.1.0009: Cannot easily get the list of matches (#27028)zeertzjq2024-01-16
| | | | | | | | | | | | | | | | | | | | Problem: Cannot easily get the list of matches Solution: Add the matchstrlist() and matchbufline() Vim script functions (Yegappan Lakshmanan) closes: vim/vim#13766 Omit CHECK_LIST_MATERIALIZE(): it populates a List with numbers only, and there is a check for strings below. https://github.com/vim/vim/commit/f93b1c881a99fa847a1bafa71877d7e16f18e6ef vim-patch:eb3475df0d92 runtime(doc): Replace non-breaking space with normal space (vim/vim#13868) https://github.com/vim/vim/commit/eb3475df0d927a178789cf8e7fc4983932e1cdbe Co-authored-by: Yegappan Lakshmanan <4298407+yegappan@users.noreply.github.com>
* refactor(IWYU): fix headersdundargoc2024-01-11
| | | | | | Remove `export` pramgas from defs headers as it causes IWYU to believe that the definitions from the defs headers comes from main header, which is not what we really want.
* refactor: follow style guidedundargoc2023-12-30
|
* refactor: run IWYU on entire repodundargoc2023-12-21
| | | | Reference: https://github.com/neovim/neovim/issues/6371.
* refactor: fix headers with IWYUdundargoc2023-11-28
|
* refactor: rename types.h to types_defs.hdundargoc2023-11-27
|