aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChong Yidong2007-03-24 15:50:21 +0000
committerChong Yidong2007-03-24 15:50:21 +0000
commit916480c4ef96a5a957d8b9cccb419f12d93d4efe (patch)
tree379f3d20139b42fd37c878e06c256da57d416881 /src
parent159f7befeeb02aca5e82be4fddd22448ce55025b (diff)
downloademacs-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.c27
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