diff src/blob.c @ 15581:c2382f0d1279 v8.1.0798

patch 8.1.0798: changing a blob while iterating over it works strangely commit https://github.com/vim/vim/commit/dd29ea18050284526174b5685781469240f5bc4a Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jan 23 21:56:21 2019 +0100 patch 8.1.0798: changing a blob while iterating over it works strangely Problem: Changing a blob while iterating over it works strangely. Solution: Make a copy of the Blob before iterating.
author Bram Moolenaar <Bram@vim.org>
date Wed, 23 Jan 2019 22:00:06 +0100
parents 99a4cc4782ac
children 44ea60ca593b
line wrap: on
line diff
--- a/src/blob.c
+++ b/src/blob.c
@@ -57,6 +57,28 @@ rettv_blob_set(typval_T *rettv, blob_T *
 	++b->bv_refcount;
 }
 
+    int
+blob_copy(typval_T *from, typval_T *to)
+{
+    int	    ret = OK;
+
+    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;
+
+	if (len > 0)
+	    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;
+    }
+    return ret;
+}
+
     void
 blob_free(blob_T *b)
 {