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.
diff --git a/src/eval.c b/src/eval.c
index 049d15c..af1021b 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -8198,7 +8198,6 @@
case VAR_SPECIAL:
case VAR_JOB:
case VAR_CHANNEL:
- case VAR_BLOB:
copy_tv(from, to);
break;
case VAR_LIST:
@@ -8217,6 +8216,21 @@
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 3eeb3d2..d5f682f 100644
--- a/src/testdir/test_blob.vim
+++ b/src/testdir/test_blob.vim
@@ -112,7 +112,14 @@
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 bb13765..6317a8e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -796,6 +796,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 756,
+/**/
755,
/**/
754,