From cca6c4c6986abc67cd213ad1d32d329384a57790 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Wed, 6 Dec 2023 17:02:13 +0100 Subject: feat(rpc): allow empty string key in msgpack => Vim conversion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Since e057b38e7037 #20757 we support empty key in JSON encode/decode, but we don't allow it in RPC object => Vim dict conversion. But empty string is a valid key in Vim dicts and the msgpack spec. Empty string key was disallowed in 7c01d5ff9286 (2014) but that commit/PR doesn't explicitly discuss it, so presumably it was a "seems reasonable" decision (or Vimscript didn't allow empty keys until later). Solution: Remove the check in `object_to_vim()`. Note that `tv_dict_item_alloc_len` will invoke `memcpy(…, 0)` but that's allowed by the C spec: https://stackoverflow.com/a/3751937/152142 --- test/functional/vimscript/json_functions_spec.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test/functional/vimscript/json_functions_spec.lua') diff --git a/test/functional/vimscript/json_functions_spec.lua b/test/functional/vimscript/json_functions_spec.lua index 53899085e0..c12bcf5099 100644 --- a/test/functional/vimscript/json_functions_spec.lua +++ b/test/functional/vimscript/json_functions_spec.lua @@ -576,8 +576,8 @@ describe('json_encode() function', function() eq('{}', eval('json_encode({})')) eq('{"d": []}', funcs.json_encode({d={}})) eq('{"d": [], "e": []}', funcs.json_encode({d={}, e={}})) - -- Empty keys not allowed (yet?) in object_to_vim() (since 7c01d5ff9286). #25564 - -- eq('{"": []}', funcs.json_encode({['']={}})) + -- Empty keys are allowed per JSON spec (and Vim dicts, and msgpack). + eq('{"": []}', funcs.json_encode({['']={}})) end) it('cannot dump generic mapping with generic mapping keys and values', -- cgit