(Ffind_coding_systems_region_internal): Include raw-text and
[bpt/emacs.git] / src / bytecode.c
index 442729e..f3a07dc 100644 (file)
@@ -1,5 +1,5 @@
 /* Execution of byte code produced by bytecomp.el.
-   Copyright (C) 1985, 1986, 1987, 1988, 1993, 2000, 2001
+   Copyright (C) 1985, 1986, 1987, 1988, 1993, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -37,8 +37,9 @@ by Hallvard:
 #include <config.h>
 #include "lisp.h"
 #include "buffer.h"
-#include "charset.h"
+#include "character.h"
 #include "syntax.h"
+#include "window.h"
 
 #ifdef CHECK_FRAME_FONT
 #include "frame.h"
@@ -239,7 +240,7 @@ struct byte_stack
 {
   /* Program counter.  This points into the byte_string below
      and is relocated when that string is relocated.  */
-  unsigned char *pc;
+  const unsigned char *pc;
 
   /* Top and bottom of stack.  The bottom points to an area of memory
      allocated with alloca in Fbyte_code.  */
@@ -249,7 +250,7 @@ struct byte_stack
      Storing this here protects it from GC because mark_byte_stack
      marks it.  */
   Lisp_Object byte_string;
-  unsigned char *byte_string_start;
+  const unsigned char *byte_string_start;
 
   /* The vector of constants used during byte-code execution.  Storing
      this here protects it from GC because mark_byte_stack marks it.  */
@@ -291,19 +292,19 @@ mark_byte_stack ()
       for (obj = stack->bottom; obj <= stack->top; ++obj)
        if (!XMARKBIT (*obj))
          {
-           mark_object (obj);
+           mark_object (*obj);
            XMARK (*obj);
          }
 
       if (!XMARKBIT (stack->byte_string))
        {
-          mark_object (&stack->byte_string);
+          mark_object (stack->byte_string);
          XMARK (stack->byte_string);
        }
 
       if (!XMARKBIT (stack->constants))
        {
-         mark_object (&stack->constants);
+         mark_object (stack->constants);
          XMARK (stack->constants);
        }
     }
@@ -327,10 +328,10 @@ unmark_byte_stack ()
       XUNMARK (stack->byte_string);
       XUNMARK (stack->constants);
 
-      if (stack->byte_string_start != XSTRING (stack->byte_string)->data)
+      if (stack->byte_string_start != SDATA (stack->byte_string))
        {
          int offset = stack->pc - stack->byte_string_start;
-         stack->byte_string_start = XSTRING (stack->byte_string)->data;
+         stack->byte_string_start = SDATA (stack->byte_string);
          stack->pc = stack->byte_string_start + offset;
        }
     }
@@ -420,7 +421,7 @@ If the third argument is incorrect, Emacs may crash.  */)
      (bytestr, vector, maxdepth)
      Lisp_Object bytestr, vector, maxdepth;
 {
-  int count = specpdl_ptr - specpdl;
+  int count = SPECPDL_INDEX ();
 #ifdef BYTE_CODE_METER
   int this_op = 0;
   int prev_op;
@@ -460,11 +461,11 @@ If the third argument is incorrect, Emacs may crash.  */)
        convert them back to the originally intended unibyte form.  */
     bytestr = Fstring_as_unibyte (bytestr);
 
-  bytestr_length = STRING_BYTES (XSTRING (bytestr));
+  bytestr_length = SBYTES (bytestr);
   vectorp = XVECTOR (vector)->contents;
 
   stack.byte_string = bytestr;
-  stack.pc = stack.byte_string_start = XSTRING (bytestr)->data;
+  stack.pc = stack.byte_string_start = SDATA (bytestr);
   stack.constants = vector;
   stack.bottom = (Lisp_Object *) alloca (XFASTINT (maxdepth)
                                          * sizeof (Lisp_Object));
@@ -637,7 +638,7 @@ If the third argument is incorrect, Emacs may crash.  */)
                AFTER_POTENTIAL_GC ();
              }
          }
-         POP;
+         (void) POP;
          break;
 
        case Bdup:
@@ -728,7 +729,7 @@ If the third argument is incorrect, Emacs may crash.  */)
          op -= Bunbind;
        dounbind:
          BEFORE_POTENTIAL_GC ();
-         unbind_to (specpdl_ptr - specpdl - op, Qnil);
+         unbind_to (SPECPDL_INDEX () - op, Qnil);
          AFTER_POTENTIAL_GC ();
          break;
 
@@ -877,9 +878,8 @@ If the third argument is incorrect, Emacs may crash.  */)
        case Bunwind_protect:
          /* The function record_unwind_protect can GC.  */
          BEFORE_POTENTIAL_GC ();
-         record_unwind_protect (0, POP);
+         record_unwind_protect (Fprogn, POP);
          AFTER_POTENTIAL_GC ();
-         (specpdl_ptr - 1)->symbol = Qnil;
          break;
 
        case Bcondition_case:
@@ -896,7 +896,7 @@ If the third argument is incorrect, Emacs may crash.  */)
        case Btemp_output_buffer_setup:
          BEFORE_POTENTIAL_GC ();
          CHECK_STRING (TOP);
-         temp_output_buffer_setup (XSTRING (TOP)->data);
+         temp_output_buffer_setup (SDATA (TOP));
          AFTER_POTENTIAL_GC ();
          TOP = Vstandard_output;
          break;
@@ -909,7 +909,7 @@ If the third argument is incorrect, Emacs may crash.  */)
            temp_output_buffer_show (TOP);
            TOP = v1;
            /* pop binding of standard-output */
-           unbind_to (specpdl_ptr - specpdl - 1, Qnil);
+           unbind_to (SPECPDL_INDEX () - 1, Qnil);
            AFTER_POTENTIAL_GC ();
            break;
          }
@@ -1125,7 +1125,11 @@ If the third argument is incorrect, Emacs may crash.  */)
                TOP = v1;
              }
            else
-             TOP = Fsub1 (v1);
+             {
+               BEFORE_POTENTIAL_GC ();
+               TOP = Fsub1 (v1);
+               AFTER_POTENTIAL_GC ();
+             }
            break;
          }
 
@@ -1433,10 +1437,17 @@ If the third argument is incorrect, Emacs may crash.  */)
          break;
 
        case Bchar_syntax:
-         BEFORE_POTENTIAL_GC ();
-         CHECK_NUMBER (TOP);
-         AFTER_POTENTIAL_GC ();
-         XSETFASTINT (TOP, syntax_code_spec[(int) SYNTAX (XINT (TOP))]);
+         {
+           int c;
+
+           BEFORE_POTENTIAL_GC ();
+           CHECK_CHARACTER (TOP);
+           AFTER_POTENTIAL_GC ();
+           c = XFASTINT (TOP);
+           if (NILP (current_buffer->enable_multibyte_characters))
+             MAKE_CHAR_MULTIBYTE (c);
+           XSETFASTINT (TOP, syntax_code_spec[(int) SYNTAX (c)]);
+         }
          break;
 
        case Bbuffer_substring:
@@ -1725,7 +1736,7 @@ If the third argument is incorrect, Emacs may crash.  */)
   byte_stack_list = byte_stack_list->next;
 
   /* Binds and unbinds are supposed to be compiled balanced.  */
-  if (specpdl_ptr - specpdl != count)
+  if (SPECPDL_INDEX () != count)
 #ifdef BYTE_CODE_SAFE
     error ("binding stack not balanced (serious byte compiler bug)");
 #else