428
+ − 1 /* Definitions for bytecode interpretation and compiled-function objects.
+ − 2 Copyright (C) 1985, 1986, 1987, 1992, 1993 Free Software Foundation, Inc.
814
+ − 3 Copyright (C) 2002 Ben Wing.
428
+ − 4
+ − 5 This file is part of XEmacs.
+ − 6
+ − 7 XEmacs is free software; you can redistribute it and/or modify it
+ − 8 under the terms of the GNU General Public License as published by the
+ − 9 Free Software Foundation; either version 2, or (at your option) any
+ − 10 later version.
+ − 11
+ − 12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ − 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ − 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ − 15 for more details.
+ − 16
+ − 17 You should have received a copy of the GNU General Public License
+ − 18 along with XEmacs; see the file COPYING. If not, write to
+ − 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ − 20 Boston, MA 02111-1307, USA. */
+ − 21
+ − 22 /* Synched up with: Not in FSF. */
+ − 23
+ − 24 /* Authorship:
+ − 25
+ − 26 FSF: long ago.
+ − 27 Mly: rewrote for 19.8, properly abstracted.
+ − 28 Jon Reid: some changes for I18N3 (domain, etc), for 19.8.
+ − 29 */
+ − 30
440
+ − 31 #ifndef INCLUDED_bytecode_h_
+ − 32 #define INCLUDED_bytecode_h_
428
+ − 33
3092
+ − 34 #ifdef NEW_GC
+ − 35 struct compiled_function_args
+ − 36 {
+ − 37 struct lrecord_header header;
+ − 38 long size;
+ − 39 Lisp_Object args[1];
+ − 40 };
+ − 41
+ − 42 typedef struct compiled_function_args Lisp_Compiled_Function_Args;
+ − 43
+ − 44 DECLARE_LRECORD (compiled_function_args, Lisp_Compiled_Function_Args);
+ − 45
+ − 46 #define XCOMPILED_FUNCTION_ARGS(x) \
+ − 47 XRECORD (x, compiled_function_args, Lisp_Compiled_Function_Args)
+ − 48 #define wrap_compiled_function_args(p) wrap_record (p, compiled_function_args)
+ − 49 #define COMPILED_FUNCTION_ARGS_P(x) RECORDP (x, compiled_function_args)
+ − 50 #define CHECK_COMPILED_FUNCTION_ARGS(x) \
+ − 51 CHECK_RECORD (x, compiled_function_args)
+ − 52 #define CONCHECK_COMPILED_FUNCTION_ARGS(x) \
+ − 53 CONCHECK_RECORD (x, compiled_function_args)
+ − 54
+ − 55 #define compiled_function_args_data(v) ((v)->args)
+ − 56 #define XCOMPILED_FUNCTION_ARGS_DATA(s) \
+ − 57 compiled_function_args_data (XCOMPILED_FUNCTION_ARGS (s))
3263
+ − 58 #endif /* NEW_GC */
3092
+ − 59
428
+ − 60 /* Meanings of slots in a Lisp_Compiled_Function.
+ − 61 Don't use these! For backward compatibility only. */
+ − 62 #define COMPILED_ARGLIST 0
+ − 63 #define COMPILED_INSTRUCTIONS 1
+ − 64 #define COMPILED_CONSTANTS 2
+ − 65 #define COMPILED_STACK_DEPTH 3
+ − 66 #define COMPILED_DOC_STRING 4
+ − 67 #define COMPILED_INTERACTIVE 5
+ − 68 #define COMPILED_DOMAIN 6
+ − 69
+ − 70 /* It doesn't make sense to have this and also have load-history */
+ − 71 /* #define COMPILED_FUNCTION_ANNOTATION_HACK */
+ − 72
+ − 73 struct Lisp_Compiled_Function
+ − 74 {
+ − 75 struct lrecord_header lheader;
+ − 76 unsigned short stack_depth;
+ − 77 unsigned short specpdl_depth;
+ − 78 struct
+ − 79 {
+ − 80 unsigned int documentationp: 1;
+ − 81 unsigned int interactivep: 1;
+ − 82 /* Only used if I18N3, but always defined for simplicity. */
+ − 83 unsigned int domainp: 1;
+ − 84 /* Non-zero if this bytecode came from a v18 or v19 file.
+ − 85 We need to Ebolify the `assoc', `delq', etc. functions. */
+ − 86 unsigned int ebolified: 1;
+ − 87 } flags;
+ − 88 Lisp_Object instructions;
+ − 89 Lisp_Object constants;
+ − 90 Lisp_Object arglist;
814
+ − 91 /* For speed, we unroll arglist into an array of argument symbols, so we
+ − 92 don't have to process arglist every time we make a function call. */
3092
+ − 93 #ifdef NEW_GC
+ − 94 Lisp_Object arguments;
+ − 95 #else /* not NEW_GC */
814
+ − 96 Lisp_Object *args;
3092
+ − 97 #endif /* not NEW_GC */
814
+ − 98 /* Minimum and maximum number of arguments. If MAX_ARGS == MANY, the
+ − 99 function was declared with &rest, and (args_in_array - 1) indicates
+ − 100 how many arguments there are before the &rest argument. (We could
+ − 101 munge the max_non_rest_args into max_args by using a negative number,
+ − 102 but that interferes with pdump marking. We don't want to use a flag
+ − 103 to indicate &rest because that would add an extra check in the
+ − 104 simplest case.) */
+ − 105 int min_args, max_args;
+ − 106 int args_in_array;
428
+ − 107 /* This uses the minimal number of conses; see accessors in data.c. */
+ − 108 Lisp_Object doc_and_interactive;
+ − 109 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
+ − 110 /* Something indicating where the bytecode came from */
+ − 111 Lisp_Object annotated;
+ − 112 #endif
+ − 113 };
+ − 114 typedef struct Lisp_Compiled_Function Lisp_Compiled_Function;
+ − 115
+ − 116 Lisp_Object run_byte_code (Lisp_Object compiled_function_or_instructions, ...);
+ − 117
+ − 118 Lisp_Object compiled_function_arglist (Lisp_Compiled_Function *f);
+ − 119 Lisp_Object compiled_function_instructions (Lisp_Compiled_Function *f);
+ − 120 Lisp_Object compiled_function_constants (Lisp_Compiled_Function *f);
+ − 121 int compiled_function_stack_depth (Lisp_Compiled_Function *f);
+ − 122 Lisp_Object compiled_function_documentation (Lisp_Compiled_Function *f);
+ − 123 Lisp_Object compiled_function_annotation (Lisp_Compiled_Function *f);
+ − 124 Lisp_Object compiled_function_domain (Lisp_Compiled_Function *f);
+ − 125 Lisp_Object compiled_function_interactive (Lisp_Compiled_Function *f);
+ − 126
+ − 127 void set_compiled_function_documentation (Lisp_Compiled_Function *f,
+ − 128 Lisp_Object new_doc);
+ − 129
+ − 130 void optimize_compiled_function (Lisp_Object compiled_function);
+ − 131
814
+ − 132 typedef unsigned char Opbyte;
+ − 133 Lisp_Object execute_optimized_program (const Opbyte *program,
+ − 134 int stack_depth,
+ − 135 Lisp_Object *constants_data);
+ − 136
428
+ − 137 DECLARE_LRECORD (compiled_function, Lisp_Compiled_Function);
+ − 138 #define XCOMPILED_FUNCTION(x) XRECORD (x, compiled_function, \
+ − 139 Lisp_Compiled_Function)
617
+ − 140 #define wrap_compiled_function(p) wrap_record (p, compiled_function)
428
+ − 141 #define COMPILED_FUNCTIONP(x) RECORDP (x, compiled_function)
+ − 142 #define CHECK_COMPILED_FUNCTION(x) CHECK_RECORD (x, compiled_function)
+ − 143 #define CONCHECK_COMPILED_FUNCTION(x) CONCHECK_RECORD (x, compiled_function)
+ − 144
+ − 145 extern Lisp_Object Qbyte_code;
+ − 146
+ − 147 /* total 1765 internal 101 doc-and-int 775 doc-only 389 int-only 42 neither 559
+ − 148 no doc slot, no int slot
+ − 149 overhead : (* 1765 0) = 0
+ − 150 doc-and-int (args . (doc . int)): (* 775 4) = 3100
+ − 151 doc-only (args . doc) : (* 389 2) = 778
+ − 152 int-only (args . int) : (* 42 2) = 84
+ − 153 neither args : (* 559 0) = 0 = 3962
+ − 154 combined
+ − 155 overhead : (* 1765 1) = 1765
+ − 156 doc-and-int (doc . int) : (* 775 2) = 1550
+ − 157 doc-only doc : (* 389 0) = 0
+ − 158 int-only int : (* 42 0) = 0
+ − 159 neither - : (* 559 0) = 0 = 3315
+ − 160 both
+ − 161 overhead : (* 1765 2) = 3530
+ − 162 doc-and-int - : (* 775 0) = 0
+ − 163 doc-only - : (* 389 0) = 0
+ − 164 int-only - : (* 42 0) = 0
+ − 165 neither - : (* 559 0) = 0 = 3530
+ − 166 */
+ − 167
440
+ − 168 #endif /* INCLUDED_bytecode_h_ */
428
+ − 169