tclCompile.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:44k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * tclCompile.h --
  3.  *
  4.  * Copyright (c) 1996-1998 Sun Microsystems, Inc.
  5.  * Copyright (c) 1998-2000 by Scriptics Corporation.
  6.  * Copyright (c) 2001 by Kevin B. Kenny.  All rights reserved.
  7.  * Copyright (c) 2007 Daniel A. Steffen <das@users.sourceforge.net>
  8.  *
  9.  * See the file "license.terms" for information on usage and redistribution
  10.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11.  *
  12.  * RCS: @(#) $Id: tclCompile.h,v 1.33.2.2 2007/09/13 15:28:11 das Exp $
  13.  */
  14. #ifndef _TCLCOMPILATION
  15. #define _TCLCOMPILATION 1
  16. #ifndef _TCLINT
  17. #include "tclInt.h"
  18. #endif /* _TCLINT */
  19. #ifdef BUILD_tcl
  20. # undef TCL_STORAGE_CLASS
  21. # define TCL_STORAGE_CLASS DLLEXPORT
  22. #endif
  23. /*
  24.  *------------------------------------------------------------------------
  25.  * Variables related to compilation. These are used in tclCompile.c,
  26.  * tclExecute.c, tclBasic.c, and their clients.
  27.  *------------------------------------------------------------------------
  28.  */
  29. #ifdef TCL_COMPILE_DEBUG
  30. /*
  31.  * Variable that controls whether compilation tracing is enabled and, if so,
  32.  * what level of tracing is desired:
  33.  *    0: no compilation tracing
  34.  *    1: summarize compilation of top level cmds and proc bodies
  35.  *    2: display all instructions of each ByteCode compiled
  36.  * This variable is linked to the Tcl variable "tcl_traceCompile".
  37.  */
  38. extern int  tclTraceCompile;
  39. #endif
  40. #ifdef TCL_COMPILE_DEBUG
  41. /*
  42.  * Variable that controls whether execution tracing is enabled and, if so,
  43.  * what level of tracing is desired:
  44.  *    0: no execution tracing
  45.  *    1: trace invocations of Tcl procs only
  46.  *    2: trace invocations of all (not compiled away) commands
  47.  *    3: display each instruction executed
  48.  * This variable is linked to the Tcl variable "tcl_traceExec".
  49.  */
  50. extern int  tclTraceExec;
  51. #endif
  52. /*
  53.  *------------------------------------------------------------------------
  54.  * Data structures related to compilation.
  55.  *------------------------------------------------------------------------
  56.  */
  57. /*
  58.  * The structure used to implement Tcl "exceptions" (exceptional returns):
  59.  * for example, those generated in loops by the break and continue commands,
  60.  * and those generated by scripts and caught by the catch command. This
  61.  * ExceptionRange structure describes a range of code (e.g., a loop body),
  62.  * the kind of exceptions (e.g., a break or continue) that might occur, and
  63.  * the PC offsets to jump to if a matching exception does occur. Exception
  64.  * ranges can nest so this structure includes a nesting level that is used
  65.  * at runtime to find the closest exception range surrounding a PC. For
  66.  * example, when a break command is executed, the ExceptionRange structure
  67.  * for the most deeply nested loop, if any, is found and used. These
  68.  * structures are also generated for the "next" subcommands of for loops
  69.  * since a break there terminates the for command. This means a for command
  70.  * actually generates two LoopInfo structures.
  71.  */
  72. typedef enum {
  73.     LOOP_EXCEPTION_RANGE, /* Exception's range is part of a loop.
  74.  * Break and continue "exceptions" cause
  75.  * jumps to appropriate PC offsets. */
  76.     CATCH_EXCEPTION_RANGE /* Exception's range is controlled by a
  77.  * catch command. Errors in the range cause
  78.  * a jump to a catch PC offset. */
  79. } ExceptionRangeType;
  80. typedef struct ExceptionRange {
  81.     ExceptionRangeType type; /* The kind of ExceptionRange. */
  82.     int nestingLevel; /* Static depth of the exception range.
  83.  * Used to find the most deeply-nested
  84.  * range surrounding a PC at runtime. */
  85.     int codeOffset; /* Offset of the first instruction byte of
  86.  * the code range. */
  87.     int numCodeBytes; /* Number of bytes in the code range. */
  88.     int breakOffset; /* If LOOP_EXCEPTION_RANGE, the target PC
  89.  * offset for a break command in the range. */
  90.     int continueOffset; /* If LOOP_EXCEPTION_RANGE and not -1, the
  91.  * target PC offset for a continue command in
  92.  * the code range. Otherwise, ignore this range
  93.  * when processing a continue command. */
  94.     int catchOffset; /* If a CATCH_EXCEPTION_RANGE, the target PC
  95.  * offset for any "exception" in range. */
  96. } ExceptionRange;
  97. /*
  98.  * Structure used to map between instruction pc and source locations. It
  99.  * defines for each compiled Tcl command its code's starting offset and 
  100.  * its source's starting offset and length. Note that the code offset
  101.  * increases monotonically: that is, the table is sorted in code offset
  102.  * order. The source offset is not monotonic.
  103.  */
  104. typedef struct CmdLocation {
  105.     int codeOffset; /* Offset of first byte of command code. */
  106.     int numCodeBytes; /* Number of bytes for command's code. */
  107.     int srcOffset; /* Offset of first char of the command. */
  108.     int numSrcBytes; /* Number of command source chars. */
  109. } CmdLocation;
  110. #ifdef TCL_TIP280
  111. /*
  112.  * TIP #280
  113.  * Structure to record additional location information for byte code.
  114.  * This information is internal and not saved. I.e. tbcload'ed code
  115.  * will not have this information. It records the lines for all words
  116.  * of all commands found in the byte code. The association with a
  117.  * ByteCode structure BC is done through the 'lineBCPtr' HashTable in
  118.  * Interp, keyed by the address of BC. Also recorded is information
  119.  * coming from the context, i.e. type of the frame and associated
  120.  * information, like the path of a sourced file.
  121.  */
  122. typedef struct ECL {
  123.   int  srcOffset; /* cmd location to find the entry */
  124.   int  nline;
  125.   int* line;      /* line information for all words in the command */
  126. } ECL;
  127. typedef struct ExtCmdLoc {
  128.   int      type;  /* Context type */
  129.   Tcl_Obj* path;  /* Path of the sourced file the command is in */
  130.   ECL*     loc;   /* Command word locations (lines) */
  131.   int      nloc;  /* Number of allocated entries in 'loc' */
  132.   int      nuloc; /* Number of used entries in 'loc' */
  133. } ExtCmdLoc;
  134. #endif
  135. /*
  136.  * CompileProcs need the ability to record information during compilation
  137.  * that can be used by bytecode instructions during execution. The AuxData
  138.  * structure provides this "auxiliary data" mechanism. An arbitrary number
  139.  * of these structures can be stored in the ByteCode record (during
  140.  * compilation they are stored in a CompileEnv structure). Each AuxData
  141.  * record holds one word of client-specified data (often a pointer) and is
  142.  * given an index that instructions can later use to look up the structure
  143.  * and its data.
  144.  *
  145.  * The following definitions declare the types of procedures that are called
  146.  * to duplicate or free this auxiliary data when the containing ByteCode
  147.  * objects are duplicated and freed. Pointers to these procedures are kept
  148.  * in the AuxData structure.
  149.  */
  150. typedef ClientData (AuxDataDupProc)  _ANSI_ARGS_((ClientData clientData));
  151. typedef void       (AuxDataFreeProc) _ANSI_ARGS_((ClientData clientData));
  152. /*
  153.  * We define a separate AuxDataType struct to hold type-related information
  154.  * for the AuxData structure. This separation makes it possible for clients
  155.  * outside of the TCL core to manipulate (in a limited fashion!) AuxData;
  156.  * for example, it makes it possible to pickle and unpickle AuxData structs.
  157.  */
  158. typedef struct AuxDataType {
  159.     char *name; /* the name of the type. Types can be
  160.                                  * registered and found by name */
  161.     AuxDataDupProc *dupProc; /* Callback procedure to invoke when the
  162.                                  * aux data is duplicated (e.g., when the
  163.                                  * ByteCode structure containing the aux
  164.                                  * data is duplicated). NULL means just
  165.                                  * copy the source clientData bits; no
  166.                                  * proc need be called. */
  167.     AuxDataFreeProc *freeProc; /* Callback procedure to invoke when the
  168.                                  * aux data is freed. NULL means no
  169.                                  * proc need be called. */
  170. } AuxDataType;
  171. /*
  172.  * The definition of the AuxData structure that holds information created
  173.  * during compilation by CompileProcs and used by instructions during
  174.  * execution.
  175.  */
  176. typedef struct AuxData {
  177.     AuxDataType *type; /* pointer to the AuxData type associated with
  178.                              * this ClientData. */
  179.     ClientData clientData; /* The compilation data itself. */
  180. } AuxData;
  181. /*
  182.  * Structure defining the compilation environment. After compilation, fields
  183.  * describing bytecode instructions are copied out into the more compact
  184.  * ByteCode structure defined below.
  185.  */
  186. #define COMPILEENV_INIT_CODE_BYTES    250
  187. #define COMPILEENV_INIT_NUM_OBJECTS    60
  188. #define COMPILEENV_INIT_EXCEPT_RANGES   5
  189. #define COMPILEENV_INIT_CMD_MAP_SIZE   40
  190. #define COMPILEENV_INIT_AUX_DATA_SIZE   5
  191. typedef struct CompileEnv {
  192.     Interp *iPtr; /* Interpreter containing the code being
  193.  * compiled. Commands and their compile
  194.  * procs are specific to an interpreter so
  195.  * the code emitted will depend on the
  196.  * interpreter. */
  197.     char *source; /* The source string being compiled by
  198.  * SetByteCodeFromAny. This pointer is not
  199.  * owned by the CompileEnv and must not be
  200.  * freed or changed by it. */
  201.     int numSrcBytes; /* Number of bytes in source. */
  202.     Proc *procPtr; /* If a procedure is being compiled, a
  203.  * pointer to its Proc structure; otherwise
  204.  * NULL. Used to compile local variables.
  205.  * Set from information provided by
  206.  * ObjInterpProc in tclProc.c. */
  207.     int numCommands; /* Number of commands compiled. */
  208.     int exceptDepth; /* Current exception range nesting level;
  209.  * -1 if not in any range currently. */
  210.     int maxExceptDepth; /* Max nesting level of exception ranges;
  211.  * -1 if no ranges have been compiled. */
  212.     int maxStackDepth; /* Maximum number of stack elements needed
  213.  * to execute the code. Set by compilation
  214.  * procedures before returning. */
  215.     int currStackDepth;         /* Current stack depth. */
  216.     LiteralTable localLitTable; /* Contains LiteralEntry's describing
  217.  * all Tcl objects referenced by this
  218.  * compiled code. Indexed by the string
  219.  * representations of the literals. Used to
  220.  * avoid creating duplicate objects. */
  221.     unsigned char *codeStart; /* Points to the first byte of the code. */
  222.     unsigned char *codeNext; /* Points to next code array byte to use. */
  223.     unsigned char *codeEnd; /* Points just after the last allocated
  224.  * code array byte. */
  225.     int mallocedCodeArray;      /* Set 1 if code array was expanded 
  226.  * and codeStart points into the heap.*/
  227.     LiteralEntry *literalArrayPtr;
  228.      /* Points to start of LiteralEntry array. */
  229.     int literalArrayNext; /* Index of next free object array entry. */
  230.     int literalArrayEnd; /* Index just after last obj array entry. */
  231.     int mallocedLiteralArray;   /* 1 if object array was expanded and
  232.                                  * objArray points into the heap, else 0. */
  233.     ExceptionRange *exceptArrayPtr;
  234.      /* Points to start of the ExceptionRange
  235.  * array. */
  236.     int exceptArrayNext; /* Next free ExceptionRange array index.
  237.  * exceptArrayNext is the number of ranges
  238.  * and (exceptArrayNext-1) is the index of
  239.  * the current range's array entry. */
  240.     int exceptArrayEnd; /* Index after the last ExceptionRange
  241.  * array entry. */
  242.     int mallocedExceptArray; /* 1 if ExceptionRange array was expanded
  243.  * and exceptArrayPtr points in heap,
  244.  * else 0. */
  245.     CmdLocation *cmdMapPtr; /* Points to start of CmdLocation array.
  246.  * numCommands is the index of the next
  247.  * entry to use; (numCommands-1) is the
  248.  * entry index for the last command. */
  249.     int cmdMapEnd; /* Index after last CmdLocation entry. */
  250.     int mallocedCmdMap; /* 1 if command map array was expanded and
  251.  * cmdMapPtr points in the heap, else 0. */
  252.     AuxData *auxDataArrayPtr;   /* Points to auxiliary data array start. */
  253.     int auxDataArrayNext; /* Next free compile aux data array index.
  254.  * auxDataArrayNext is the number of aux
  255.  * data items and (auxDataArrayNext-1) is
  256.  * index of current aux data array entry. */
  257.     int auxDataArrayEnd; /* Index after last aux data array entry. */
  258.     int mallocedAuxDataArray; /* 1 if aux data array was expanded and
  259.  * auxDataArrayPtr points in heap else 0. */
  260.     unsigned char staticCodeSpace[COMPILEENV_INIT_CODE_BYTES];
  261.                                 /* Initial storage for code. */
  262.     LiteralEntry staticLiteralSpace[COMPILEENV_INIT_NUM_OBJECTS];
  263.                                 /* Initial storage of LiteralEntry array. */
  264.     ExceptionRange staticExceptArraySpace[COMPILEENV_INIT_EXCEPT_RANGES];
  265.                                 /* Initial ExceptionRange array storage. */
  266.     CmdLocation staticCmdMapSpace[COMPILEENV_INIT_CMD_MAP_SIZE];
  267.                                 /* Initial storage for cmd location map. */
  268.     AuxData staticAuxDataArraySpace[COMPILEENV_INIT_AUX_DATA_SIZE];
  269.                                 /* Initial storage for aux data array. */
  270. #ifdef TCL_TIP280
  271.     /* TIP #280 */
  272.     ExtCmdLoc* extCmdMapPtr;    /* Extended command location information
  273.  * for 'info frame'. */
  274.     int        line;            /* First line of the script, based on the
  275.  * invoking context, then the line of the
  276.  * command currently compiled. */
  277. #endif
  278. } CompileEnv;
  279. /*
  280.  * The structure defining the bytecode instructions resulting from compiling
  281.  * a Tcl script. Note that this structure is variable length: a single heap
  282.  * object is allocated to hold the ByteCode structure immediately followed
  283.  * by the code bytes, the literal object array, the ExceptionRange array,
  284.  * the CmdLocation map, and the compilation AuxData array.
  285.  */
  286. /*
  287.  * A PRECOMPILED bytecode struct is one that was generated from a compiled
  288.  * image rather than implicitly compiled from source
  289.  */
  290. #define TCL_BYTECODE_PRECOMPILED 0x0001
  291. typedef struct ByteCode {
  292.     TclHandle interpHandle; /* Handle for interpreter containing the
  293.  * compiled code.  Commands and their compile
  294.  * procs are specific to an interpreter so the
  295.  * code emitted will depend on the
  296.  * interpreter. */
  297.     int compileEpoch; /* Value of iPtr->compileEpoch when this
  298.  * ByteCode was compiled. Used to invalidate
  299.  * code when, e.g., commands with compile
  300.  * procs are redefined. */
  301.     Namespace *nsPtr; /* Namespace context in which this code
  302.  * was compiled. If the code is executed
  303.  * if a different namespace, it must be
  304.  * recompiled. */
  305.     int nsEpoch; /* Value of nsPtr->resolverEpoch when this
  306.  * ByteCode was compiled. Used to invalidate
  307.  * code when new namespace resolution rules
  308.  * are put into effect. */
  309.     int refCount; /* Reference count: set 1 when created
  310.  * plus 1 for each execution of the code
  311.  * currently active. This structure can be
  312.  * freed when refCount becomes zero. */
  313.     unsigned int flags; /* flags describing state for the codebyte.
  314.                                  * this variable holds ORed values from the
  315.                                  * TCL_BYTECODE_ masks defined above */
  316.     char *source; /* The source string from which this
  317.  * ByteCode was compiled. Note that this
  318.  * pointer is not owned by the ByteCode and
  319.  * must not be freed or modified by it. */
  320.     Proc *procPtr; /* If the ByteCode was compiled from a
  321.  * procedure body, this is a pointer to its
  322.  * Proc structure; otherwise NULL. This
  323.  * pointer is also not owned by the ByteCode
  324.  * and must not be freed by it. */
  325.     size_t structureSize; /* Number of bytes in the ByteCode structure
  326.  * itself. Does not include heap space for
  327.  * literal Tcl objects or storage referenced
  328.  * by AuxData entries. */
  329.     int numCommands; /* Number of commands compiled. */
  330.     int numSrcBytes; /* Number of source bytes compiled. */
  331.     int numCodeBytes; /* Number of code bytes. */
  332.     int numLitObjects; /* Number of objects in literal array. */
  333.     int numExceptRanges; /* Number of ExceptionRange array elems. */
  334.     int numAuxDataItems; /* Number of AuxData items. */
  335.     int numCmdLocBytes; /* Number of bytes needed for encoded
  336.  * command location information. */
  337.     int maxExceptDepth; /* Maximum nesting level of ExceptionRanges;
  338.  * -1 if no ranges were compiled. */
  339.     int maxStackDepth; /* Maximum number of stack elements needed
  340.  * to execute the code. */
  341.     unsigned char *codeStart; /* Points to the first byte of the code.
  342.  * This is just after the final ByteCode
  343.  * member cmdMapPtr. */
  344.     Tcl_Obj **objArrayPtr; /* Points to the start of the literal
  345.  * object array. This is just after the
  346.  * last code byte. */
  347.     ExceptionRange *exceptArrayPtr;
  348.      /* Points to the start of the ExceptionRange
  349.  * array. This is just after the last
  350.  * object in the object array. */
  351.     AuxData *auxDataArrayPtr;   /* Points to the start of the auxiliary data
  352.  * array. This is just after the last entry
  353.  * in the ExceptionRange array. */
  354.     unsigned char *codeDeltaStart;
  355. /* Points to the first of a sequence of
  356.  * bytes that encode the change in the
  357.  * starting offset of each command's code.
  358.  * If -127<=delta<=127, it is encoded as 1
  359.  * byte, otherwise 0xFF (128) appears and
  360.  * the delta is encoded by the next 4 bytes.
  361.  * Code deltas are always positive. This
  362.  * sequence is just after the last entry in
  363.  * the AuxData array. */
  364.     unsigned char *codeLengthStart;
  365. /* Points to the first of a sequence of
  366.  * bytes that encode the length of each
  367.  * command's code. The encoding is the same
  368.  * as for code deltas. Code lengths are
  369.  * always positive. This sequence is just
  370.  * after the last entry in the code delta
  371.  * sequence. */
  372.     unsigned char *srcDeltaStart;
  373. /* Points to the first of a sequence of
  374.  * bytes that encode the change in the
  375.  * starting offset of each command's source.
  376.  * The encoding is the same as for code
  377.  * deltas. Source deltas can be negative.
  378.  * This sequence is just after the last byte
  379.  * in the code length sequence. */
  380.     unsigned char *srcLengthStart;
  381. /* Points to the first of a sequence of
  382.  * bytes that encode the length of each
  383.  * command's source. The encoding is the
  384.  * same as for code deltas. Source lengths
  385.  * are always positive. This sequence is
  386.  * just after the last byte in the source
  387.  * delta sequence. */
  388. #ifdef TCL_COMPILE_STATS
  389.     Tcl_Time createTime; /* Absolute time when the ByteCode was
  390.  * created. */
  391. #endif /* TCL_COMPILE_STATS */
  392. } ByteCode;
  393. /*
  394.  * Opcodes for the Tcl bytecode instructions. These must correspond to
  395.  * the entries in the table of instruction descriptions,
  396.  * tclInstructionTable, in tclCompile.c. Also, the order and number of
  397.  * the expression opcodes (e.g., INST_LOR) must match the entries in
  398.  * the array operatorStrings in tclExecute.c.
  399.  */
  400. /* Opcodes 0 to 9 */
  401. #define INST_DONE 0
  402. #define INST_PUSH1 1
  403. #define INST_PUSH4 2
  404. #define INST_POP 3
  405. #define INST_DUP 4
  406. #define INST_CONCAT1 5
  407. #define INST_INVOKE_STK1 6
  408. #define INST_INVOKE_STK4 7
  409. #define INST_EVAL_STK 8
  410. #define INST_EXPR_STK 9
  411. /* Opcodes 10 to 23 */
  412. #define INST_LOAD_SCALAR1 10
  413. #define INST_LOAD_SCALAR4 11
  414. #define INST_LOAD_SCALAR_STK 12
  415. #define INST_LOAD_ARRAY1 13
  416. #define INST_LOAD_ARRAY4 14
  417. #define INST_LOAD_ARRAY_STK 15
  418. #define INST_LOAD_STK 16
  419. #define INST_STORE_SCALAR1 17
  420. #define INST_STORE_SCALAR4 18
  421. #define INST_STORE_SCALAR_STK 19
  422. #define INST_STORE_ARRAY1 20
  423. #define INST_STORE_ARRAY4 21
  424. #define INST_STORE_ARRAY_STK 22
  425. #define INST_STORE_STK 23
  426. /* Opcodes 24 to 33 */
  427. #define INST_INCR_SCALAR1 24
  428. #define INST_INCR_SCALAR_STK 25
  429. #define INST_INCR_ARRAY1 26
  430. #define INST_INCR_ARRAY_STK 27
  431. #define INST_INCR_STK 28
  432. #define INST_INCR_SCALAR1_IMM 29
  433. #define INST_INCR_SCALAR_STK_IMM 30
  434. #define INST_INCR_ARRAY1_IMM 31
  435. #define INST_INCR_ARRAY_STK_IMM 32
  436. #define INST_INCR_STK_IMM 33
  437. /* Opcodes 34 to 39 */
  438. #define INST_JUMP1 34
  439. #define INST_JUMP4 35
  440. #define INST_JUMP_TRUE1 36
  441. #define INST_JUMP_TRUE4 37
  442. #define INST_JUMP_FALSE1 38
  443. #define INST_JUMP_FALSE4         39
  444. /* Opcodes 40 to 64 */
  445. #define INST_LOR 40
  446. #define INST_LAND 41
  447. #define INST_BITOR 42
  448. #define INST_BITXOR 43
  449. #define INST_BITAND 44
  450. #define INST_EQ 45
  451. #define INST_NEQ 46
  452. #define INST_LT 47
  453. #define INST_GT 48
  454. #define INST_LE 49
  455. #define INST_GE 50
  456. #define INST_LSHIFT 51
  457. #define INST_RSHIFT 52
  458. #define INST_ADD 53
  459. #define INST_SUB 54
  460. #define INST_MULT 55
  461. #define INST_DIV 56
  462. #define INST_MOD 57
  463. #define INST_UPLUS 58
  464. #define INST_UMINUS 59
  465. #define INST_BITNOT 60
  466. #define INST_LNOT 61
  467. #define INST_CALL_BUILTIN_FUNC1 62
  468. #define INST_CALL_FUNC1 63
  469. #define INST_TRY_CVT_TO_NUMERIC 64
  470. /* Opcodes 65 to 66 */
  471. #define INST_BREAK 65
  472. #define INST_CONTINUE 66
  473. /* Opcodes 67 to 68 */
  474. #define INST_FOREACH_START4 67
  475. #define INST_FOREACH_STEP4 68
  476. /* Opcodes 69 to 72 */
  477. #define INST_BEGIN_CATCH4 69
  478. #define INST_END_CATCH 70
  479. #define INST_PUSH_RESULT 71
  480. #define INST_PUSH_RETURN_CODE 72
  481. /* Opcodes 73 to 78 */
  482. #define INST_STR_EQ 73
  483. #define INST_STR_NEQ 74
  484. #define INST_STR_CMP 75
  485. #define INST_STR_LEN 76
  486. #define INST_STR_INDEX 77
  487. #define INST_STR_MATCH 78
  488. /* Opcodes 78 to 81 */
  489. #define INST_LIST 79
  490. #define INST_LIST_INDEX 80
  491. #define INST_LIST_LENGTH 81
  492. /* Opcodes 82 to 87 */
  493. #define INST_APPEND_SCALAR1 82
  494. #define INST_APPEND_SCALAR4 83
  495. #define INST_APPEND_ARRAY1 84
  496. #define INST_APPEND_ARRAY4 85
  497. #define INST_APPEND_ARRAY_STK 86
  498. #define INST_APPEND_STK 87
  499. /* Opcodes 88 to 93 */
  500. #define INST_LAPPEND_SCALAR1 88
  501. #define INST_LAPPEND_SCALAR4 89
  502. #define INST_LAPPEND_ARRAY1 90
  503. #define INST_LAPPEND_ARRAY4 91
  504. #define INST_LAPPEND_ARRAY_STK 92
  505. #define INST_LAPPEND_STK 93
  506. /* TIP #22 - LINDEX operator with flat arg list */
  507. #define INST_LIST_INDEX_MULTI 94
  508. /*
  509.  * TIP #33 - 'lset' command.  Code gen also required a Forth-like
  510.  *           OVER operation.
  511.  */
  512. #define INST_OVER                       95
  513. #define INST_LSET_LIST 96
  514. #define INST_LSET_FLAT                  97
  515. /* The last opcode */
  516. #define LAST_INST_OPCODE         97
  517. /*
  518.  * Table describing the Tcl bytecode instructions: their name (for
  519.  * displaying code), total number of code bytes required (including
  520.  * operand bytes), and a description of the type of each operand.
  521.  * These operand types include signed and unsigned integers of length
  522.  * one and four bytes. The unsigned integers are used for indexes or
  523.  * for, e.g., the count of objects to push in a "push" instruction.
  524.  */
  525. #define MAX_INSTRUCTION_OPERANDS 2
  526. typedef enum InstOperandType {
  527.     OPERAND_NONE,
  528.     OPERAND_INT1, /* One byte signed integer. */
  529.     OPERAND_INT4, /* Four byte signed integer. */
  530.     OPERAND_UINT1, /* One byte unsigned integer. */
  531.     OPERAND_UINT4 /* Four byte unsigned integer. */
  532. } InstOperandType;
  533. typedef struct InstructionDesc {
  534.     char *name; /* Name of instruction. */
  535.     int numBytes; /* Total number of bytes for instruction. */
  536.     int stackEffect;            /* The worst-case balance stack effect of the 
  537.  * instruction, used for stack requirements 
  538.  * computations. The value INT_MIN signals
  539.  * that the instruction's worst case effect
  540.  * is (1-opnd1).
  541.  */
  542.     int numOperands; /* Number of operands. */
  543.     InstOperandType opTypes[MAX_INSTRUCTION_OPERANDS];
  544. /* The type of each operand. */
  545. } InstructionDesc;
  546. extern InstructionDesc tclInstructionTable[];
  547. /*
  548.  * Definitions of the values of the INST_CALL_BUILTIN_FUNC instruction's
  549.  * operand byte. Each value denotes a builtin Tcl math function. These
  550.  * values must correspond to the entries in the tclBuiltinFuncTable array
  551.  * below and to the values stored in the tclInt.h MathFunc structure's
  552.  * builtinFuncIndex field.
  553.  */
  554. #define BUILTIN_FUNC_ACOS 0
  555. #define BUILTIN_FUNC_ASIN 1
  556. #define BUILTIN_FUNC_ATAN 2
  557. #define BUILTIN_FUNC_ATAN2 3
  558. #define BUILTIN_FUNC_CEIL 4
  559. #define BUILTIN_FUNC_COS 5
  560. #define BUILTIN_FUNC_COSH 6
  561. #define BUILTIN_FUNC_EXP 7
  562. #define BUILTIN_FUNC_FLOOR 8
  563. #define BUILTIN_FUNC_FMOD 9
  564. #define BUILTIN_FUNC_HYPOT 10
  565. #define BUILTIN_FUNC_LOG 11
  566. #define BUILTIN_FUNC_LOG10 12
  567. #define BUILTIN_FUNC_POW 13
  568. #define BUILTIN_FUNC_SIN 14
  569. #define BUILTIN_FUNC_SINH 15
  570. #define BUILTIN_FUNC_SQRT 16
  571. #define BUILTIN_FUNC_TAN 17
  572. #define BUILTIN_FUNC_TANH 18
  573. #define BUILTIN_FUNC_ABS 19
  574. #define BUILTIN_FUNC_DOUBLE 20
  575. #define BUILTIN_FUNC_INT 21
  576. #define BUILTIN_FUNC_RAND 22
  577. #define BUILTIN_FUNC_ROUND 23
  578. #define BUILTIN_FUNC_SRAND 24
  579. #define BUILTIN_FUNC_WIDE 25
  580. #define LAST_BUILTIN_FUNC         25
  581. /*
  582.  * Table describing the built-in math functions. Entries in this table are
  583.  * indexed by the values of the INST_CALL_BUILTIN_FUNC instruction's
  584.  * operand byte.
  585.  */
  586. typedef int (CallBuiltinFuncProc) _ANSI_ARGS_((Tcl_Interp *interp,
  587.         ExecEnv *eePtr, ClientData clientData));
  588. typedef struct {
  589.     char *name; /* Name of function. */
  590.     int numArgs; /* Number of arguments for function. */
  591.     Tcl_ValueType argTypes[MAX_MATH_ARGS];
  592. /* Acceptable types for each argument. */
  593.     CallBuiltinFuncProc *proc; /* Procedure implementing this function. */
  594.     ClientData clientData; /* Additional argument to pass to the
  595.  * function when invoking it. */
  596. } BuiltinFunc;
  597. extern BuiltinFunc tclBuiltinFuncTable[];
  598. /*
  599.  * Compilation of some Tcl constructs such as if commands and the logical or
  600.  * (||) and logical and (&&) operators in expressions requires the
  601.  * generation of forward jumps. Since the PC target of these jumps isn't
  602.  * known when the jumps are emitted, we record the offset of each jump in an
  603.  * array of JumpFixup structures. There is one array for each sequence of
  604.  * jumps to one target PC. When we learn the target PC, we update the jumps
  605.  * with the correct distance. Also, if the distance is too great (> 127
  606.  * bytes), we replace the single-byte jump with a four byte jump
  607.  * instruction, move the instructions after the jump down, and update the
  608.  * code offsets for any commands between the jump and the target.
  609.  */
  610. typedef enum {
  611.     TCL_UNCONDITIONAL_JUMP,
  612.     TCL_TRUE_JUMP,
  613.     TCL_FALSE_JUMP
  614. } TclJumpType;
  615. typedef struct JumpFixup {
  616.     TclJumpType jumpType; /* Indicates the kind of jump. */
  617.     int codeOffset; /* Offset of the first byte of the one-byte
  618.  * forward jump's code. */
  619.     int cmdIndex; /* Index of the first command after the one
  620.  * for which the jump was emitted. Used to
  621.  * update the code offsets for subsequent
  622.  * commands if the two-byte jump at jumpPc
  623.  * must be replaced with a five-byte one. */
  624.     int exceptIndex; /* Index of the first range entry in the
  625.  * ExceptionRange array after the current
  626.  * one. This field is used to adjust the
  627.  * code offsets in subsequent ExceptionRange
  628.  * records when a jump is grown from 2 bytes
  629.  * to 5 bytes. */
  630. } JumpFixup;
  631. #define JUMPFIXUP_INIT_ENTRIES    10
  632. typedef struct JumpFixupArray {
  633.     JumpFixup *fixup; /* Points to start of jump fixup array. */
  634.     int next; /* Index of next free array entry. */
  635.     int end; /* Index of last usable entry in array. */
  636.     int mallocedArray; /* 1 if array was expanded and fixups points
  637.  * into the heap, else 0. */
  638.     JumpFixup staticFixupSpace[JUMPFIXUP_INIT_ENTRIES];
  639. /* Initial storage for jump fixup array. */
  640. } JumpFixupArray;
  641. /*
  642.  * The structure describing one variable list of a foreach command. Note
  643.  * that only foreach commands inside procedure bodies are compiled inline so
  644.  * a ForeachVarList structure always describes local variables. Furthermore,
  645.  * only scalar variables are supported for inline-compiled foreach loops.
  646.  */
  647. typedef struct ForeachVarList {
  648.     int numVars; /* The number of variables in the list. */
  649.     int varIndexes[1]; /* An array of the indexes ("slot numbers")
  650.  * for each variable in the procedure's
  651.  * array of local variables. Only scalar
  652.  * variables are supported. The actual
  653.  * size of this field will be large enough
  654.  * to numVars indexes. THIS MUST BE THE
  655.  * LAST FIELD IN THE STRUCTURE! */
  656. } ForeachVarList;
  657. /*
  658.  * Structure used to hold information about a foreach command that is needed
  659.  * during program execution. These structures are stored in CompileEnv and
  660.  * ByteCode structures as auxiliary data.
  661.  */
  662. typedef struct ForeachInfo {
  663.     int numLists; /* The number of both the variable and value
  664.  * lists of the foreach command. */
  665.     int firstValueTemp; /* Index of the first temp var in a proc
  666.  * frame used to point to a value list. */
  667.     int loopCtTemp; /* Index of temp var in a proc frame
  668.  * holding the loop's iteration count. Used
  669.  * to determine next value list element to
  670.  * assign each loop var. */
  671.     ForeachVarList *varLists[1];/* An array of pointers to ForeachVarList
  672.  * structures describing each var list. The
  673.  * actual size of this field will be large
  674.  * enough to numVars indexes. THIS MUST BE
  675.  * THE LAST FIELD IN THE STRUCTURE! */
  676. } ForeachInfo;
  677. extern AuxDataType tclForeachInfoType;
  678. /*
  679.  *----------------------------------------------------------------
  680.  * Procedures exported by tclBasic.c to be used within the engine.
  681.  *----------------------------------------------------------------
  682.  */
  683. EXTERN int TclEvalObjvInternal _ANSI_ARGS_((Tcl_Interp *interp, int objc,
  684.     Tcl_Obj *CONST objv[], CONST char *command, int length,
  685.     int flags));
  686. EXTERN int              TclInterpReady _ANSI_ARGS_((Tcl_Interp *interp));
  687. /*
  688.  *----------------------------------------------------------------
  689.  * Procedures exported by the engine to be used by tclBasic.c
  690.  *----------------------------------------------------------------
  691.  */
  692. #ifndef TCL_TIP280
  693. EXTERN int TclCompEvalObj _ANSI_ARGS_((Tcl_Interp *interp,
  694.     Tcl_Obj *objPtr));
  695. #else
  696. EXTERN int TclCompEvalObj _ANSI_ARGS_((Tcl_Interp *interp,
  697.     Tcl_Obj *objPtr, CONST CmdFrame* invoker,
  698.     int word));
  699. #endif
  700. /*
  701.  *----------------------------------------------------------------
  702.  * Procedures shared among Tcl bytecode compilation and execution
  703.  * modules but not used outside:
  704.  *----------------------------------------------------------------
  705.  */
  706. EXTERN void TclCleanupByteCode _ANSI_ARGS_((ByteCode *codePtr));
  707. EXTERN int TclCompileCmdWord _ANSI_ARGS_((Tcl_Interp *interp,
  708.     Tcl_Token *tokenPtr, int count,
  709.     CompileEnv *envPtr));
  710. EXTERN int TclCompileExpr _ANSI_ARGS_((Tcl_Interp *interp,
  711.     CONST char *script, int numBytes,
  712.     CompileEnv *envPtr));
  713. EXTERN int TclCompileExprWords _ANSI_ARGS_((Tcl_Interp *interp,
  714.     Tcl_Token *tokenPtr, int numWords,
  715.     CompileEnv *envPtr));
  716. EXTERN int TclCompileScript _ANSI_ARGS_((Tcl_Interp *interp,
  717.     CONST char *script, int numBytes, int nested,
  718.     CompileEnv *envPtr));
  719. EXTERN int TclCompileTokens _ANSI_ARGS_((Tcl_Interp *interp,
  720.     Tcl_Token *tokenPtr, int count,
  721.     CompileEnv *envPtr));
  722. EXTERN int TclCreateAuxData _ANSI_ARGS_((ClientData clientData,
  723.     AuxDataType *typePtr, CompileEnv *envPtr));
  724. EXTERN int TclCreateExceptRange _ANSI_ARGS_((
  725.     ExceptionRangeType type, CompileEnv *envPtr));
  726. EXTERN ExecEnv * TclCreateExecEnv _ANSI_ARGS_((Tcl_Interp *interp));
  727. EXTERN void TclDeleteExecEnv _ANSI_ARGS_((ExecEnv *eePtr));
  728. EXTERN void TclDeleteLiteralTable _ANSI_ARGS_((
  729.     Tcl_Interp *interp, LiteralTable *tablePtr));
  730. EXTERN void TclEmitForwardJump _ANSI_ARGS_((CompileEnv *envPtr,
  731.     TclJumpType jumpType, JumpFixup *jumpFixupPtr));
  732. EXTERN ExceptionRange * TclGetExceptionRangeForPc _ANSI_ARGS_((
  733.     unsigned char *pc, int catchOnly,
  734.     ByteCode* codePtr));
  735. EXTERN void TclExpandJumpFixupArray _ANSI_ARGS_((
  736.                             JumpFixupArray *fixupArrayPtr));
  737. EXTERN void TclFinalizeAuxDataTypeTable _ANSI_ARGS_((void));
  738. EXTERN int TclFindCompiledLocal _ANSI_ARGS_((CONST char *name, 
  739.              int nameChars, int create, int flags,
  740.     Proc *procPtr));
  741. EXTERN LiteralEntry * TclLookupLiteralEntry _ANSI_ARGS_((
  742.     Tcl_Interp *interp, Tcl_Obj *objPtr));
  743. EXTERN int TclFixupForwardJump _ANSI_ARGS_((
  744.     CompileEnv *envPtr, JumpFixup *jumpFixupPtr,
  745.     int jumpDist, int distThreshold));
  746. EXTERN void TclFreeCompileEnv _ANSI_ARGS_((CompileEnv *envPtr));
  747. EXTERN void TclFreeJumpFixupArray _ANSI_ARGS_((
  748.        JumpFixupArray *fixupArrayPtr));
  749. EXTERN void TclInitAuxDataTypeTable _ANSI_ARGS_((void));
  750. EXTERN void TclInitByteCodeObj _ANSI_ARGS_((Tcl_Obj *objPtr,
  751.     CompileEnv *envPtr));
  752. EXTERN void TclInitCompilation _ANSI_ARGS_((void));
  753. #ifndef TCL_TIP280
  754. EXTERN void TclInitCompileEnv _ANSI_ARGS_((Tcl_Interp *interp,
  755.     CompileEnv *envPtr, char *string,
  756.     int numBytes));
  757. #else
  758. EXTERN void TclInitCompileEnv _ANSI_ARGS_((Tcl_Interp *interp,
  759.     CompileEnv *envPtr, char *string,
  760.     int numBytes, CONST CmdFrame* invoker, int word));
  761. #endif
  762. EXTERN void TclInitJumpFixupArray _ANSI_ARGS_((
  763.     JumpFixupArray *fixupArrayPtr));
  764. EXTERN void TclInitLiteralTable _ANSI_ARGS_((
  765.     LiteralTable *tablePtr));
  766. #ifdef TCL_COMPILE_STATS
  767. EXTERN char * TclLiteralStats _ANSI_ARGS_((
  768.     LiteralTable *tablePtr));
  769. EXTERN int TclLog2 _ANSI_ARGS_((int value));
  770. #endif
  771. #ifdef TCL_COMPILE_DEBUG
  772. EXTERN void TclPrintByteCodeObj _ANSI_ARGS_((Tcl_Interp *interp,
  773.             Tcl_Obj *objPtr));
  774. #endif
  775. EXTERN int TclPrintInstruction _ANSI_ARGS_((ByteCode* codePtr,
  776.     unsigned char *pc));
  777. EXTERN void TclPrintObject _ANSI_ARGS_((FILE *outFile,
  778.     Tcl_Obj *objPtr, int maxChars));
  779. EXTERN void TclPrintSource _ANSI_ARGS_((FILE *outFile,
  780.     CONST char *string, int maxChars));
  781. EXTERN void TclRegisterAuxDataType _ANSI_ARGS_((AuxDataType *typePtr));
  782. EXTERN int TclRegisterLiteral _ANSI_ARGS_((CompileEnv *envPtr,
  783.     char *bytes, int length, int onHeap));
  784. EXTERN void TclReleaseLiteral _ANSI_ARGS_((Tcl_Interp *interp,
  785.     Tcl_Obj *objPtr));
  786. EXTERN void TclSetCmdNameObj _ANSI_ARGS_((Tcl_Interp *interp,
  787.     Tcl_Obj *objPtr, Command *cmdPtr));
  788. #ifdef TCL_COMPILE_DEBUG
  789. EXTERN void TclVerifyGlobalLiteralTable _ANSI_ARGS_((
  790.     Interp *iPtr));
  791. EXTERN void TclVerifyLocalLiteralTable _ANSI_ARGS_((
  792.     CompileEnv *envPtr));
  793. #endif
  794. EXTERN int TclCompileVariableCmd _ANSI_ARGS_((
  795.     Tcl_Interp *interp, Tcl_Parse *parsePtr, CompileEnv *envPtr));
  796. /*
  797.  *----------------------------------------------------------------
  798.  * Macros used by Tcl bytecode compilation and execution modules
  799.  * inside the Tcl core but not used outside.
  800.  *----------------------------------------------------------------
  801.  */
  802. /*
  803.  * Form of TclRegisterLiteral with onHeap == 0.
  804.  * In that case, it is safe to cast away CONSTness, and it
  805.  * is cleanest to do that here, all in one place.
  806.  */
  807. #define TclRegisterNewLiteral(envPtr, bytes, length) 
  808. TclRegisterLiteral(envPtr, (char *)(bytes), length, /*onHeap*/ 0)
  809. /*
  810.  * Macro used to update the stack requirements.
  811.  * It is called by the macros TclEmitOpCode, TclEmitInst1 and
  812.  * TclEmitInst4.
  813.  * Remark that the very last instruction of a bytecode always
  814.  * reduces the stack level: INST_DONE or INST_POP, so that the 
  815.  * maxStackdepth is always updated.
  816.  */
  817. #define TclUpdateStackReqs(op, i, envPtr) 
  818.     {
  819. int delta = tclInstructionTable[(op)].stackEffect;
  820. if (delta) {
  821.     if (delta < 0) {
  822. if((envPtr)->maxStackDepth < (envPtr)->currStackDepth) {
  823.     (envPtr)->maxStackDepth = (envPtr)->currStackDepth;
  824. }
  825. if (delta == INT_MIN) {
  826.     delta = 1 - (i);
  827. }
  828.     }
  829.     (envPtr)->currStackDepth += delta;
  830. }
  831.     }
  832. /*
  833.  * Macro to emit an opcode byte into a CompileEnv's code array.
  834.  * The ANSI C "prototype" for this macro is:
  835.  *
  836.  * EXTERN void TclEmitOpcode _ANSI_ARGS_((unsigned char op,
  837.  *     CompileEnv *envPtr));
  838.  */
  839. #define TclEmitOpcode(op, envPtr) 
  840.     if ((envPtr)->codeNext == (envPtr)->codeEnd) 
  841.         TclExpandCodeArray(envPtr); 
  842.     *(envPtr)->codeNext++ = (unsigned char) (op);
  843.     TclUpdateStackReqs(op, 0, envPtr)
  844. /*
  845.  * Macro to emit an integer operand.
  846.  * The ANSI C "prototype" for this macro is:
  847.  *
  848.  * EXTERN void TclEmitInt1 _ANSI_ARGS_((int i, CompileEnv *envPtr));
  849.  */
  850. #define TclEmitInt1(i, envPtr) 
  851.     if ((envPtr)->codeNext == (envPtr)->codeEnd) 
  852.         TclExpandCodeArray(envPtr); 
  853.     *(envPtr)->codeNext++ = (unsigned char) ((unsigned int) (i))
  854. /*
  855.  * Macros to emit an instruction with signed or unsigned integer operands.
  856.  * Four byte integers are stored in "big-endian" order with the high order
  857.  * byte stored at the lowest address.
  858.  * The ANSI C "prototypes" for these macros are:
  859.  *
  860.  * EXTERN void TclEmitInstInt1 _ANSI_ARGS_((unsigned char op, int i, 
  861.  *     CompileEnv *envPtr));
  862.  * EXTERN void TclEmitInstInt4 _ANSI_ARGS_((unsigned char op, int i, 
  863.  *     CompileEnv *envPtr));
  864.  */
  865. #define TclEmitInstInt1(op, i, envPtr) 
  866.     if (((envPtr)->codeNext + 2) > (envPtr)->codeEnd) { 
  867.         TclExpandCodeArray(envPtr); 
  868.     } 
  869.     *(envPtr)->codeNext++ = (unsigned char) (op); 
  870.     *(envPtr)->codeNext++ = (unsigned char) ((unsigned int) (i));
  871.     TclUpdateStackReqs(op, i, envPtr)
  872. #define TclEmitInstInt4(op, i, envPtr) 
  873.     if (((envPtr)->codeNext + 5) > (envPtr)->codeEnd) { 
  874.         TclExpandCodeArray(envPtr); 
  875.     } 
  876.     *(envPtr)->codeNext++ = (unsigned char) (op); 
  877.     *(envPtr)->codeNext++ = 
  878.         (unsigned char) ((unsigned int) (i) >> 24); 
  879.     *(envPtr)->codeNext++ = 
  880.         (unsigned char) ((unsigned int) (i) >> 16); 
  881.     *(envPtr)->codeNext++ = 
  882.         (unsigned char) ((unsigned int) (i) >>  8); 
  883.     *(envPtr)->codeNext++ = 
  884.         (unsigned char) ((unsigned int) (i)      );
  885.     TclUpdateStackReqs(op, i, envPtr)
  886.     
  887. /*
  888.  * Macro to push a Tcl object onto the Tcl evaluation stack. It emits the
  889.  * object's one or four byte array index into the CompileEnv's code
  890.  * array. These support, respectively, a maximum of 256 (2**8) and 2**32
  891.  * objects in a CompileEnv. The ANSI C "prototype" for this macro is:
  892.  *
  893.  * EXTERN void TclEmitPush _ANSI_ARGS_((int objIndex, CompileEnv *envPtr));
  894.  */
  895. #define TclEmitPush(objIndex, envPtr) 
  896.     {
  897.         register int objIndexCopy = (objIndex);
  898.         if (objIndexCopy <= 255) { 
  899.     TclEmitInstInt1(INST_PUSH1, objIndexCopy, (envPtr)); 
  900.         } else { 
  901.     TclEmitInstInt4(INST_PUSH4, objIndexCopy, (envPtr)); 
  902. }
  903.     }
  904. /*
  905.  * Macros to update a (signed or unsigned) integer starting at a pointer.
  906.  * The two variants depend on the number of bytes. The ANSI C "prototypes"
  907.  * for these macros are:
  908.  *
  909.  * EXTERN void TclStoreInt1AtPtr _ANSI_ARGS_((int i, unsigned char *p));
  910.  * EXTERN void TclStoreInt4AtPtr _ANSI_ARGS_((int i, unsigned char *p));
  911.  */
  912.     
  913. #define TclStoreInt1AtPtr(i, p) 
  914.     *(p)   = (unsigned char) ((unsigned int) (i))
  915.     
  916. #define TclStoreInt4AtPtr(i, p) 
  917.     *(p)   = (unsigned char) ((unsigned int) (i) >> 24); 
  918.     *(p+1) = (unsigned char) ((unsigned int) (i) >> 16); 
  919.     *(p+2) = (unsigned char) ((unsigned int) (i) >>  8); 
  920.     *(p+3) = (unsigned char) ((unsigned int) (i)      )
  921. /*
  922.  * Macros to update instructions at a particular pc with a new op code
  923.  * and a (signed or unsigned) int operand. The ANSI C "prototypes" for
  924.  * these macros are:
  925.  *
  926.  * EXTERN void TclUpdateInstInt1AtPc _ANSI_ARGS_((unsigned char op, int i,
  927.  *     unsigned char *pc));
  928.  * EXTERN void TclUpdateInstInt4AtPc _ANSI_ARGS_((unsigned char op, int i,
  929.  *     unsigned char *pc));
  930.  */
  931. #define TclUpdateInstInt1AtPc(op, i, pc) 
  932.     *(pc) = (unsigned char) (op); 
  933.     TclStoreInt1AtPtr((i), ((pc)+1))
  934. #define TclUpdateInstInt4AtPc(op, i, pc) 
  935.     *(pc) = (unsigned char) (op); 
  936.     TclStoreInt4AtPtr((i), ((pc)+1))
  937.     
  938. /*
  939.  * Macros to get a signed integer (GET_INT{1,2}) or an unsigned int
  940.  * (GET_UINT{1,2}) from a pointer. There are two variants for each
  941.  * return type that depend on the number of bytes fetched.
  942.  * The ANSI C "prototypes" for these macros are:
  943.  *
  944.  * EXTERN int         TclGetInt1AtPtr  _ANSI_ARGS_((unsigned char *p));
  945.  * EXTERN int         TclGetInt4AtPtr  _ANSI_ARGS_((unsigned char *p));
  946.  * EXTERN unsigned int TclGetUInt1AtPtr _ANSI_ARGS_((unsigned char *p));
  947.  * EXTERN unsigned int TclGetUInt4AtPtr _ANSI_ARGS_((unsigned char *p));
  948.  */
  949. /*
  950.  * The TclGetInt1AtPtr macro is tricky because we want to do sign
  951.  * extension on the 1-byte value. Unfortunately the "char" type isn't
  952.  * signed on all platforms so sign-extension doesn't always happen
  953.  * automatically. Sometimes we can explicitly declare the pointer to be
  954.  * signed, but other times we have to explicitly sign-extend the value
  955.  * in software.
  956.  */
  957. #ifndef __CHAR_UNSIGNED__
  958. #   define TclGetInt1AtPtr(p) ((int) *((char *) p))
  959. #else
  960. #   ifdef HAVE_SIGNED_CHAR
  961. # define TclGetInt1AtPtr(p) ((int) *((signed char *) p))
  962. #    else
  963. # define TclGetInt1AtPtr(p) (((int) *((char *) p)) 
  964. | ((*(p) & 0200) ? (-256) : 0))
  965. #    endif
  966. #endif
  967. #define TclGetInt4AtPtr(p) (((int) TclGetInt1AtPtr(p) << 24) | 
  968.                        (*((p)+1) << 16) | 
  969.        (*((p)+2) <<  8) | 
  970.        (*((p)+3)))
  971. #define TclGetUInt1AtPtr(p) ((unsigned int) *(p))
  972. #define TclGetUInt4AtPtr(p) ((unsigned int) (*(p)     << 24) | 
  973.                             (*((p)+1) << 16) | 
  974.             (*((p)+2) <<  8) | 
  975.             (*((p)+3)))
  976. /*
  977.  * Macros used to compute the minimum and maximum of two integers.
  978.  * The ANSI C "prototypes" for these macros are:
  979.  *
  980.  * EXTERN int  TclMin _ANSI_ARGS_((int i, int j));
  981.  * EXTERN int  TclMax _ANSI_ARGS_((int i, int j));
  982.  */
  983. #define TclMin(i, j)   ((((int) i) < ((int) j))? (i) : (j))
  984. #define TclMax(i, j)   ((((int) i) > ((int) j))? (i) : (j))
  985. /*
  986.  * DTrace probe macros (NOPs if DTrace support is not enabled).
  987.  */
  988. #ifdef USE_DTRACE
  989. #include "tclDTrace.h"
  990. #if defined(__GNUC__ ) && __GNUC__ > 2
  991. /* Use gcc branch prediction hint to minimize cost of DTrace ENABLED checks. */
  992. #define unlikely(x) (__builtin_expect((x), 0))
  993. #else
  994. #define unlikely(x) (x)
  995. #endif
  996. #define TCL_DTRACE_PROC_ENTRY_ENABLED()     unlikely(TCL_PROC_ENTRY_ENABLED())
  997. #define TCL_DTRACE_PROC_RETURN_ENABLED()    unlikely(TCL_PROC_RETURN_ENABLED())
  998. #define TCL_DTRACE_PROC_RESULT_ENABLED()    unlikely(TCL_PROC_RESULT_ENABLED())
  999. #define TCL_DTRACE_PROC_ARGS_ENABLED()     unlikely(TCL_PROC_ARGS_ENABLED())
  1000. #define TCL_DTRACE_PROC_ENTRY(a0, a1, a2)   TCL_PROC_ENTRY(a0, a1, a2)
  1001. #define TCL_DTRACE_PROC_RETURN(a0, a1)     TCL_PROC_RETURN(a0, a1)
  1002. #define TCL_DTRACE_PROC_RESULT(a0, a1, a2, a3) TCL_PROC_RESULT(a0, a1, a2, a3)
  1003. #define TCL_DTRACE_PROC_ARGS(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) 
  1004. TCL_PROC_ARGS(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
  1005. #define TCL_DTRACE_CMD_ENTRY_ENABLED()     unlikely(TCL_CMD_ENTRY_ENABLED())
  1006. #define TCL_DTRACE_CMD_RETURN_ENABLED()     unlikely(TCL_CMD_RETURN_ENABLED())
  1007. #define TCL_DTRACE_CMD_RESULT_ENABLED()     unlikely(TCL_CMD_RESULT_ENABLED())
  1008. #define TCL_DTRACE_CMD_ARGS_ENABLED()     unlikely(TCL_CMD_ARGS_ENABLED())
  1009. #define TCL_DTRACE_CMD_ENTRY(a0, a1, a2)    TCL_CMD_ENTRY(a0, a1, a2)
  1010. #define TCL_DTRACE_CMD_RETURN(a0, a1)     TCL_CMD_RETURN(a0, a1)
  1011. #define TCL_DTRACE_CMD_RESULT(a0, a1, a2, a3) TCL_CMD_RESULT(a0, a1, a2, a3)
  1012. #define TCL_DTRACE_CMD_ARGS(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) 
  1013. TCL_CMD_ARGS(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
  1014. #define TCL_DTRACE_INST_START_ENABLED()     unlikely(TCL_INST_START_ENABLED())
  1015. #define TCL_DTRACE_INST_DONE_ENABLED()     unlikely(TCL_INST_DONE_ENABLED())
  1016. #define TCL_DTRACE_INST_START(a0, a1, a2)   TCL_INST_START(a0, a1, a2)
  1017. #define TCL_DTRACE_INST_DONE(a0, a1, a2)    TCL_INST_DONE(a0, a1, a2)
  1018. #define TCL_DTRACE_TCL_PROBE_ENABLED()     unlikely(TCL_TCL_PROBE_ENABLED())
  1019. #define TCL_DTRACE_TCL_PROBE(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) 
  1020. TCL_TCL_PROBE(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
  1021. #else /* USE_DTRACE */
  1022. #define TCL_DTRACE_PROC_ENTRY_ENABLED()     0
  1023. #define TCL_DTRACE_PROC_RETURN_ENABLED()    0
  1024. #define TCL_DTRACE_PROC_RESULT_ENABLED()    0
  1025. #define TCL_DTRACE_PROC_ARGS_ENABLED()     0
  1026. #define TCL_DTRACE_PROC_ENTRY(a0, a1, a2)   {}
  1027. #define TCL_DTRACE_PROC_RETURN(a0, a1)     {}
  1028. #define TCL_DTRACE_PROC_RESULT(a0, a1, a2, a3) {}
  1029. #define TCL_DTRACE_PROC_ARGS(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {}
  1030. #define TCL_DTRACE_CMD_ENTRY_ENABLED()     0
  1031. #define TCL_DTRACE_CMD_RETURN_ENABLED()     0
  1032. #define TCL_DTRACE_CMD_RESULT_ENABLED()     0
  1033. #define TCL_DTRACE_CMD_ARGS_ENABLED()     0
  1034. #define TCL_DTRACE_CMD_ENTRY(a0, a1, a2)    {}
  1035. #define TCL_DTRACE_CMD_RETURN(a0, a1)     {}
  1036. #define TCL_DTRACE_CMD_RESULT(a0, a1, a2, a3) {}
  1037. #define TCL_DTRACE_CMD_ARGS(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {}
  1038. #define TCL_DTRACE_INST_START_ENABLED()     0
  1039. #define TCL_DTRACE_INST_DONE_ENABLED()     0
  1040. #define TCL_DTRACE_INST_START(a0, a1, a2)   {}
  1041. #define TCL_DTRACE_INST_DONE(a0, a1, a2)    {}
  1042. #define TCL_DTRACE_TCL_PROBE_ENABLED()     0
  1043. #define TCL_DTRACE_TCL_PROBE(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {}
  1044. #endif /* USE_DTRACE */
  1045. # undef TCL_STORAGE_CLASS
  1046. # define TCL_STORAGE_CLASS DLLIMPORT
  1047. #endif /* _TCLCOMPILATION */