アットウィキロゴ

tcl > generic > tclInterp.c

概要


include

#include "tclInt.h"

変数宣言

/*
* A pointer to a string that holds an initialization script that if non-NULL
* is evaluated in Tcl_Init() prior to the built-in initialization script
* above. This variable can be modified by the function below.
*/

static char *tclPreInitScript = NULL;

/* Forward declaration */
struct Target;

/*
* struct Alias:
*
* Stores information about an alias. Is stored in the slave interpreter and
* used by the source command to find the target command in the master when
* the source command is invoked.
*/

typedef struct Alias {
   [[Tcl_Obj]] *token;		/* Token for the alias command in the slave
			 * interp. This used to be the command name in
			 * the slave when the alias was first
			 * created. */
   [[Tcl_Interp]] *targetInterp;	/* Interp in which target command will be
			 * invoked. */
   Tcl_[[Command]] slaveCmd;	/* Source command in slave interpreter, bound
			 * to command that invokes the target command
			 * in the target interpreter. */
   [[Tcl_HashEntry]] *aliasEntryPtr;
			/* Entry for the alias hash table in slave.
			 * This is used by alias deletion to remove
			 * the alias from the slave interpreter alias
			 * table. */
   struct Target *targetPtr;	/* Entry for target command in master. This is
			 * used in the master interpreter to map back
			 * from the target command to aliases
			 * redirecting to it. */
   int objc;			/* Count of Tcl_Obj in the prefix of the
			 * target command to be invoked in the target
			 * interpreter. Additional arguments specified
			 * when calling the alias in the slave interp
			 * will be appended to the prefix before the
			 * command is invoked. */
   Tcl_Obj *objPtr;		/* The first actual prefix object - the target
			 * command name; this has to be at the end of
			 * the structure, which will be extended to
			 * accomodate the remaining objects in the
			 * prefix. */
} Alias;

/*
*
* struct Slave:
*
* Used by the "interp" command to record and find information about slave
* interpreters. Maps from a command name in the master to information about a
* slave interpreter, e.g. what aliases are defined in it.
*/

typedef struct Slave {
   Tcl_Interp *masterInterp;	/* Master interpreter for this slave. */
   Tcl_HashEntry *slaveEntryPtr;
			/* Hash entry in masters slave table for this
			 * slave interpreter. Used to find this
			 * record, and used when deleting the slave
			 * interpreter to delete it from the master's
			 * table. */
   Tcl_Interp	*slaveInterp;	/* The slave interpreter. */
   Tcl_Command interpCmd;	/* Interpreter object command. */
   [[Tcl_HashTable]] aliasTable;	/* Table which maps from names of commands in
			 * slave interpreter to struct Alias defined
			 * below. */
} Slave;

/*
* struct Target:
*
* Maps from master interpreter commands back to the source commands in slave
* interpreters. This is needed because aliases can be created between sibling
* interpreters and must be deleted when the target interpreter is deleted. In
* case they would not be deleted the source interpreter would be left with a
* "dangling pointer". One such record is stored in the Master record of the
* master interpreter with the master for each alias which directs to a
* command in the master. These records are used to remove the source command
* for an from a slave if/when the master is deleted. They are organized in a
* doubly-linked list attached to the master interpreter.
*/

typedef struct Target {
   Tcl_Command	slaveCmd;	/* Command for alias in slave interp. */
   Tcl_Interp *slaveInterp;	/* Slave Interpreter. */
   struct Target *nextPtr;	/* Next in list of target records, or NULL if
			 * at the end of the list of targets. */
   struct Target *prevPtr;	/* Previous in list of target records, or NULL
			 * if at the start of the list of targets. */
} Target;

/*
* struct Master:
*
* This record is used for two purposes: First, slaveTable (a hashtable) maps
* from names of commands to slave interpreters. This hashtable is used to
* store information about slave interpreters of this interpreter, to map over
* all slaves, etc. The second purpose is to store information about all
* aliases in slaves (or siblings) which direct to target commands in this
* interpreter (using the targetsPtr doubly-linked list).
*
* NB: the flags field in the interp structure, used with SAFE_INTERP mask
* denotes whether the interpreter is safe or not. Safe interpreters have
* restricted functionality, can only create safe slave interpreters and can
* only load safe extensions.
*/

typedef struct Master {
   Tcl_HashTable slaveTable;	/* Hash table for slave interpreters. Maps
			 * from command names to Slave records. */
   Target *targetsPtr;		/* The head of a doubly-linked list of all the
			 * target records which denote aliases from
			 * slaves or sibling interpreters that direct
			 * to commands in this interpreter. This list
			 * is used to remove dangling pointers from
			 * the slave (or sibling) interpreters when
			 * this interpreter is deleted. */
} Master;

/*
* The following structure keeps track of all the Master and Slave information
* on a per-interp basis.
*/

typedef struct InterpInfo {
   Master master;		/* Keeps track of all interps for which this
			 * interp is the Master. */
   Slave slave;		/* Information necessary for this interp to
			 * function as a slave. */
} InterpInfo;

/*
* Limit callbacks handled by scripts are modelled as structures which are
* stored in hashes indexed by a two-word key. Note that the type of the
* 'type' field in the key is not int; this is to make sure that things are
* likely to work properly on 64-bit architectures.
*/

typedef struct ScriptLimitCallback {
   Tcl_Interp *interp;		/* The interpreter in which to execute the
			 * callback. */
   Tcl_Obj *scriptObj;		/* The script to execute to perform the
			 * user-defined part of the callback. */
   int type;			/* What kind of callback is this. */
   Tcl_HashEntry *entryPtr;	/* The entry in the hash table maintained by
			 * the target interpreter that refers to this
			 * callback record, or NULL if the entry has
			 * already been deleted from that hash
			 * table. */
} ScriptLimitCallback;

typedef struct ScriptLimitCallbackKey {
   Tcl_Interp *interp;		/* The interpreter that the limit callback was
			 * attached to. This is not the interpreter
			 * that the callback runs in! */
   long type;			/* The type of callback that this is. */
} ScriptLimitCallbackKey;


関数

最終更新:2011年11月01日 09:25