summaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-15 22:14:53 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-15 22:14:53 +0200
commited5918771fcf9877d8445e74c62ab1ce6b8e28c1 (patch)
tree6b2c25678e1d0b606ad7e6b82d2d6528b6b86be8 /src/eval.c
parent11107bab7ead9124f46a7ddf6aa3bb66b43a8246 (diff)
patch 8.2.1463: Vim9: list slice not supported yetv8.2.1463
Problem: Vim9: list slice not supported yet. Solution: Add support for list slicing.
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c44
1 files changed, 7 insertions, 37 deletions
diff --git a/src/eval.c b/src/eval.c
index cbbb9002bb..8f685eda47 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3803,43 +3803,13 @@ eval_index(
break;
case VAR_LIST:
- len = list_len(rettv->vval.v_list);
- if (n1 < 0)
- n1 = len + n1;
- if (!empty1 && (n1 < 0 || n1 >= len))
- {
- // For a range we allow invalid values and return an empty
- // list. A list index out of range is an error.
- if (!range)
- {
- if (verbose)
- semsg(_(e_listidx), n1);
- return FAIL;
- }
- n1 = len;
- }
- if (range)
- {
- list_T *l;
-
- if (n2 < 0)
- n2 = len + n2;
- else if (n2 >= len)
- n2 = len - 1;
- if (!empty2 && (n2 < 0 || n2 + 1 < n1))
- n2 = -1;
- l = list_slice(rettv->vval.v_list, n1, n2);
- if (l == NULL)
- return FAIL;
- clear_tv(rettv);
- rettv_list_set(rettv, l);
- }
- else
- {
- copy_tv(&list_find(rettv->vval.v_list, n1)->li_tv, &var1);
- clear_tv(rettv);
- *rettv = var1;
- }
+ if (empty1)
+ n1 = 0;
+ if (empty2)
+ n2 = -1;
+ if (list_slice_or_index(rettv->vval.v_list,
+ range, n1, n2, rettv, verbose) == FAIL)
+ return FAIL;
break;
case VAR_DICT: