/* Execution of byte code produced by bytecomp.el.
- Copyright (C) 1985, 1986, 1987, 1988, 1993, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1987, 1988, 1993, 2000, 2001
+ Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include "charset.h"
#include "syntax.h"
+#ifdef CHECK_FRAME_FONT
+#include "frame.h"
+#include "xterm.h"
+#endif
+
/*
* define BYTE_CODE_SAFE to enable some minor sanity checking (useful for
* debugging the byte compiler...)
#endif /* not BYTE_CODE_SAFE */
+/* A version of the QUIT macro which makes sure that the stack top is
+ set before signaling `quit'. */
+
+#define BYTE_CODE_QUIT \
+ do { \
+ if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
+ { \
+ Vquit_flag = Qnil; \
+ BEFORE_POTENTIAL_GC (); \
+ Fsignal (Qquit, Qnil); \
+ } \
+ } while (0)
+
DEFUN ("byte-code", Fbyte_code, Sbyte_code, 3, 3, 0,
"Function used internally in byte-compiled code.\n\
Lisp_Object *top;
Lisp_Object result;
+#ifdef CHECK_FRAME_FONT
+ {
+ struct frame *f = SELECTED_FRAME ();
+ if (FRAME_X_P (f)
+ && FRAME_FONT (f)->direction != 0
+ && FRAME_FONT (f)->direction != 1)
+ abort ();
+ }
+#endif
+
CHECK_STRING (bytestr, 0);
if (!VECTORP (vector))
vector = wrong_type_argument (Qvectorp, vector);
op = FETCH2;
if (NILP (POP))
{
- QUIT;
+ BYTE_CODE_QUIT;
CHECK_RANGE (op);
stack.pc = stack.byte_string_start + op;
}
case Bgoto:
MAYBE_GC ();
- QUIT;
+ BYTE_CODE_QUIT;
op = FETCH2; /* pc = FETCH2 loses since FETCH2 contains pc++ */
CHECK_RANGE (op);
stack.pc = stack.byte_string_start + op;
op = FETCH2;
if (!NILP (POP))
{
- QUIT;
+ BYTE_CODE_QUIT;
CHECK_RANGE (op);
stack.pc = stack.byte_string_start + op;
}
op = FETCH2;
if (NILP (TOP))
{
- QUIT;
+ BYTE_CODE_QUIT;
CHECK_RANGE (op);
stack.pc = stack.byte_string_start + op;
}
op = FETCH2;
if (!NILP (TOP))
{
- QUIT;
+ BYTE_CODE_QUIT;
CHECK_RANGE (op);
stack.pc = stack.byte_string_start + op;
}
case BRgoto:
MAYBE_GC ();
- QUIT;
+ BYTE_CODE_QUIT;
stack.pc += (int) *stack.pc - 127;
break;
MAYBE_GC ();
if (NILP (POP))
{
- QUIT;
+ BYTE_CODE_QUIT;
stack.pc += (int) *stack.pc - 128;
}
stack.pc++;
MAYBE_GC ();
if (!NILP (POP))
{
- QUIT;
+ BYTE_CODE_QUIT;
stack.pc += (int) *stack.pc - 128;
}
stack.pc++;
op = *stack.pc++;
if (NILP (TOP))
{
- QUIT;
+ BYTE_CODE_QUIT;
stack.pc += op - 128;
}
else DISCARD (1);
op = *stack.pc++;
if (!NILP (TOP))
{
- QUIT;
+ BYTE_CODE_QUIT;
stack.pc += op - 128;
}
else DISCARD (1);
case Btemp_output_buffer_setup:
BEFORE_POTENTIAL_GC ();
+ CHECK_STRING (TOP, 0);
temp_output_buffer_setup (XSTRING (TOP)->data);
AFTER_POTENTIAL_GC ();
TOP = Vstandard_output;
case Bgeq:
{
Lisp_Object v1;
+ BEFORE_POTENTIAL_GC ();
v1 = POP;
TOP = Fgeq (TOP, v1);
+ AFTER_POTENTIAL_GC ();
break;
}
case Bcurrent_column:
{
Lisp_Object v1;
+ BEFORE_POTENTIAL_GC ();
XSETFASTINT (v1, current_column ());
+ AFTER_POTENTIAL_GC ();
PUSH (v1);
break;
}