diff options
| author | Chong Yidong | 2007-03-24 15:50:21 +0000 |
|---|---|---|
| committer | Chong Yidong | 2007-03-24 15:50:21 +0000 |
| commit | 916480c4ef96a5a957d8b9cccb419f12d93d4efe (patch) | |
| tree | 379f3d20139b42fd37c878e06c256da57d416881 /src | |
| parent | 159f7befeeb02aca5e82be4fddd22448ce55025b (diff) | |
| download | emacs-916480c4ef96a5a957d8b9cccb419f12d93d4efe.tar.gz emacs-916480c4ef96a5a957d8b9cccb419f12d93d4efe.zip | |
(Ftranspose_regions): Use set_text_properties_1 instead of
Fset_text_properties to avoid GC. Signal after change.
Diffstat (limited to 'src')
| -rw-r--r-- | src/editfns.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/editfns.c b/src/editfns.c index fc99bf977d0..a6f275c8f8d 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -4118,6 +4118,9 @@ Transposing beyond buffer boundaries is an error. */) | |||
| 4118 | unsigned char *start1_addr, *start2_addr, *temp; | 4118 | unsigned char *start1_addr, *start2_addr, *temp; |
| 4119 | 4119 | ||
| 4120 | INTERVAL cur_intv, tmp_interval1, tmp_interval_mid, tmp_interval2; | 4120 | INTERVAL cur_intv, tmp_interval1, tmp_interval_mid, tmp_interval2; |
| 4121 | Lisp_Object buf; | ||
| 4122 | |||
| 4123 | XSETBUFFER (buf, current_buffer); | ||
| 4121 | cur_intv = BUF_INTERVALS (current_buffer); | 4124 | cur_intv = BUF_INTERVALS (current_buffer); |
| 4122 | 4125 | ||
| 4123 | validate_region (&startr1, &endr1); | 4126 | validate_region (&startr1, &endr1); |
| @@ -4224,8 +4227,10 @@ Transposing beyond buffer boundaries is an error. */) | |||
| 4224 | 4227 | ||
| 4225 | tmp_interval1 = copy_intervals (cur_intv, start1, len1); | 4228 | tmp_interval1 = copy_intervals (cur_intv, start1, len1); |
| 4226 | tmp_interval2 = copy_intervals (cur_intv, start2, len2); | 4229 | tmp_interval2 = copy_intervals (cur_intv, start2, len2); |
| 4227 | Fset_text_properties (make_number (start1), make_number (end2), | 4230 | /* Don't use Fset_text_properties: that can cause GC, which can |
| 4228 | Qnil, Qnil); | 4231 | clobber objects stored in the tmp_intervals. */ |
| 4232 | set_text_properties_1 (make_number (start1), make_number (end2), | ||
| 4233 | Qnil, buf, NULL); | ||
| 4229 | 4234 | ||
| 4230 | /* First region smaller than second. */ | 4235 | /* First region smaller than second. */ |
| 4231 | if (len1_byte < len2_byte) | 4236 | if (len1_byte < len2_byte) |
| @@ -4281,10 +4286,10 @@ Transposing beyond buffer boundaries is an error. */) | |||
| 4281 | record_change (start2, len2); | 4286 | record_change (start2, len2); |
| 4282 | tmp_interval1 = copy_intervals (cur_intv, start1, len1); | 4287 | tmp_interval1 = copy_intervals (cur_intv, start1, len1); |
| 4283 | tmp_interval2 = copy_intervals (cur_intv, start2, len2); | 4288 | tmp_interval2 = copy_intervals (cur_intv, start2, len2); |
| 4284 | Fset_text_properties (make_number (start1), make_number (end1), | 4289 | set_text_properties_1 (make_number (start1), make_number (end1), |
| 4285 | Qnil, Qnil); | 4290 | Qnil, buf, NULL); |
| 4286 | Fset_text_properties (make_number (start2), make_number (end2), | 4291 | set_text_properties_1 (make_number (start2), make_number (end2), |
| 4287 | Qnil, Qnil); | 4292 | Qnil, buf, NULL); |
| 4288 | 4293 | ||
| 4289 | SAFE_ALLOCA (temp, unsigned char *, len1_byte); | 4294 | SAFE_ALLOCA (temp, unsigned char *, len1_byte); |
| 4290 | start1_addr = BYTE_POS_ADDR (start1_byte); | 4295 | start1_addr = BYTE_POS_ADDR (start1_byte); |
| @@ -4310,8 +4315,8 @@ Transposing beyond buffer boundaries is an error. */) | |||
| 4310 | tmp_interval1 = copy_intervals (cur_intv, start1, len1); | 4315 | tmp_interval1 = copy_intervals (cur_intv, start1, len1); |
| 4311 | tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); | 4316 | tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); |
| 4312 | tmp_interval2 = copy_intervals (cur_intv, start2, len2); | 4317 | tmp_interval2 = copy_intervals (cur_intv, start2, len2); |
| 4313 | Fset_text_properties (make_number (start1), make_number (end2), | 4318 | set_text_properties_1 (make_number (start1), make_number (end2), |
| 4314 | Qnil, Qnil); | 4319 | Qnil, buf, NULL); |
| 4315 | 4320 | ||
| 4316 | /* holds region 2 */ | 4321 | /* holds region 2 */ |
| 4317 | SAFE_ALLOCA (temp, unsigned char *, len2_byte); | 4322 | SAFE_ALLOCA (temp, unsigned char *, len2_byte); |
| @@ -4341,8 +4346,8 @@ Transposing beyond buffer boundaries is an error. */) | |||
| 4341 | tmp_interval1 = copy_intervals (cur_intv, start1, len1); | 4346 | tmp_interval1 = copy_intervals (cur_intv, start1, len1); |
| 4342 | tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); | 4347 | tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); |
| 4343 | tmp_interval2 = copy_intervals (cur_intv, start2, len2); | 4348 | tmp_interval2 = copy_intervals (cur_intv, start2, len2); |
| 4344 | Fset_text_properties (make_number (start1), make_number (end2), | 4349 | set_text_properties_1 (make_number (start1), make_number (end2), |
| 4345 | Qnil, Qnil); | 4350 | Qnil, buf, NULL); |
| 4346 | 4351 | ||
| 4347 | /* holds region 1 */ | 4352 | /* holds region 1 */ |
| 4348 | SAFE_ALLOCA (temp, unsigned char *, len1_byte); | 4353 | SAFE_ALLOCA (temp, unsigned char *, len1_byte); |
| @@ -4377,6 +4382,8 @@ Transposing beyond buffer boundaries is an error. */) | |||
| 4377 | fix_start_end_in_overlays (start1, end2); | 4382 | fix_start_end_in_overlays (start1, end2); |
| 4378 | } | 4383 | } |
| 4379 | 4384 | ||
| 4385 | signal_after_change (XINT (start1), XINT (end2 - start1), | ||
| 4386 | XINT (end2 - start1)); | ||
| 4380 | return Qnil; | 4387 | return Qnil; |
| 4381 | } | 4388 | } |
| 4382 | 4389 | ||