aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2016-09-18 01:59:07 +0300
committerZyX <kp-pav@yandex.ru>2017-03-29 10:08:06 +0300
commitf80a00469fdba8a3dec0edae30c911d050485055 (patch)
treef42ea5ec669479c0b34d6923b34a553fa49a7edf
parent82e6cac5f9d437da5aeb8c4cf51945cfeb5922ff (diff)
downloadrneovim-f80a00469fdba8a3dec0edae30c911d050485055.tar.gz
rneovim-f80a00469fdba8a3dec0edae30c911d050485055.tar.bz2
rneovim-f80a00469fdba8a3dec0edae30c911d050485055.zip
eval/typval: Make tv_list_concat handle NULL lists correctly
Fixes some FIXMEs in eval/null_spec.lua.
-rw-r--r--src/nvim/eval/typval.c25
-rw-r--r--test/functional/eval/null_spec.lua12
2 files changed, 19 insertions, 18 deletions
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c
index ae4199697f..9dd1b62d7d 100644
--- a/src/nvim/eval/typval.c
+++ b/src/nvim/eval/typval.c
@@ -498,20 +498,25 @@ void tv_list_extend(list_T *const l1, list_T *const l2,
int tv_list_concat(list_T *const l1, list_T *const l2, typval_T *const tv)
FUNC_ATTR_WARN_UNUSED_RESULT
{
- if (l1 == NULL || l2 == NULL) {
- return FAIL;
- }
+ list_T *l;
- // make a copy of the first list.
- list_T *const l = tv_list_copy(NULL, l1, false, 0);
- if (l == NULL) {
+ tv->v_type = VAR_LIST;
+
+ if (l1 == NULL && l2 == NULL) {
+ l = NULL;
+ } else if (l1 == NULL) {
+ l = tv_list_copy(NULL, l2, false, 0);
+ } else {
+ l = tv_list_copy(NULL, l1, false, 0);
+ if (l != NULL && l2 != NULL) {
+ tv_list_extend(l, l2, NULL);
+ }
+ }
+ if (l == NULL && !(l1 == NULL && l2 == NULL)) {
return FAIL;
}
- tv->v_type = VAR_LIST;
- tv->vval.v_list = l;
- // append all items from the second list
- tv_list_extend(l, l2, NULL);
+ tv->vval.v_list = l;
return OK;
}
diff --git a/test/functional/eval/null_spec.lua b/test/functional/eval/null_spec.lua
index 9a35905be0..ccdd1ce34c 100644
--- a/test/functional/eval/null_spec.lua
+++ b/test/functional/eval/null_spec.lua
@@ -61,14 +61,6 @@ describe('NULL', function()
null_list_expr_test('is equal to itself', 'L == L', 0, 0)
-- FIXME Should return 0
null_list_expr_test('is not not equal to itself', 'L != L', 0, 1)
- -- FIXME Should return empty list
- null_list_expr_test('can be added to itself', '(L + L)', 'E15: Invalid expression: (L + L)', nil)
- -- FIXME Should return [1]
- null_list_expr_test('can be added to non-empty list (reversed)', '(L + [1])',
- 'E15: Invalid expression: (L + [1])', nil)
- -- FIXME Should return [1]
- null_list_expr_test('can be added to non-empty list', '([1] + L)',
- 'E15: Invalid expression: ([1] + L)', nil)
-- FIXME Should return 1
null_list_expr_test('counts correctly', 'count([L], L)', 0, 0)
-- FIXME should be accepted by inputlist()
@@ -137,5 +129,9 @@ describe('NULL', function()
null_list_expr_test('is stringified correctly', 'string(L)', 0, '[]')
null_list_expr_test('is JSON encoded correctly', 'json_encode(L)', 0, '[]')
null_list_test('does not crash lockvar', 'lockvar! L', 0)
+ null_list_expr_test('can be added to itself', '(L + L)', 0, {})
+ null_list_expr_test('can be added to itself', '(L + L) is L', 0, 1)
+ null_list_expr_test('can be added to non-empty list', '([1] + L)', 0, {1})
+ null_list_expr_test('can be added to non-empty list (reversed)', '(L + [1])', 0, {1})
end)
end)