use dynwind_begin and dynwind_end
[bpt/emacs.git] / src / buffer.c
index d6f6b2c..7f0f2cc 100644 (file)
@@ -1721,7 +1721,7 @@ cleaning up all windows currently displaying the buffer to be killed. */)
 
   /* Run hooks with the buffer to be killed the current buffer.  */
   {
-    ptrdiff_t count = SPECPDL_INDEX ();
+    dynwind_begin ();
     Lisp_Object arglist[1];
 
     record_unwind_protect (save_excursion_restore, save_excursion_save ());
@@ -1731,8 +1731,11 @@ cleaning up all windows currently displaying the buffer to be killed. */)
        don't kill the buffer.  */
     arglist[0] = Qkill_buffer_query_functions;
     tem = Frun_hook_with_args_until_failure (1, arglist);
-    if (NILP (tem))
-      return unbind_to (count, Qnil);
+    if (NILP (tem)){
+      
+        dynwind_end ();
+        return Qnil;
+      }
 
     /* Query if the buffer is still modified.  */
     if (INTERACTIVE && !NILP (BVAR (b, filename))
@@ -1742,17 +1745,23 @@ cleaning up all windows currently displaying the buffer to be killed. */)
         tem = do_yes_or_no_p (format2 ("Buffer %s modified; kill anyway? ",
                                       BVAR (b, name), make_number (0)));
        UNGCPRO;
-       if (NILP (tem))
-         return unbind_to (count, Qnil);
+       if (NILP (tem)){
+         
+           dynwind_end ();
+         return Qnil;
+         }
       }
 
     /* If the hooks have killed the buffer, exit now.  */
-    if (!BUFFER_LIVE_P (b))
-      return unbind_to (count, Qt);
+    if (!BUFFER_LIVE_P (b)){
+      
+        dynwind_end ();
+        return Qt;
+      }
 
     /* Then run the hooks.  */
     Frun_hooks (1, &Qkill_buffer_hook);
-    unbind_to (count, Qnil);
+    dynwind_end ();
   }
 
   /* If the hooks have killed the buffer, exit now.  */
@@ -2075,7 +2084,7 @@ the current buffer's major mode.  */)
   if (NILP (function) || EQ (function, Qfundamental_mode))
     return Qnil;
 
-  count = SPECPDL_INDEX ();
+  dynwind_begin ();
 
   /* To select a nonfundamental mode,
      select the buffer temporarily and then call the mode function.  */
@@ -2085,7 +2094,8 @@ the current buffer's major mode.  */)
   Fset_buffer (buffer);
   call0 (function);
 
-  return unbind_to (count, Qnil);
+  dynwind_end ();
+  return Qnil;
 }
 
 DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0,
@@ -3980,7 +3990,7 @@ buffer.  */)
 {
   struct buffer *b, *ob = 0;
   Lisp_Object obuffer;
-  ptrdiff_t count = SPECPDL_INDEX ();
+  dynwind_begin ();
   ptrdiff_t n_beg, n_end, o_beg IF_LINT (= 0), o_end IF_LINT (= 0);
 
   CHECK_OVERLAY (overlay);
@@ -4052,8 +4062,12 @@ buffer.  */)
 
   /* Delete the overlay if it is empty after clipping and has the
      evaporate property.  */
-  if (n_beg == n_end && !NILP (Foverlay_get (overlay, Qevaporate)))
-    return unbind_to (count, Fdelete_overlay (overlay));
+  if (n_beg == n_end && !NILP (Foverlay_get (overlay, Qevaporate))){
+    
+      Lisp_Object tem0 = Fdelete_overlay (overlay);
+      dynwind_end ();
+      return tem0;
+    }
 
   /* Put the overlay into the new buffer's overlay lists, first on the
      wrong list.  */
@@ -4071,7 +4085,8 @@ buffer.  */)
   /* This puts it in the right list, and in the right order.  */
   recenter_overlay_lists (b, b->overlay_center);
 
-  return unbind_to (count, overlay);
+  dynwind_end ();
+  return overlay;
 }
 
 DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
@@ -4080,13 +4095,15 @@ DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
 {
   Lisp_Object buffer;
   struct buffer *b;
-  ptrdiff_t count = SPECPDL_INDEX ();
+  dynwind_begin ();
 
   CHECK_OVERLAY (overlay);
 
   buffer = Fmarker_buffer (OVERLAY_START (overlay));
-  if (NILP (buffer))
+  if (NILP (buffer)) {
+    dynwind_end ();
     return Qnil;
+  }
 
   b = XBUFFER (buffer);
   specbind (Qinhibit_quit, Qt);
@@ -4103,7 +4120,8 @@ DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
          || !NILP (Foverlay_get (overlay, Qafter_string))))
     b->prevent_redisplay_optimizations_p = 1;
 
-  return unbind_to (count, Qnil);
+  dynwind_end ();
+  return Qnil;
 }
 
 DEFUN ("delete-all-overlays", Fdelete_all_overlays, Sdelete_all_overlays, 0, 1, 0,
@@ -5010,7 +5028,7 @@ alloc_buffer_text (struct buffer *b, ptrdiff_t nbytes)
 #elif defined REL_ALLOC
   p = r_alloc ((void **) &b->text->beg, nbytes);
 #else
-  p = xmalloc (nbytes);
+  p = xmalloc_atomic (nbytes);
 #endif
 
   if (p == NULL)
@@ -5410,6 +5428,8 @@ defvar_per_buffer (struct Lisp_Buffer_Objfwd *bo_fwd, const char *namestring,
 void
 syms_of_buffer (void)
 {
+#include "buffer.x"
+
   staticpro (&last_overlay_modification_hooks);
   last_overlay_modification_hooks
     = Fmake_vector (make_number (10), Qnil);
@@ -6286,56 +6306,6 @@ Functions running this hook are, `get-buffer-create',
 `bury-buffer-internal' and `select-window'.  */);
   Vbuffer_list_update_hook = Qnil;
   DEFSYM (Qbuffer_list_update_hook, "buffer-list-update-hook");
-
-  defsubr (&Sbuffer_live_p);
-  defsubr (&Sbuffer_list);
-  defsubr (&Sget_buffer);
-  defsubr (&Sget_file_buffer);
-  defsubr (&Sget_buffer_create);
-  defsubr (&Smake_indirect_buffer);
-  defsubr (&Sgenerate_new_buffer_name);
-  defsubr (&Sbuffer_name);
-  defsubr (&Sbuffer_file_name);
-  defsubr (&Sbuffer_base_buffer);
-  defsubr (&Sbuffer_local_value);
-  defsubr (&Sbuffer_local_variables);
-  defsubr (&Sbuffer_modified_p);
-  defsubr (&Sforce_mode_line_update);
-  defsubr (&Sset_buffer_modified_p);
-  defsubr (&Sbuffer_modified_tick);
-  defsubr (&Sbuffer_chars_modified_tick);
-  defsubr (&Srename_buffer);
-  defsubr (&Sother_buffer);
-  defsubr (&Sbuffer_enable_undo);
-  defsubr (&Skill_buffer);
-  defsubr (&Sbury_buffer_internal);
-  defsubr (&Sset_buffer_major_mode);
-  defsubr (&Scurrent_buffer);
-  defsubr (&Sset_buffer);
-  defsubr (&Sbarf_if_buffer_read_only);
-  defsubr (&Serase_buffer);
-  defsubr (&Sbuffer_swap_text);
-  defsubr (&Sset_buffer_multibyte);
-  defsubr (&Skill_all_local_variables);
-
-  defsubr (&Soverlayp);
-  defsubr (&Smake_overlay);
-  defsubr (&Sdelete_overlay);
-  defsubr (&Sdelete_all_overlays);
-  defsubr (&Smove_overlay);
-  defsubr (&Soverlay_start);
-  defsubr (&Soverlay_end);
-  defsubr (&Soverlay_buffer);
-  defsubr (&Soverlay_properties);
-  defsubr (&Soverlays_at);
-  defsubr (&Soverlays_in);
-  defsubr (&Snext_overlay_change);
-  defsubr (&Sprevious_overlay_change);
-  defsubr (&Soverlay_recenter);
-  defsubr (&Soverlay_lists);
-  defsubr (&Soverlay_get);
-  defsubr (&Soverlay_put);
-  defsubr (&Srestore_buffer_modified_p);
 }
 
 void