From 3d28b58c519c9fc3427587201423c74746cc219e Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 15 Jan 2019 22:44:17 +0100 Subject: [PATCH] patch 8.1.0756: copy() does not make a copy of a Blob Problem: copy() does not make a copy of a Blob. Solution: Make a copy. --- src/eval.c | 16 +++++++++++++++- src/testdir/test_blob.vim | 7 +++++++ src/version.c | 2 ++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/eval.c b/src/eval.c index 049d15cee..af1021bdc 100644 --- a/src/eval.c +++ b/src/eval.c @@ -8198,7 +8198,6 @@ item_copy( case VAR_SPECIAL: case VAR_JOB: case VAR_CHANNEL: - case VAR_BLOB: copy_tv(from, to); break; case VAR_LIST: @@ -8217,6 +8216,21 @@ item_copy( if (to->vval.v_list == NULL) ret = FAIL; break; + case VAR_BLOB: + to->v_type = VAR_BLOB; + if (from->vval.v_blob == NULL) + to->vval.v_blob = NULL; + else if (rettv_blob_alloc(to) == FAIL) + ret = FAIL; + else + { + int len = from->vval.v_blob->bv_ga.ga_len; + + to->vval.v_blob->bv_ga.ga_data = + vim_memsave(from->vval.v_blob->bv_ga.ga_data, len); + to->vval.v_blob->bv_ga.ga_len = len; + } + break; case VAR_DICT: to->v_type = VAR_DICT; to->v_lock = 0; diff --git a/src/testdir/test_blob.vim b/src/testdir/test_blob.vim index 3eeb3d2f3..d5f682f54 100644 --- a/src/testdir/test_blob.vim +++ b/src/testdir/test_blob.vim @@ -112,7 +112,14 @@ func Test_blob_compare() call assert_false(b1 is b2) let b2 = b1 + call assert_true(b1 == b2) call assert_true(b1 is b2) + let b2 = copy(b1) + call assert_true(b1 == b2) + call assert_false(b1 is b2) + let b2 = b1[:] + call assert_true(b1 == b2) + call assert_false(b1 is b2) call assert_fails('let x = b1 > b2') call assert_fails('let x = b1 < b2') diff --git a/src/version.c b/src/version.c index bb13765e9..6317a8e96 100644 --- a/src/version.c +++ b/src/version.c @@ -795,6 +795,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 756, /**/ 755, /**/ -- 2.40.0