/* Execution of byte code produced by bytecomp.el.
- Copyright (C) 1985, 1986, 1987, 1988, 1993, 2000, 2001, 2002, 2003
- Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1987, 1988, 1993, 2000, 2001, 2002, 2003, 2004,
+ 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of GNU Emacs.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.
hacked on by jwz@lucid.com 17-jun-91
o added a compile-time switch to turn on simple sanity checking;
The culprit is found in the frame of Fbyte_code where the
address of its local variable `stack' is equal to the
recorded value of `stack' here. */
- if (!stack->top)
- abort ();
+ eassert (stack->top);
for (obj = stack->bottom; obj <= stack->top; ++obj)
- if (!XMARKBIT (*obj))
- {
- mark_object (*obj);
- XMARK (*obj);
- }
+ mark_object (*obj);
- if (!XMARKBIT (stack->byte_string))
- {
- mark_object (stack->byte_string);
- XMARK (stack->byte_string);
- }
-
- if (!XMARKBIT (stack->constants))
- {
- mark_object (stack->constants);
- XMARK (stack->constants);
- }
+ mark_object (stack->byte_string);
+ mark_object (stack->constants);
}
}
unmark_byte_stack ()
{
struct byte_stack *stack;
- Lisp_Object *obj;
for (stack = byte_stack_list; stack; stack = stack->next)
{
- for (obj = stack->bottom; obj <= stack->top; ++obj)
- XUNMARK (*obj);
-
- XUNMARK (stack->byte_string);
- XUNMARK (stack->constants);
-
if (stack->byte_string_start != SDATA (stack->byte_string))
{
int offset = stack->pc - stack->byte_string_start;
/* Garbage collect if we have consed enough since the last time.
We do this at every branch, to avoid loops that never GC. */
-#define MAYBE_GC() \
- if (consing_since_gc > gc_cons_threshold) \
- { \
- BEFORE_POTENTIAL_GC (); \
- Fgarbage_collect (); \
- AFTER_POTENTIAL_GC (); \
- } \
+#define MAYBE_GC() \
+ if (consing_since_gc > gc_cons_threshold \
+ && consing_since_gc > gc_relative_threshold) \
+ { \
+ BEFORE_POTENTIAL_GC (); \
+ Fgarbage_collect (); \
+ AFTER_POTENTIAL_GC (); \
+ } \
else
/* Check for jumping out of range. */
do { \
if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
{ \
+ Lisp_Object flag = Vquit_flag; \
Vquit_flag = Qnil; \
BEFORE_POTENTIAL_GC (); \
+ if (EQ (Vthrow_on_input, flag)) \
+ Fthrow (Vthrow_on_input, Qt); \
Fsignal (Qquit, Qnil); \
+ AFTER_POTENTIAL_GC (); \
} \
} while (0)
#endif
CHECK_STRING (bytestr);
- if (!VECTORP (vector))
- vector = wrong_type_argument (Qvectorp, vector);
+ CHECK_VECTOR (vector);
CHECK_NUMBER (maxdepth);
if (STRING_MULTIBYTE (bytestr))
}
case Bgotoifnil:
- MAYBE_GC ();
- op = FETCH2;
- if (NILP (POP))
- {
- BYTE_CODE_QUIT;
- CHECK_RANGE (op);
- stack.pc = stack.byte_string_start + op;
- }
- break;
+ {
+ Lisp_Object v1;
+ MAYBE_GC ();
+ op = FETCH2;
+ v1 = POP;
+ if (NILP (v1))
+ {
+ BYTE_CODE_QUIT;
+ CHECK_RANGE (op);
+ stack.pc = stack.byte_string_start + op;
+ }
+ break;
+ }
case Bcar:
{
Lisp_Object v1;
v1 = TOP;
- if (CONSP (v1))
- TOP = XCAR (v1);
- else if (NILP (v1))
- TOP = Qnil;
- else
- {
- BEFORE_POTENTIAL_GC ();
- Fcar (wrong_type_argument (Qlistp, v1));
- AFTER_POTENTIAL_GC ();
- }
+ TOP = CAR (v1);
break;
}
{
Lisp_Object v1;
v1 = TOP;
- if (CONSP (v1))
- TOP = XCDR (v1);
- else if (NILP (v1))
- TOP = Qnil;
- else
- {
- BEFORE_POTENTIAL_GC ();
- Fcdr (wrong_type_argument (Qlistp, v1));
- AFTER_POTENTIAL_GC ();
- }
+ TOP = CDR (v1);
break;
}
if (SYMBOLP (sym)
&& !EQ (val, Qunbound)
&& !XSYMBOL (sym)->indirect_variable
- && !XSYMBOL (sym)->constant
+ && !SYMBOL_CONSTANT_P (sym)
&& !MISCP (XSYMBOL (sym)->value))
XSYMBOL (sym)->value = val;
else
break;
case Bgotoifnonnil:
- MAYBE_GC ();
- op = FETCH2;
- if (!NILP (POP))
- {
- BYTE_CODE_QUIT;
- CHECK_RANGE (op);
- stack.pc = stack.byte_string_start + op;
- }
- break;
+ {
+ Lisp_Object v1;
+ MAYBE_GC ();
+ op = FETCH2;
+ v1 = POP;
+ if (!NILP (v1))
+ {
+ BYTE_CODE_QUIT;
+ CHECK_RANGE (op);
+ stack.pc = stack.byte_string_start + op;
+ }
+ break;
+ }
case Bgotoifnilelsepop:
MAYBE_GC ();
break;
case BRgotoifnil:
- MAYBE_GC ();
- if (NILP (POP))
- {
- BYTE_CODE_QUIT;
- stack.pc += (int) *stack.pc - 128;
- }
- stack.pc++;
- break;
+ {
+ Lisp_Object v1;
+ MAYBE_GC ();
+ v1 = POP;
+ if (NILP (v1))
+ {
+ BYTE_CODE_QUIT;
+ stack.pc += (int) *stack.pc - 128;
+ }
+ stack.pc++;
+ break;
+ }
case BRgotoifnonnil:
- MAYBE_GC ();
- if (!NILP (POP))
- {
- BYTE_CODE_QUIT;
- stack.pc += (int) *stack.pc - 128;
- }
- stack.pc++;
- break;
+ {
+ Lisp_Object v1;
+ MAYBE_GC ();
+ v1 = POP;
+ if (!NILP (v1))
+ {
+ BYTE_CODE_QUIT;
+ stack.pc += (int) *stack.pc - 128;
+ }
+ stack.pc++;
+ break;
+ }
case BRgotoifnilelsepop:
MAYBE_GC ();
}
case Bunwind_protect:
- /* The function record_unwind_protect can GC. */
- BEFORE_POTENTIAL_GC ();
record_unwind_protect (Fprogn, POP);
- AFTER_POTENTIAL_GC ();
break;
case Bcondition_case:
{
- Lisp_Object v1;
- v1 = POP;
- v1 = Fcons (POP, v1);
+ Lisp_Object handlers, body;
+ handlers = POP;
+ body = POP;
BEFORE_POTENTIAL_GC ();
- TOP = Fcondition_case (Fcons (TOP, v1));
+ TOP = internal_lisp_condition_case (TOP, body, handlers);
AFTER_POTENTIAL_GC ();
break;
}
AFTER_POTENTIAL_GC ();
op = XINT (v2);
immediate_quit = 1;
- while (--op >= 0)
- {
- if (CONSP (v1))
- v1 = XCDR (v1);
- else if (!NILP (v1))
- {
- immediate_quit = 0;
- BEFORE_POTENTIAL_GC ();
- v1 = wrong_type_argument (Qlistp, v1);
- AFTER_POTENTIAL_GC ();
- immediate_quit = 1;
- op++;
- }
- }
+ while (--op >= 0 && CONSP (v1))
+ v1 = XCDR (v1);
immediate_quit = 0;
- if (CONSP (v1))
- TOP = XCAR (v1);
- else if (NILP (v1))
- TOP = Qnil;
- else
- {
- BEFORE_POTENTIAL_GC ();
- Fcar (wrong_type_argument (Qlistp, v1));
- AFTER_POTENTIAL_GC ();
- }
+ TOP = CAR (v1);
break;
}
AFTER_POTENTIAL_GC ();
op = XINT (v2);
immediate_quit = 1;
- while (--op >= 0)
- {
- if (CONSP (v1))
- v1 = XCDR (v1);
- else if (!NILP (v1))
- {
- immediate_quit = 0;
- BEFORE_POTENTIAL_GC ();
- v1 = wrong_type_argument (Qlistp, v1);
- AFTER_POTENTIAL_GC ();
- immediate_quit = 1;
- op++;
- }
- }
+ while (--op >= 0 && CONSP (v1))
+ v1 = XCDR (v1);
immediate_quit = 0;
- if (CONSP (v1))
- TOP = XCAR (v1);
- else if (NILP (v1))
- TOP = Qnil;
- else
- {
- BEFORE_POTENTIAL_GC ();
- Fcar (wrong_type_argument (Qlistp, v1));
- AFTER_POTENTIAL_GC ();
- }
+ TOP = CAR (v1);
}
else
{
{
Lisp_Object v1;
v1 = TOP;
- if (CONSP (v1))
- TOP = XCAR (v1);
- else
- TOP = Qnil;
+ TOP = CAR_SAFE (v1);
break;
}
{
Lisp_Object v1;
v1 = TOP;
- if (CONSP (v1))
- TOP = XCDR (v1);
- else
- TOP = Qnil;
+ TOP = CDR_SAFE (v1);
break;
}