/* Execution of byte code produced by bytecomp.el.
- Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1987, 1988, 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
o all conditionals now only do QUIT if they jump.
*/
-#include "config.h"
+#include <config.h>
#include "lisp.h"
#include "buffer.h"
#include "syntax.h"
if (METER_1 (this_code) != ((1<<VALBITS)-1)) \
METER_1 (this_code)++; \
if (last_code \
- && METER_2 (last_code, this_code) != ((1<<VALBITS)-1)) \
+ && METER_2 (last_code, this_code) != ((1<<VALBITS)-1))\
METER_2 (last_code, this_code)++; \
} \
}
#define Baref 0110
#define Baset 0111
#define Bsymbol_value 0112
-#define Bsymbol_function 0113 /* no longer generated as of v19 */
+#define Bsymbol_function 0113
#define Bset 0114
-#define Bfset 0115 /* no longer generated as of v19 */
+#define Bfset 0115
#define Bget 0116
#define Bsubstring 0117
#define Bconcat2 0120
pc - XSTRING (string_saved)->data);
#endif
- if (string_saved != bytestr)
+ if (! EQ (string_saved, bytestr))
{
pc = pc - XSTRING (string_saved)->data + XSTRING (bytestr)->data;
string_saved = bytestr;
{
v1 = TOP;
v2 = Fget (v1, Qbyte_code_meter);
- if (XTYPE (v2) == Lisp_Int)
+ if (XTYPE (v2) == Lisp_Int
+ && XINT (v2) != ((1<<VALBITS)-1))
{
XSETINT (v2, XINT (v2) + 1);
Fput (v1, Qbyte_code_meter, v2);
case Bgotoifnil:
op = FETCH2;
- if (NULL (POP))
+ if (NILP (POP))
{
QUIT;
pc = XSTRING (string_saved)->data + op;
case Bgotoifnonnil:
op = FETCH2;
- if (!NULL (POP))
+ if (!NILP (POP))
{
QUIT;
pc = XSTRING (string_saved)->data + op;
case Bgotoifnilelsepop:
op = FETCH2;
- if (NULL (TOP))
+ if (NILP (TOP))
{
QUIT;
pc = XSTRING (string_saved)->data + op;
case Bgotoifnonnilelsepop:
op = FETCH2;
- if (!NULL (TOP))
+ if (!NILP (TOP))
{
QUIT;
pc = XSTRING (string_saved)->data + op;
break;
case BRgotoifnil:
- if (NULL (POP))
+ if (NILP (POP))
{
QUIT;
pc += *pc - 128;
break;
case BRgotoifnonnil:
- if (!NULL (POP))
+ if (!NILP (POP))
{
QUIT;
pc += *pc - 128;
case BRgotoifnilelsepop:
op = *pc++;
- if (NULL (TOP))
+ if (NILP (TOP))
{
QUIT;
pc += op - 128;
case BRgotoifnonnilelsepop:
op = *pc++;
- if (!NULL (TOP))
+ if (!NILP (TOP))
{
QUIT;
pc += op - 128;
case Btemp_output_buffer_show:
v1 = POP;
- temp_output_buffer_show (TOP, Qnil);
+ temp_output_buffer_show (TOP);
TOP = v1;
/* pop binding of standard-output */
unbind_to (specpdl_ptr - specpdl - 1, Qnil);
{
if (CONSP (v1))
v1 = XCONS (v1)->cdr;
- else if (!NULL (v1))
+ else if (!NILP (v1))
{
immediate_quit = 0;
v1 = wrong_type_argument (Qlistp, v1);
break;
case Blistp:
- TOP = CONSP (TOP) || NULL (TOP) ? Qt : Qnil;
+ TOP = CONSP (TOP) || NILP (TOP) ? Qt : Qnil;
break;
case Beq:
break;
case Bnot:
- TOP = NULL (TOP) ? Qt : Qnil;
+ TOP = NILP (TOP) ? Qt : Qnil;
break;
case Bcar:
v1 = TOP;
docar:
if (CONSP (v1)) TOP = XCONS (v1)->car;
- else if (NULL (v1)) TOP = Qnil;
+ else if (NILP (v1)) TOP = Qnil;
else Fcar (wrong_type_argument (Qlistp, v1));
break;
case Bcdr:
v1 = TOP;
if (CONSP (v1)) TOP = XCONS (v1)->cdr;
- else if (NULL (v1)) TOP = Qnil;
+ else if (NILP (v1)) TOP = Qnil;
else Fcdr (wrong_type_argument (Qlistp, v1));
break;
break;
case Bnumberp:
- TOP = (XTYPE (TOP) == Lisp_Int || XTYPE (TOP) == Lisp_Float
- ? Qt : Qnil);
+ TOP = (NUMBERP (TOP) ? Qt : Qnil);
break;
case Bintegerp:
#ifdef BYTE_CODE_METER
DEFVAR_LISP ("byte-code-meter", &Vbyte_code_meter,
- "A vector of vectors which holds a histogram of byte-code usage.");
- DEFVAR_BOOL ("byte-metering-on", &byte_metering_on, "");
+ "A vector of vectors which holds a histogram of byte-code usage.\n\
+(aref (aref byte-code-meter 0) CODE) indicates how many times the byte\n\
+opcode CODE has been executed.\n\
+(aref (aref byte-code-meter CODE1) CODE2), where CODE1 is not 0,\n\
+indicates how many times the byte opcodes CODE1 and CODE2 have been\n\
+executed in succession.");
+ DEFVAR_BOOL ("byte-metering-on", &byte_metering_on,
+ "If non-nil, keep profiling information on byte code usage.\n\
+The variable byte-code-meter indicates how often each byte opcode is used.\n\
+If a symbol has a property named `byte-code-meter' whose value is an\n\
+integer, it is incremented each time that symbol's function is called.");
byte_metering_on = 0;
Vbyte_code_meter = Fmake_vector (make_number (256), make_number (0));