diff options
| author | zeertzjq <zeertzjq@outlook.com> | 2023-04-14 11:00:17 +0800 |
|---|---|---|
| committer | zeertzjq <zeertzjq@outlook.com> | 2023-04-14 18:04:09 +0800 |
| commit | d6e2804ab4f8810293dbcd748bfb938d9e0c3d52 (patch) | |
| tree | ee140b0eee513de0aad0cf6cbd55d56f4799dd7f /src/nvim/eval | |
| parent | 7caf0eafd83b5a92f2ff219b3a64ffae4174b9af (diff) | |
| download | rneovim-d6e2804ab4f8810293dbcd748bfb938d9e0c3d52.tar.gz rneovim-d6e2804ab4f8810293dbcd748bfb938d9e0c3d52.tar.bz2 rneovim-d6e2804ab4f8810293dbcd748bfb938d9e0c3d52.zip | |
vim-patch:8.2.1794: no falsy Coalescing operator
Problem: No falsy Coalescing operator.
Solution: Add the "??" operator. Fix mistake with function argument count.
https://github.com/vim/vim/commit/92f26c256e06277ff2ec4ce7adea1eb58c85abe0
Cherry-pick tv2bool() into eval/typval.c.
Cherry-pick *??* tag from Vim runtime.
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat (limited to 'src/nvim/eval')
| -rw-r--r-- | src/nvim/eval/typval.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c index 3e67571053..91be41751e 100644 --- a/src/nvim/eval/typval.c +++ b/src/nvim/eval/typval.c @@ -4201,3 +4201,34 @@ const char *tv_get_string_buf(const typval_T *const tv, char *const buf) return res != NULL ? res : ""; } + +/// Return true when "tv" is not falsy: non-zero, non-empty string, non-empty +/// list, etc. Mostly like what JavaScript does, except that empty list and +/// empty dictionary are false. +bool tv2bool(const typval_T *const tv) +{ + switch (tv->v_type) { + case VAR_NUMBER: + return tv->vval.v_number != 0; + case VAR_FLOAT: + return tv->vval.v_float != 0.0; + case VAR_PARTIAL: + return tv->vval.v_partial != NULL; + case VAR_FUNC: + case VAR_STRING: + return tv->vval.v_string != NULL && *tv->vval.v_string != NUL; + case VAR_LIST: + return tv->vval.v_list != NULL && tv->vval.v_list->lv_len > 0; + case VAR_DICT: + return tv->vval.v_dict != NULL && tv->vval.v_dict->dv_hashtab.ht_used > 0; + case VAR_BOOL: + return tv->vval.v_bool == kBoolVarTrue; + case VAR_SPECIAL: + return tv->vval.v_special == kSpecialVarNull; + case VAR_BLOB: + return tv->vval.v_blob != NULL && tv->vval.v_blob->bv_ga.ga_len > 0; + case VAR_UNKNOWN: + break; + } + return false; +} |