view src/bytecode.h @ 4905:755ae5b97edb

Change "special form" to "special operator" in our sources. Add a compatible function alias, and the relevant manual index entries. src/ChangeLog addition: 2010-01-31 Aidan Kehoe <kehoea@parhasard.net> * symbols.c (Fspecial_operator_p, syms_of_symbols): * eval.c (print_subr, Finteractive_p, Ffuncall) (Ffunction_min_args, Ffunction_max_args, vars_of_eval): * editfns.c: * data.c (Fsubr_max_args): * doc.c (Fbuilt_in_symbol_file): Change "special form" to "special operator" in our sources. man/ChangeLog addition: 2010-01-31 Aidan Kehoe <kehoea@parhasard.net> * xemacs/programs.texi (Defuns): * lispref/variables.texi (Local Variables, Defining Variables) (Setting Variables, Default Value): * lispref/symbols.texi (Definitions): * lispref/searching.texi (Saving Match Data): * lispref/positions.texi (Excursions, Narrowing): * lispref/objects.texi (Primitive Function Type): * lispref/macros.texi (Defining Macros, Backquote): * lispref/lispref.texi (Top): * lispref/intro.texi (A Sample Function Description): * lispref/help.texi (Help Functions): * lispref/functions.texi (What Is a Function, Simple Lambda) (Defining Functions, Calling Functions, Anonymous Functions): * lispref/frames.texi (Input Focus): * lispref/eval.texi (Forms, Function Indirection) (Special Operators, Quoting): * lispref/edebug-inc.texi (Instrumenting) (Specification Examples): * lispref/debugging.texi (Internals of Debugger): * lispref/control.texi (Control Structures, Sequencing): (Conditionals, Combining Conditions, Iteration): (Catch and Throw, Handling Errors): * lispref/commands.texi (Defining Commands, Using Interactive): Terminology change; special operator -> special form. Don't attempt to change this in texinfo.texi or cl.texi, which use macros I don't understand. * lispref/macros.texi (Defining Macros): Give an anonymous macro example here. * lispref/positions.texi (Excursions): Correct some documentation that called a couple of macros special forms. * lispref/searching.texi (Saving Match Data): Drop some documentation of how to write code that works with Emacs 18. * lispref/specifiers.texi (Adding Specifications): Correct this; #'let-specifier is a macro, not a special operator. * lispref/windows.texi (Window Configurations) (Selecting Windows): Correct this, #'save-selected-window and #'save-window-excursion are macros, not special operators. lisp/ChangeLog addition: 2010-01-31 Aidan Kehoe <kehoea@parhasard.net> * obsolete.el: * loadhist.el (symbol-file): * help.el (describe-function-1): * bytecomp.el: (byte-compile-save-current-buffer): * byte-optimize.el (byte-optimize-form-code-walker): * subr.el (subr-arity): Change "special form" to "special operator" in these files, it's the more logical term. * subr.el (special-form-p): Provide this alias for #'special-operator-p.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 31 Jan 2010 20:28:01 +0000
parents d674024a8674
children 17362f371cc2 e0db3c197671
line wrap: on
line source

/* Definitions for bytecode interpretation and compiled-function objects.
   Copyright (C) 1985, 1986, 1987, 1992, 1993 Free Software Foundation, Inc.
   Copyright (C) 2002 Ben Wing.

This file is part of XEmacs.

XEmacs 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 2, or (at your option) any
later version.

XEmacs is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with XEmacs; see the file COPYING.  If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/* Synched up with: Not in FSF. */

/* Authorship:

   FSF: long ago.
   Mly: rewrote for 19.8, properly abstracted.
   Jon Reid: some changes for I18N3 (domain, etc), for 19.8.
 */

#ifndef INCLUDED_bytecode_h_
#define INCLUDED_bytecode_h_

#ifdef NEW_GC
struct compiled_function_args
{
  struct lrecord_header header;
  long size;
  Lisp_Object args[1];
};

typedef struct compiled_function_args Lisp_Compiled_Function_Args;

DECLARE_LRECORD (compiled_function_args, Lisp_Compiled_Function_Args);

#define XCOMPILED_FUNCTION_ARGS(x) \
  XRECORD (x, compiled_function_args, Lisp_Compiled_Function_Args)
#define wrap_compiled_function_args(p) wrap_record (p, compiled_function_args)
#define COMPILED_FUNCTION_ARGS_P(x) RECORDP (x, compiled_function_args)
#define CHECK_COMPILED_FUNCTION_ARGS(x) \
  CHECK_RECORD (x, compiled_function_args)
#define CONCHECK_COMPILED_FUNCTION_ARGS(x) \
  CONCHECK_RECORD (x, compiled_function_args)

#define compiled_function_args_data(v) ((v)->args)
#define XCOMPILED_FUNCTION_ARGS_DATA(s) \
  compiled_function_args_data (XCOMPILED_FUNCTION_ARGS (s))
#endif /* NEW_GC */

/* Meanings of slots in a Lisp_Compiled_Function.
   Don't use these!  For backward compatibility only.  */
#define COMPILED_ARGLIST	0
#define COMPILED_INSTRUCTIONS	1
#define COMPILED_CONSTANTS	2
#define COMPILED_STACK_DEPTH	3
#define COMPILED_DOC_STRING	4
#define COMPILED_INTERACTIVE	5
#define COMPILED_DOMAIN		6

/* It doesn't make sense to have this and also have load-history */
/* #define COMPILED_FUNCTION_ANNOTATION_HACK */

struct Lisp_Compiled_Function
{
  struct lrecord_header lheader;
  unsigned short stack_depth;
  unsigned short specpdl_depth;
  struct
  {
    unsigned int documentationp: 1;
    unsigned int interactivep: 1;
    /* Only used if I18N3, but always defined for simplicity. */
    unsigned int domainp: 1;
    /* Non-zero if this bytecode came from a v18 or v19 file.
       We need to Ebolify the `assoc', `delq', etc. functions. */
    unsigned int ebolified: 1;
  } flags;
  Lisp_Object instructions;
  Lisp_Object constants;
  Lisp_Object arglist;
  /* For speed, we unroll arglist into an array of argument symbols, so we
     don't have to process arglist every time we make a function call. */
#ifdef NEW_GC
  Lisp_Object arguments;
#else /* not NEW_GC */
  Lisp_Object *args;
#endif /* not NEW_GC */
  /* Minimum and maximum number of arguments.  If MAX_ARGS == MANY, the
     function was declared with &rest, and (args_in_array - 1) indicates
     how many arguments there are before the &rest argument. (We could
     munge the max_non_rest_args into max_args by using a negative number,
     but that interferes with pdump marking.  We don't want to use a flag
     to indicate &rest because that would add an extra check in the
     simplest case.) */
  int min_args, max_args;
  int args_in_array;
  /* This uses the minimal number of conses; see accessors in data.c. */
  Lisp_Object doc_and_interactive;
#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
  /* Something indicating where the bytecode came from */
  Lisp_Object annotated;
#endif
};
typedef struct Lisp_Compiled_Function Lisp_Compiled_Function;

Lisp_Object run_byte_code (Lisp_Object compiled_function_or_instructions, ...);

Lisp_Object compiled_function_arglist       (Lisp_Compiled_Function *f);
Lisp_Object compiled_function_instructions  (Lisp_Compiled_Function *f);
Lisp_Object compiled_function_constants     (Lisp_Compiled_Function *f);
int         compiled_function_stack_depth   (Lisp_Compiled_Function *f);
Lisp_Object compiled_function_documentation (Lisp_Compiled_Function *f);
Lisp_Object compiled_function_annotation    (Lisp_Compiled_Function *f);
Lisp_Object compiled_function_domain        (Lisp_Compiled_Function *f);
Lisp_Object compiled_function_interactive   (Lisp_Compiled_Function *f);

void set_compiled_function_documentation (Lisp_Compiled_Function *f,
					  Lisp_Object new_doc);

void optimize_compiled_function (Lisp_Object compiled_function);

typedef unsigned char Opbyte;
Lisp_Object execute_optimized_program (const Opbyte *program,
				       int stack_depth,
				       Lisp_Object *constants_data);

DECLARE_LRECORD (compiled_function, Lisp_Compiled_Function);
#define XCOMPILED_FUNCTION(x) XRECORD (x, compiled_function, \
				       Lisp_Compiled_Function)
#define wrap_compiled_function(p) wrap_record (p, compiled_function)
#define COMPILED_FUNCTIONP(x) RECORDP (x, compiled_function)
#define CHECK_COMPILED_FUNCTION(x) CHECK_RECORD (x, compiled_function)
#define CONCHECK_COMPILED_FUNCTION(x) CONCHECK_RECORD (x, compiled_function)

extern Lisp_Object Qbyte_code;

/* total 1765 internal 101 doc-and-int 775 doc-only 389 int-only 42 neither 559
 no doc slot, no int slot
    overhead                        : (* 1765 0) =    0
    doc-and-int (args . (doc . int)): (*  775 4) = 3100
    doc-only    (args . doc)        : (*  389 2) =  778
    int-only    (args . int)        : (*   42 2) =   84
    neither     args                : (*  559 0) =    0 = 3962
 combined
    overhead                        : (* 1765 1) = 1765
    doc-and-int (doc . int)         : (*  775 2) = 1550
    doc-only    doc                 : (*  389 0) =    0
    int-only    int                 : (*   42 0) =    0
    neither     -                   : (*  559 0) =    0 = 3315
 both
    overhead                        : (* 1765 2) = 3530
    doc-and-int -                   : (*  775 0) =    0
    doc-only    -                   : (*  389 0) =    0
    int-only    -                   : (*   42 0) =    0
    neither     -                   : (*  559 0)  =   0 = 3530
*/

#endif /* INCLUDED_bytecode_h_ */