From dd29ea18050284526174b5685781469240f5bc4a Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 23 Jan 2019 21:56:21 +0100 Subject: 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. --- src/blob.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/blob.c') diff --git a/src/blob.c b/src/blob.c index bba9989136..a954030330 100644 --- a/src/blob.c +++ b/src/blob.c @@ -57,6 +57,28 @@ rettv_blob_set(typval_T *rettv, blob_T *b) ++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) { -- cgit v1.2.3