diff --git a/Src/params.c b/Src/params.c index ef72cba..e23a0af 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2654,24 +2654,34 @@ setarrvalue(Value v, char **val) v->end = v->start; post_assignment_length = v->start + arrlen(val); - if (v->end <= pre_assignment_length) - post_assignment_length += pre_assignment_length - v->end + 1; - - p = new = (char **) zshcalloc(sizeof(char *) - * (post_assignment_length + 1)); - - for (i = 0; i < v->start; i++) - *p++ = i < pre_assignment_length ? ztrdup(*q++) : ztrdup(""); - for (r = val; *r;) { - /* Give away ownership of the string */ - *p++ = *r++; - } - if (v->end < pre_assignment_length) - for (q = old + v->end; *q;) - *p++ = ztrdup(*q++); - *p = NULL; - v->pm->gsu.a->setfn(v->pm, new); + if (v->end <= pre_assignment_length) + post_assignment_length += pre_assignment_length - v->end; + + if ( pre_assignment_length != post_assignment_length || v->pm->gsu.a->setfn == set_region_active ) { + p = new = (char **) zshcalloc(sizeof(char *) + * (post_assignment_length + 1)); + + for (i = 0; i < v->start; i++) + *p++ = i < pre_assignment_length ? ztrdup(*q++) : ztrdup(""); + for (r = val; *r;) { + /* Give away ownership of the string */ + *p++ = *r++; + } + if (v->end < pre_assignment_length) + for (q = old + v->end; *q;) + *p++ = ztrdup(*q++); + *p = NULL; + + v->pm->gsu.a->setfn(v->pm, new); + } else { + /* v->start is 0-based */ + p = old + v->start; + for (r = val; *r;) { + /* Give away ownership of the string */ + *p++ = *r++; + } + } /* Ownership of all strings has been * given away, can plainly free */