1 | /*
|
---|
2 | * bltInterp.h --
|
---|
3 | *
|
---|
4 | * Excerpts from tclInt.h. Used to examine interpreter internals.
|
---|
5 | * Needed by the former (now obsoleted) TclParse* functions.
|
---|
6 | *
|
---|
7 | * Copyright (c) 1987-1993 The Regents of the University of California.
|
---|
8 | * Copyright (c) 1993-1997 Lucent Technologies.
|
---|
9 | * Copyright (c) 1994-1998 Sun Microsystems, Inc.
|
---|
10 | *
|
---|
11 | */
|
---|
12 |
|
---|
13 | /*
|
---|
14 | *----------------------------------------------------------------
|
---|
15 | * Data structures related to command parsing. These are used in
|
---|
16 | * tclParse.c and its clients.
|
---|
17 | *----------------------------------------------------------------
|
---|
18 | */
|
---|
19 |
|
---|
20 | /*
|
---|
21 | * The following data structure is used by various parsing procedures
|
---|
22 | * to hold information about where to store the results of parsing
|
---|
23 | * (e.g. the substituted contents of a quoted argument, or the result
|
---|
24 | * of a nested command). At any given time, the space available
|
---|
25 | * for output is fixed, but a procedure may be called to expand the
|
---|
26 | * space available if the current space runs out.
|
---|
27 | */
|
---|
28 | typedef struct ParseValueStruct ParseValue;
|
---|
29 |
|
---|
30 | struct ParseValueStruct {
|
---|
31 | char *buffer; /* Address of first character in
|
---|
32 | * output buffer. */
|
---|
33 | char *next; /* Place to store next character in
|
---|
34 | * output buffer. */
|
---|
35 | char *end; /* Address of the last usable character
|
---|
36 | * in the buffer. */
|
---|
37 | void (*expandProc) _ANSI_ARGS_((ParseValue *pvPtr, int needed));
|
---|
38 | /* Procedure to call when space runs out;
|
---|
39 | * it will make more space. */
|
---|
40 | ClientData clientData; /* Arbitrary information for use of
|
---|
41 | * expandProc. */
|
---|
42 | };
|
---|
43 |
|
---|
44 |
|
---|
45 | /*
|
---|
46 | * The definitions for the LiteralTable and LiteralEntry structures. Each
|
---|
47 | * interpreter contains a LiteralTable. It is used to reduce the storage
|
---|
48 | * needed for all the Tcl objects that hold the literals of scripts compiled
|
---|
49 | * by the interpreter. A literal's object is shared by all the ByteCodes
|
---|
50 | * that refer to the literal. Each distinct literal has one LiteralEntry
|
---|
51 | * entry in the LiteralTable. A literal table is a specialized hash table
|
---|
52 | * that is indexed by the literal's string representation, which may contain
|
---|
53 | * null characters.
|
---|
54 | *
|
---|
55 | * Note that we reduce the space needed for literals by sharing literal
|
---|
56 | * objects both within a ByteCode (each ByteCode contains a local
|
---|
57 | * LiteralTable) and across all an interpreter's ByteCodes (with the
|
---|
58 | * interpreter's global LiteralTable).
|
---|
59 | */
|
---|
60 |
|
---|
61 | typedef struct LiteralEntryStruct LiteralEntry;
|
---|
62 |
|
---|
63 | struct LiteralEntryStruct {
|
---|
64 | LiteralEntry *nextPtr; /* Points to next entry in this
|
---|
65 | * hash bucket or NULL if end of
|
---|
66 | * chain. */
|
---|
67 | Tcl_Obj *objPtr; /* Points to Tcl object that
|
---|
68 | * holds the literal's bytes and
|
---|
69 | * length. */
|
---|
70 | int refCount; /* If in an interpreter's global
|
---|
71 | * literal table, the number of
|
---|
72 | * ByteCode structures that share
|
---|
73 | * the literal object; the literal
|
---|
74 | * entry can be freed when refCount
|
---|
75 | * drops to 0. If in a local literal
|
---|
76 | * table, -1. */
|
---|
77 | };
|
---|
78 |
|
---|
79 | typedef struct {
|
---|
80 | LiteralEntry **buckets; /* Pointer to bucket array. Each
|
---|
81 | * element points to first entry in
|
---|
82 | * bucket's hash chain, or NULL. */
|
---|
83 | LiteralEntry *staticBuckets[TCL_SMALL_HASH_TABLE];
|
---|
84 | /* Bucket array used for small
|
---|
85 | * tables to avoid mallocs and
|
---|
86 | * frees. */
|
---|
87 | int numBuckets; /* Total number of buckets allocated
|
---|
88 | * at **buckets. */
|
---|
89 | int numEntries; /* Total number of entries present
|
---|
90 | * in table. */
|
---|
91 | int rebuildSize; /* Enlarge table when numEntries
|
---|
92 | * gets to be this large. */
|
---|
93 | int mask; /* Mask value used in hashing
|
---|
94 | * function. */
|
---|
95 | } LiteralTable;
|
---|
96 |
|
---|
97 | /*
|
---|
98 | * The following structure defines for each Tcl interpreter various
|
---|
99 | * statistics-related information about the bytecode compiler and
|
---|
100 | * interpreter's operation in that interpreter.
|
---|
101 | */
|
---|
102 |
|
---|
103 | #ifdef TCL_COMPILE_STATS
|
---|
104 | typedef struct {
|
---|
105 | long numExecutions; /* Number of ByteCodes executed. */
|
---|
106 | long numCompilations; /* Number of ByteCodes created. */
|
---|
107 | long numByteCodesFreed; /* Number of ByteCodes destroyed. */
|
---|
108 | long instructionCount[256]; /* Number of times each instruction was
|
---|
109 | * executed. */
|
---|
110 |
|
---|
111 | double totalSrcBytes; /* Total source bytes ever compiled. */
|
---|
112 | double totalByteCodeBytes; /* Total bytes for all ByteCodes. */
|
---|
113 | double currentSrcBytes; /* Src bytes for all current ByteCodes. */
|
---|
114 | double currentByteCodeBytes;/* Code bytes in all current ByteCodes. */
|
---|
115 |
|
---|
116 | long srcCount[32]; /* Source size distribution: # of srcs of
|
---|
117 | * size [2**(n-1)..2**n), n in [0..32). */
|
---|
118 | long byteCodeCount[32]; /* ByteCode size distribution. */
|
---|
119 | long lifetimeCount[32]; /* ByteCode lifetime distribution (ms). */
|
---|
120 |
|
---|
121 | double currentInstBytes; /* Instruction bytes-current ByteCodes. */
|
---|
122 | double currentLitBytes; /* Current literal bytes. */
|
---|
123 | double currentExceptBytes; /* Current exception table bytes. */
|
---|
124 | double currentAuxBytes; /* Current auxiliary information bytes. */
|
---|
125 | double currentCmdMapBytes; /* Current src<->code map bytes. */
|
---|
126 |
|
---|
127 | long numLiteralsCreated; /* Total literal objects ever compiled. */
|
---|
128 | double totalLitStringBytes; /* Total string bytes in all literals. */
|
---|
129 | double currentLitStringBytes; /* String bytes in current literals. */
|
---|
130 | long literalCount[32]; /* Distribution of literal string sizes. */
|
---|
131 | } ByteCodeStats;
|
---|
132 |
|
---|
133 | #endif /* TCL_COMPILE_STATS */
|
---|
134 |
|
---|
135 |
|
---|
136 | /*
|
---|
137 | *----------------------------------------------------------------
|
---|
138 | * Data structures and procedures related to TclHandles, which
|
---|
139 | * are a very lightweight method of preserving enough information
|
---|
140 | * to determine if an arbitrary malloc'd block has been deleted.
|
---|
141 | *----------------------------------------------------------------
|
---|
142 | */
|
---|
143 |
|
---|
144 | typedef VOID **TclHandle;
|
---|
145 |
|
---|
146 |
|
---|
147 | /*
|
---|
148 | * The following fills in dummy types for structure refered to
|
---|
149 | * internally by the Tcl interpreter. Since we don't need the actual
|
---|
150 | * size of the structures (they are only pointer references), we'll
|
---|
151 | * simply provide empty opaque types.
|
---|
152 | *
|
---|
153 | */
|
---|
154 | typedef struct CallFrameStruct CallFrame;
|
---|
155 | typedef struct NamespaceStruct Namespace;
|
---|
156 | typedef struct ActiveVarTraceStruct ActiveVarTrace;
|
---|
157 | typedef struct ProcStruct Proc;
|
---|
158 | typedef struct TraceStruct Trace;
|
---|
159 |
|
---|
160 | typedef struct TclRegexpStruct TclRegexp;
|
---|
161 | typedef struct ExecEnvStruct ExecEnv;
|
---|
162 |
|
---|
163 |
|
---|
164 | /*
|
---|
165 | *----------------------------------------------------------------
|
---|
166 | * This structure defines an interpreter, which is a collection of
|
---|
167 | * commands plus other state information related to interpreting
|
---|
168 | * commands, such as variable storage. Primary responsibility for
|
---|
169 | * this data structure is in tclBasic.c, but almost every Tcl
|
---|
170 | * source file uses something in here.
|
---|
171 | *----------------------------------------------------------------
|
---|
172 | */
|
---|
173 |
|
---|
174 | typedef struct {
|
---|
175 |
|
---|
176 | /*
|
---|
177 | * Note: the first three fields must match exactly the fields in
|
---|
178 | * a Tcl_Interp struct (see tcl.h). If you change one, be sure to
|
---|
179 | * change the other.
|
---|
180 | *
|
---|
181 | * The interpreter's result is held in both the string and the
|
---|
182 | * objResultPtr fields. These fields hold, respectively, the result's
|
---|
183 | * string or object value. The interpreter's result is always in the
|
---|
184 | * result field if that is non-empty, otherwise it is in objResultPtr.
|
---|
185 | * The two fields are kept consistent unless some C code sets
|
---|
186 | * interp->result directly. Programs should not access result and
|
---|
187 | * objResultPtr directly; instead, they should always get and set the
|
---|
188 | * result using procedures such as Tcl_SetObjResult, Tcl_GetObjResult,
|
---|
189 | * and Tcl_GetStringResult. See the SetResult man page for details.
|
---|
190 | */
|
---|
191 |
|
---|
192 | char *result; /* If the last command returned a string
|
---|
193 | * result, this points to it. Should not be
|
---|
194 | * accessed directly; see comment above. */
|
---|
195 | Tcl_FreeProc *freeProc; /* Zero means a string result is statically
|
---|
196 | * allocated. TCL_DYNAMIC means string
|
---|
197 | * result was allocated with ckalloc and
|
---|
198 | * should be freed with ckfree. Other values
|
---|
199 | * give address of procedure to invoke to
|
---|
200 | * free the string result. Tcl_Eval must
|
---|
201 | * free it before executing next command. */
|
---|
202 | int errorLine; /* When TCL_ERROR is returned, this gives
|
---|
203 | * the line number in the command where the
|
---|
204 | * error occurred (1 means first line). */
|
---|
205 | Tcl_Obj *objResultPtr; /* If the last command returned an object
|
---|
206 | * result, this points to it. Should not be
|
---|
207 | * accessed directly; see comment above. */
|
---|
208 |
|
---|
209 | TclHandle handle; /* Handle used to keep track of when this
|
---|
210 | * interp is deleted. */
|
---|
211 |
|
---|
212 | Namespace *globalNsPtr; /* The interpreter's global namespace. */
|
---|
213 | Tcl_HashTable *hiddenCmdTablePtr;
|
---|
214 | /* Hash table used by tclBasic.c to keep
|
---|
215 | * track of hidden commands on a per-interp
|
---|
216 | * basis. */
|
---|
217 | ClientData interpInfo; /* Information used by tclInterp.c to keep
|
---|
218 | * track of master/slave interps on
|
---|
219 | * a per-interp basis. */
|
---|
220 | Tcl_HashTable mathFuncTable;/* Contains all the math functions currently
|
---|
221 | * defined for the interpreter. Indexed by
|
---|
222 | * strings (function names); values have
|
---|
223 | * type (MathFunc *). */
|
---|
224 |
|
---|
225 |
|
---|
226 |
|
---|
227 | /*
|
---|
228 | * Information related to procedures and variables. See tclProc.c
|
---|
229 | * and tclvar.c for usage.
|
---|
230 | */
|
---|
231 |
|
---|
232 | int numLevels; /* Keeps track of how many nested calls to
|
---|
233 | * Tcl_Eval are in progress for this
|
---|
234 | * interpreter. It's used to delay deletion
|
---|
235 | * of the table until all Tcl_Eval
|
---|
236 | * invocations are completed. */
|
---|
237 | int maxNestingDepth; /* If numLevels exceeds this value then Tcl
|
---|
238 | * assumes that infinite recursion has
|
---|
239 | * occurred and it generates an error. */
|
---|
240 | CallFrame *framePtr; /* Points to top-most in stack of all nested
|
---|
241 | * procedure invocations. NULL means there
|
---|
242 | * are no active procedures. */
|
---|
243 | CallFrame *varFramePtr; /* Points to the call frame whose variables
|
---|
244 | * are currently in use (same as framePtr
|
---|
245 | * unless an "uplevel" command is
|
---|
246 | * executing). NULL means no procedure is
|
---|
247 | * active or "uplevel 0" is executing. */
|
---|
248 | ActiveVarTrace *activeTracePtr;
|
---|
249 | /* First in list of active traces for
|
---|
250 | * interp, or NULL if no active traces. */
|
---|
251 | int returnCode; /* Completion code to return if current
|
---|
252 | * procedure exits with TCL_RETURN code. */
|
---|
253 | char *errorInfo; /* Value to store in errorInfo if returnCode
|
---|
254 | * is TCL_ERROR. Malloc'ed, may be NULL */
|
---|
255 | char *errorCode; /* Value to store in errorCode if returnCode
|
---|
256 | * is TCL_ERROR. Malloc'ed, may be NULL */
|
---|
257 |
|
---|
258 | /*
|
---|
259 | * Information used by Tcl_AppendResult to keep track of partial
|
---|
260 | * results. See Tcl_AppendResult code for details.
|
---|
261 | */
|
---|
262 |
|
---|
263 | char *appendResult; /* Storage space for results generated
|
---|
264 | * by Tcl_AppendResult. Malloc-ed. NULL
|
---|
265 | * means not yet allocated. */
|
---|
266 | int appendAvl; /* Total amount of space available at
|
---|
267 | * partialResult. */
|
---|
268 | int appendUsed; /* Number of non-null bytes currently
|
---|
269 | * stored at partialResult. */
|
---|
270 |
|
---|
271 | /*
|
---|
272 | * A cache of compiled regular expressions. See Tcl_RegExpCompile
|
---|
273 | * in tclUtil.c for details. THIS CACHE IS OBSOLETE and is only
|
---|
274 | * retained for backward compatibility with Tcl_RegExpCompile.
|
---|
275 | * New code should use the object interface so the Tcl_Obj caches
|
---|
276 | * the compiled expression.
|
---|
277 | */
|
---|
278 |
|
---|
279 | #define NUM_REGEXPS 5
|
---|
280 | char *patterns[NUM_REGEXPS];/* Strings corresponding to compiled
|
---|
281 | * regular expression patterns. NULL
|
---|
282 | * means that this slot isn't used.
|
---|
283 | * Malloc-ed. */
|
---|
284 | int patLengths[NUM_REGEXPS];/* Number of non-null characters in
|
---|
285 | * corresponding entry in patterns.
|
---|
286 | * -1 means entry isn't used. */
|
---|
287 | TclRegexp *regexps[NUM_REGEXPS];
|
---|
288 | /* Compiled forms of above strings. Also
|
---|
289 | * malloc-ed, or NULL if not in use yet. */
|
---|
290 |
|
---|
291 | /*
|
---|
292 | * Information about packages. Used only in tclPkg.c.
|
---|
293 | */
|
---|
294 |
|
---|
295 | Tcl_HashTable packageTable; /* Describes all of the packages loaded
|
---|
296 | * in or available to this interpreter.
|
---|
297 | * Keys are package names, values are
|
---|
298 | * (Package *) pointers. */
|
---|
299 | char *packageUnknown; /* Command to invoke during "package
|
---|
300 | * require" commands for packages that
|
---|
301 | * aren't described in packageTable.
|
---|
302 | * Malloc'ed, may be NULL. */
|
---|
303 |
|
---|
304 | /*
|
---|
305 | * Miscellaneous information:
|
---|
306 | */
|
---|
307 |
|
---|
308 | int cmdCount; /* Total number of times a command procedure
|
---|
309 | * has been called for this interpreter. */
|
---|
310 | int evalFlags; /* Flags to control next call to Tcl_Eval.
|
---|
311 | * Normally zero, but may be set before
|
---|
312 | * calling Tcl_Eval. See below for valid
|
---|
313 | * values. */
|
---|
314 | int termOffset; /* Offset of character just after last one
|
---|
315 | * compiled or executed by Tcl_EvalObj. */
|
---|
316 | LiteralTable literalTable; /* Contains LiteralEntry's describing all
|
---|
317 | * Tcl objects holding literals of scripts
|
---|
318 | * compiled by the interpreter. Indexed by
|
---|
319 | * the string representations of literals.
|
---|
320 | * Used to avoid creating duplicate
|
---|
321 | * objects. */
|
---|
322 | int compileEpoch; /* Holds the current "compilation epoch"
|
---|
323 | * for this interpreter. This is
|
---|
324 | * incremented to invalidate existing
|
---|
325 | * ByteCodes when, e.g., a command with a
|
---|
326 | * compile procedure is redefined. */
|
---|
327 | Proc *compiledProcPtr; /* If a procedure is being compiled, a
|
---|
328 | * pointer to its Proc structure; otherwise,
|
---|
329 | * this is NULL. Set by ObjInterpProc in
|
---|
330 | * tclProc.c and used by tclCompile.c to
|
---|
331 | * process local variables appropriately. */
|
---|
332 | char *scriptFile; /* NULL means there is no nested source
|
---|
333 | * command active; otherwise this points to
|
---|
334 | * the name of the file being sourced (it's
|
---|
335 | * not malloc-ed: it points to an argument
|
---|
336 | * to Tcl_EvalFile. */
|
---|
337 | int flags; /* Various flag bits. See below. */
|
---|
338 | long randSeed; /* Seed used for rand() function. */
|
---|
339 | Trace *tracePtr; /* List of traces for this interpreter. */
|
---|
340 | Tcl_HashTable *assocData; /* Hash table for associating data with
|
---|
341 | * this interpreter. Cleaned up when
|
---|
342 | * this interpreter is deleted. */
|
---|
343 | ExecEnv *execEnvPtr; /* Execution environment for Tcl bytecode
|
---|
344 | * execution. Contains a pointer to the
|
---|
345 | * Tcl evaluation stack. */
|
---|
346 | Tcl_Obj *emptyObjPtr; /* Points to an object holding an empty
|
---|
347 | * string. Returned by Tcl_ObjSetVar2 when
|
---|
348 | * variable traces change a variable in a
|
---|
349 | * gross way. */
|
---|
350 | char resultSpace[TCL_RESULT_SIZE + 1];
|
---|
351 | /* Static space holding small results. */
|
---|
352 | Tcl_ThreadId threadId; /* ID of thread that owns the interpreter */
|
---|
353 |
|
---|
354 | /*
|
---|
355 | * Statistical information about the bytecode compiler and interpreter's
|
---|
356 | * operation.
|
---|
357 | */
|
---|
358 |
|
---|
359 | #ifdef TCL_COMPILE_STATS
|
---|
360 | ByteCodeStats stats; /* Holds compilation and execution
|
---|
361 | * statistics for this interpreter. */
|
---|
362 | #endif /* TCL_COMPILE_STATS */
|
---|
363 | } Interp;
|
---|
364 |
|
---|
365 | /*
|
---|
366 | * EvalFlag bits for Interp structures:
|
---|
367 | *
|
---|
368 | * TCL_BRACKET_TERM 1 means that the current script is terminated by
|
---|
369 | * a close bracket rather than the end of the string.
|
---|
370 | * TCL_ALLOW_EXCEPTIONS 1 means it's OK for the script to terminate with
|
---|
371 | * a code other than TCL_OK or TCL_ERROR; 0 means
|
---|
372 | * codes other than these should be turned into errors.
|
---|
373 | */
|
---|
374 |
|
---|
375 | #define TCL_BRACKET_TERM 1
|
---|
376 | #define TCL_ALLOW_EXCEPTIONS 4
|
---|