Index: buffer.c =================================================================== RCS file: /sources/emacs/emacs/src/buffer.c,v retrieving revision 1.575 diff -c -r1.575 buffer.c *** buffer.c 9 Dec 2008 23:08:05 -0000 1.575 --- buffer.c 23 Dec 2008 14:37:33 -0000 *************** *** 2182,2187 **** --- 2182,2192 ---- return byte_pos; } + #ifdef REL_ALLOC + extern void r_alloc_prepare_to_swap_pointers P_ ((POINTER_TYPE **, + POINTER_TYPE **)); + #endif + DEFUN ("buffer-swap-text", Fbuffer_swap_text, Sbuffer_swap_text, 1, 1, 0, doc: /* Swap the text between current buffer and BUFFER. */) *************** *** 2220,2225 **** --- 2225,2235 ---- current_buffer->field = tmp##field; \ } while (0) + #ifdef REL_ALLOC + r_alloc_prepare_to_swap_pointers (¤t_buffer->own_text.beg, + &other_buffer->own_text.beg); + #endif + swapfield (own_text, struct buffer_text); eassert (current_buffer->text == ¤t_buffer->own_text); eassert (other_buffer->text == &other_buffer->own_text); Index: ralloc.c =================================================================== RCS file: /sources/emacs/emacs/src/ralloc.c,v retrieving revision 1.69 diff -c -r1.69 ralloc.c *** ralloc.c 21 Nov 2008 12:14:07 -0000 1.69 --- ralloc.c 23 Dec 2008 14:40:52 -0000 *************** *** 1223,1228 **** --- 1223,1251 ---- #endif /* DEBUG */ + /* Swap relocatable data between two pointers. + This is used by buffer_swap_text. Since buffer_swap_text swaps the + whole text structure in one go, this function has been written to only + update the internal pointers back to the variables, ready for when the + swap is actually done. It must be called before the pointers are + swapped so that the state is consistent when find_bloc is called. */ + void + r_alloc_prepare_to_swap_pointers (p1, p2) + POINTER *p1, *p2; + { + bloc_ptr bloc1, bloc2; + bloc1 = find_bloc (p1); + bloc2 = find_bloc (p2); + if (bloc1 == NIL_BLOC || bloc2 == NIL_BLOC) + abort (); + + /* Swap internal pointers back to the variables. */ + bloc1->variable = p2; + bloc2->variable = p1; + + /* It would be cleaner to do the actual swap here too, but it would + complicate buffer_swap_text. */ + } /***********************************************************************