summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclNamesp.c1845
1 files changed, 914 insertions, 931 deletions
diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c
index f1a86d6..e9a9494 100644
--- a/generic/tclNamesp.c
+++ b/generic/tclNamesp.c
@@ -21,7 +21,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclNamesp.c,v 1.78 2005/07/05 17:33:06 dgp Exp $
+ * RCS: @(#) $Id: tclNamesp.c,v 1.79 2005/07/15 15:53:52 dkf Exp $
*/
#include "tclInt.h"
@@ -34,8 +34,8 @@
#define NUM_TRAIL_ELEMS 5
/*
- * Thread-local storage used to avoid having a global lock on data
- * that is not limited to a single interpreter.
+ * Thread-local storage used to avoid having a global lock on data that is not
+ * limited to a single interpreter.
*/
typedef struct ThreadSpecificData {
@@ -53,46 +53,43 @@ typedef struct ThreadSpecificData {
static Tcl_ThreadDataKey dataKey;
/*
- * This structure contains a cached pointer to a namespace that is the
- * result of resolving the namespace's name in some other namespace. It is
- * the internal representation for a nsName object. It contains the
- * pointer along with some information that is used to check the cached
- * pointer's validity.
+ * This structure contains a cached pointer to a namespace that is the result
+ * of resolving the namespace's name in some other namespace. It is the
+ * internal representation for a nsName object. It contains the pointer along
+ * with some information that is used to check the cached pointer's validity.
*/
typedef struct ResolvedNsName {
Namespace *nsPtr; /* A cached namespace pointer. */
- long nsId; /* nsPtr's unique namespace id. Used to
- * verify that nsPtr is still valid
- * (e.g., it's possible that the namespace
- * was deleted and a new one created at
- * the same address). */
+ long nsId; /* nsPtr's unique namespace id. Used to verify
+ * that nsPtr is still valid (e.g., it's
+ * possible that the namespace was deleted and
+ * a new one created at the same address). */
Namespace *refNsPtr; /* Points to the namespace containing the
- * reference (not the namespace that
- * contains the referenced namespace). */
- int refCount; /* Reference count: 1 for each nsName
- * object that has a pointer to this
- * ResolvedNsName structure as its internal
- * rep. This structure can be freed when
- * refCount becomes zero. */
+ * reference (not the namespace that contains
+ * the referenced namespace). */
+ int refCount; /* Reference count: 1 for each nsName object
+ * that has a pointer to this ResolvedNsName
+ * structure as its internal rep. This
+ * structure can be freed when refCount
+ * becomes zero. */
} ResolvedNsName;
/*
- * The client data for an ensemble command. This consists of the
- * table of commands that are actually exported by the namespace, and
- * an epoch counter that, combined with the exportLookupEpoch field of
- * the namespace structure, defines whether the table contains valid
- * data or will need to be recomputed next time the ensemble command
- * is called.
+ * The client data for an ensemble command. This consists of the table of
+ * commands that are actually exported by the namespace, and an epoch counter
+ * that, combined with the exportLookupEpoch field of the namespace structure,
+ * defines whether the table contains valid data or will need to be recomputed
+ * next time the ensemble command is called.
*/
typedef struct EnsembleConfig {
Namespace *nsPtr; /* The namspace backing this ensemble up. */
Tcl_Command token; /* The token for the command that provides
- * ensemble support for the namespace, or
- * NULL if the command has been deleted (or
- * never existed; the global namespace never
- * has an ensemble command.) */
+ * ensemble support for the namespace, or NULL
+ * if the command has been deleted (or never
+ * existed; the global namespace never has an
+ * ensemble command.) */
int epoch; /* The epoch at which this ensemble's table of
* exported commands is valid. */
char **subcommandArrayPtr; /* Array of ensemble subcommand names. At all
@@ -103,14 +100,14 @@ typedef struct EnsembleConfig {
/* Hash table of ensemble subcommand names,
* which are its keys so this also provides
* the storage management for those subcommand
- * names. The contents of the entry values are
- * object version the prefix lists to use when
- * substituting for the command/subcommand to
- * build the ensemble implementation command.
- * Has to be stored here as well as in
- * subcommandDict because that field is NULL
- * when we are deriving the ensemble from the
- * namespace exports list.
+ * names. The contents of the entry values
+ * are object version the prefix lists to use
+ * when substituting for the
+ * command/subcommand to build the ensemble
+ * implementation command. Has to be stored
+ * here as well as in subcommandDict because
+ * that field is NULL when we are deriving the
+ * ensemble from the namespace exports list.
* FUTURE WORK: use object hash table here. */
struct EnsembleConfig *next;/* The next ensemble in the linked list of
* ensembles associated with a namespace. If
@@ -145,19 +142,19 @@ typedef struct EnsembleConfig {
* (including objv[0]) and will have the
* results passed directly back to the caller
* (including the error code) unless the code
- * is TCL_CONTINUE in which case the subcommand
- * will be reparsed by the ensemble core,
- * presumably because the ensemble itself has
- * been updated. */
+ * is TCL_CONTINUE in which case the
+ * subcommand will be reparsed by the ensemble
+ * core, presumably because the ensemble
+ * itself has been updated. */
} EnsembleConfig;
#define ENS_DEAD 0x1 /* Flag value to say that the ensemble is dead
* and on its way out. */
/*
- * The data cached in a subcommand's Tcl_Obj rep. This structure is
- * not shared between Tcl_Objs referring to the same subcommand, even
- * where one is a duplicate of another.
+ * The data cached in a subcommand's Tcl_Obj rep. This structure is not
+ * shared between Tcl_Objs referring to the same subcommand, even where one is
+ * a duplicate of another.
*/
typedef struct EnsembleCmdRep {
@@ -176,7 +173,7 @@ typedef struct EnsembleCmdRep {
} EnsembleCmdRep;
/*
- * Declarations for procedures local to this file:
+ * Declarations for functions local to this file:
*/
static void DeleteImportedCmd _ANSI_ARGS_((ClientData clientData));
@@ -186,10 +183,10 @@ static int DoImport _ANSI_ARGS_((Tcl_Interp *interp,
Namespace *importNsPtr, int allowOverwrite));
static void DupNsNameInternalRep _ANSI_ARGS_((Tcl_Obj *objPtr,
Tcl_Obj *copyPtr));
-static char * ErrorCodeRead _ANSI_ARGS_(( ClientData clientData,
+static char * ErrorCodeRead _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, CONST char *name1,
CONST char *name2, int flags));
-static char * ErrorInfoRead _ANSI_ARGS_(( ClientData clientData,
+static char * ErrorInfoRead _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, CONST char *name1,
CONST char *name2, int flags));
static char * EstablishErrorCodeTraces _ANSI_ARGS_((
@@ -278,10 +275,10 @@ static void SetNsPath _ANSI_ARGS_((Namespace *nsPtr,
int pathLength, Tcl_Namespace *pathAry[]));
/*
- * This structure defines a Tcl object type that contains a
- * namespace reference. It is used in commands that take the
- * name of a namespace as an argument. The namespace reference
- * is resolved, and the result in cached in the object.
+ * This structure defines a Tcl object type that contains a namespace
+ * reference. It is used in commands that take the name of a namespace as an
+ * argument. The namespace reference is resolved, and the result in cached in
+ * the object.
*/
Tcl_ObjType tclNsNameType = {
@@ -293,10 +290,10 @@ Tcl_ObjType tclNsNameType = {
};
/*
- * This structure defines a Tcl object type that contains a reference
- * to an ensemble subcommand (e.g. the "length" in [string length ab])
- * It is used to cache the mapping between the subcommand itself and
- * the real command that implements it.
+ * This structure defines a Tcl object type that contains a reference to an
+ * ensemble subcommand (e.g. the "length" in [string length ab]) It is used to
+ * cache the mapping between the subcommand itself and the real command that
+ * implements it.
*/
static Tcl_ObjType ensembleCmdType = {
@@ -312,8 +309,8 @@ static Tcl_ObjType ensembleCmdType = {
*
* TclInitNamespaceSubsystem --
*
- * This procedure is called to initialize all the structures that
- * are used by namespaces on a per-process basis.
+ * This function is called to initialize all the structures that are used
+ * by namespaces on a per-process basis.
*
* Results:
* None.
@@ -382,8 +379,8 @@ Tcl_GetCurrentNamespace(interp)
Tcl_Namespace *
Tcl_GetGlobalNamespace(interp)
- register Tcl_Interp *interp; /* Interpreter whose global namespace
- * should be returned. */
+ register Tcl_Interp *interp; /* Interpreter whose global namespace should
+ * be returned. */
{
register Interp *iPtr = (Interp *) interp;
@@ -395,9 +392,9 @@ Tcl_GetGlobalNamespace(interp)
*
* Tcl_PushCallFrame --
*
- * Pushes a new call frame onto the interpreter's Tcl call stack.
- * Called when executing a Tcl procedure or a "namespace eval" or
- * "namespace inscope" command.
+ * Pushes a new call frame onto the interpreter's Tcl call stack. Called
+ * when executing a Tcl procedure or a "namespace eval" or "namespace
+ * inscope" command.
*
* Results:
* Returns TCL_OK if successful, or TCL_ERROR (along with an error
@@ -411,31 +408,30 @@ Tcl_GetGlobalNamespace(interp)
int
Tcl_PushCallFrame(interp, callFramePtr, namespacePtr, isProcCallFrame)
- Tcl_Interp *interp; /* Interpreter in which the new call frame
- * is to be pushed. */
- Tcl_CallFrame *callFramePtr; /* Points to a call frame structure to
- * push. Storage for this has already been
- * allocated by the caller; typically this
- * is the address of a CallFrame structure
- * allocated on the caller's C stack. The
+ Tcl_Interp *interp; /* Interpreter in which the new call frame is
+ * to be pushed. */
+ Tcl_CallFrame *callFramePtr; /* Points to a call frame structure to push.
+ * Storage for this has already been
+ * allocated by the caller; typically this is
+ * the address of a CallFrame structure
+ * allocated on the caller's C stack. The
* call frame will be initialized by this
- * procedure. The caller can pop the frame
+ * function. The caller can pop the frame
* later with Tcl_PopCallFrame, and it is
* responsible for freeing the frame's
* storage. */
- Tcl_Namespace *namespacePtr; /* Points to the namespace in which the
- * frame will execute. If NULL, the
- * interpreter's current namespace will
- * be used. */
- int isProcCallFrame; /* If nonzero, the frame represents a
- * called Tcl procedure and may have local
- * vars. Vars will ordinarily be looked up
- * in the frame. If new variables are
- * created, they will be created in the
- * frame. If 0, the frame is for a
- * "namespace eval" or "namespace inscope"
- * command and var references are treated
- * as references to namespace variables. */
+ Tcl_Namespace *namespacePtr; /* Points to the namespace in which the frame
+ * will execute. If NULL, the interpreter's
+ * current namespace will be used. */
+ int isProcCallFrame; /* If nonzero, the frame represents a called
+ * Tcl procedure and may have local vars.
+ * Vars will ordinarily be looked up in the
+ * frame. If new variables are created, they
+ * will be created in the frame. If 0, the
+ * frame is for a "namespace eval" or
+ * "namespace inscope" command and var
+ * references are treated as references to
+ * namespace variables. */
{
Interp *iPtr = (Interp *) interp;
register CallFrame *framePtr = (CallFrame *) callFramePtr;
@@ -469,8 +465,8 @@ Tcl_PushCallFrame(interp, callFramePtr, namespacePtr, isProcCallFrame)
framePtr->compiledLocals = NULL;
/*
- * Push the new call frame onto the interpreter's stack of procedure
- * call frames making it the current frame.
+ * Push the new call frame onto the interpreter's stack of procedure call
+ * frames making it the current frame.
*/
iPtr->framePtr = framePtr;
@@ -491,9 +487,8 @@ Tcl_PushCallFrame(interp, callFramePtr, namespacePtr, isProcCallFrame)
*
* Side effects:
* Modifies the call stack of the interpreter. Resets various fields of
- * the popped call frame. If a namespace has been deleted and
- * has no more activations on the call stack, the namespace is
- * destroyed.
+ * the popped call frame. If a namespace has been deleted and has no more
+ * activations on the call stack, the namespace is destroyed.
*
*----------------------------------------------------------------------
*/
@@ -507,10 +502,9 @@ Tcl_PopCallFrame(interp)
Namespace *nsPtr;
/*
- * It's important to remove the call frame from the interpreter's stack
- * of call frames before deleting local variables, so that traces
- * invoked by the variable deletion don't see the partially-deleted
- * frame.
+ * It's important to remove the call frame from the interpreter's stack of
+ * call frames before deleting local variables, so that traces invoked by
+ * the variable deletion don't see the partially-deleted frame.
*/
iPtr->framePtr = framePtr->callerPtr;
@@ -526,9 +520,9 @@ Tcl_PopCallFrame(interp)
}
/*
- * Decrement the namespace's count of active call frames. If the
- * namespace is "dying" and there are no more active call frames,
- * call Tcl_DeleteNamespace to destroy it.
+ * Decrement the namespace's count of active call frames. If the namespace
+ * is "dying" and there are no more active call frames, call
+ * Tcl_DeleteNamespace to destroy it.
*/
nsPtr = framePtr->nsPtr;
@@ -545,9 +539,8 @@ Tcl_PopCallFrame(interp)
* TclPushStackFrame --
*
* Allocates a new call frame in the interpreter's execution stack, then
- * pushes it onto the interpreter's Tcl call stack.
- * Called when executing a Tcl procedure or a "namespace eval" or
- * "namespace inscope" command.
+ * pushes it onto the interpreter's Tcl call stack. Called when executing
+ * a Tcl procedure or a "namespace eval" or "namespace inscope" command.
*
* Results:
* Returns TCL_OK if successful, or TCL_ERROR (along with an error
@@ -561,27 +554,26 @@ Tcl_PopCallFrame(interp)
int
TclPushStackFrame(interp, framePtrPtr, namespacePtr, isProcCallFrame)
- Tcl_Interp *interp; /* Interpreter in which the new call frame
- * is to be pushed. */
+ Tcl_Interp *interp; /* Interpreter in which the new call frame is
+ * to be pushed. */
Tcl_CallFrame **framePtrPtr; /* Place to store a pointer to the stack
* allocated call frame.*/
- Tcl_Namespace *namespacePtr; /* Points to the namespace in which the
- * frame will execute. If NULL, the
- * interpreter's current namespace will
- * be used. */
- int isProcCallFrame; /* If nonzero, the frame represents a
- * called Tcl procedure and may have local
- * vars. Vars will ordinarily be looked up
- * in the frame. If new variables are
- * created, they will be created in the
- * frame. If 0, the frame is for a
- * "namespace eval" or "namespace inscope"
- * command and var references are treated
- * as references to namespace variables. */
+ Tcl_Namespace *namespacePtr; /* Points to the namespace in which the frame
+ * will execute. If NULL, the interpreter's
+ * current namespace will be used. */
+ int isProcCallFrame; /* If nonzero, the frame represents a called
+ * Tcl procedure and may have local vars.
+ * Vars will ordinarily be looked up in the
+ * frame. If new variables are created, they
+ * will be created in the frame. If 0, the
+ * frame is for a "namespace eval" or
+ * "namespace inscope" command and var
+ * references are treated as references to
+ * namespace variables. */
{
-
*framePtrPtr = (Tcl_CallFrame *) TclStackAlloc(interp, sizeof(CallFrame));
- return Tcl_PushCallFrame(interp, *framePtrPtr, namespacePtr, isProcCallFrame);
+ return Tcl_PushCallFrame(interp, *framePtrPtr, namespacePtr,
+ isProcCallFrame);
}
void
@@ -589,7 +581,7 @@ TclPopStackFrame(interp)
Tcl_Interp* interp; /* Interpreter with call frame to pop. */
{
Tcl_PopCallFrame(interp);
- TclStackFree(interp);
+ TclStackFree(interp);
}
/*
@@ -629,8 +621,8 @@ EstablishErrorCodeTraces(clientData, interp, name1, name2, flags)
*
* ErrorCodeRead --
*
- * Called when the ::errorCode variable is read. Copies the
- * current value of the interp's errorCode field into ::errorCode.
+ * Called when the ::errorCode variable is read. Copies the current value
+ * of the interp's errorCode field into ::errorCode.
*
* Results:
* None.
@@ -651,9 +643,11 @@ ErrorCodeRead(clientData, interp, name1, name2, flags)
{
Interp *iPtr = (Interp *)interp;
- if (flags & TCL_INTERP_DESTROYED) return NULL;
- if (iPtr->errorCode == NULL) return NULL;
- Tcl_ObjSetVar2(interp, iPtr->ecVar, NULL, iPtr->errorCode, TCL_GLOBAL_ONLY);
+ if (flags & TCL_INTERP_DESTROYED || iPtr->errorCode == NULL) {
+ return NULL;
+ }
+ Tcl_ObjSetVar2(interp, iPtr->ecVar, NULL, iPtr->errorCode,
+ TCL_GLOBAL_ONLY);
return NULL;
}
@@ -694,8 +688,8 @@ EstablishErrorInfoTraces(clientData, interp, name1, name2, flags)
*
* ErrorInfoRead --
*
- * Called when the ::errorInfo variable is read. Copies the
- * current value of the interp's errorInfo field into ::errorInfo.
+ * Called when the ::errorInfo variable is read. Copies the current value
+ * of the interp's errorInfo field into ::errorInfo.
*
* Results:
* None.
@@ -716,9 +710,11 @@ ErrorInfoRead(clientData, interp, name1, name2, flags)
{
Interp *iPtr = (Interp *)interp;
- if (flags & TCL_INTERP_DESTROYED) return NULL;
- if (iPtr->errorInfo == NULL) return NULL;
- Tcl_ObjSetVar2(interp, iPtr->eiVar, NULL, iPtr->errorInfo, TCL_GLOBAL_ONLY);
+ if (flags & TCL_INTERP_DESTROYED || iPtr->errorInfo == NULL) {
+ return NULL;
+ }
+ Tcl_ObjSetVar2(interp, iPtr->eiVar, NULL, iPtr->errorInfo,
+ TCL_GLOBAL_ONLY);
return NULL;
}
@@ -727,38 +723,36 @@ ErrorInfoRead(clientData, interp, name1, name2, flags)
*
* Tcl_CreateNamespace --
*
- * Creates a new namespace with the given name. If there is no
- * active namespace (i.e., the interpreter is being initialized),
- * the global :: namespace is created and returned.
+ * Creates a new namespace with the given name. If there is no active
+ * namespace (i.e., the interpreter is being initialized), the global ::
+ * namespace is created and returned.
*
* Results:
- * Returns a pointer to the new namespace if successful. If the
- * namespace already exists or if another error occurs, this routine
- * returns NULL, along with an error message in the interpreter's
- * result object.
+ * Returns a pointer to the new namespace if successful. If the namespace
+ * already exists or if another error occurs, this routine returns NULL,
+ * along with an error message in the interpreter's result object.
*
* Side effects:
- * If the name contains "::" qualifiers and a parent namespace does
- * not already exist, it is automatically created.
+ * If the name contains "::" qualifiers and a parent namespace does not
+ * already exist, it is automatically created.
*
*----------------------------------------------------------------------
*/
Tcl_Namespace *
Tcl_CreateNamespace(interp, name, clientData, deleteProc)
- Tcl_Interp *interp; /* Interpreter in which a new namespace
- * is being created. Also used for
- * error reporting. */
+ Tcl_Interp *interp; /* Interpreter in which a new namespace is
+ * being created. Also used for error
+ * reporting. */
CONST char *name; /* Name for the new namespace. May be a
* qualified name with names of ancestor
* namespaces separated by "::"s. */
ClientData clientData; /* One-word value to store with
* namespace. */
Tcl_NamespaceDeleteProc *deleteProc;
- /* Procedure called to delete client
- * data when the namespace is deleted.
- * NULL if no procedure should be
- * called. */
+ /* Function called to delete client data
+ * when the namespace is deleted. NULL if
+ * no function should be called. */
{
Interp *iPtr = (Interp *) interp;
register Namespace *nsPtr, *ancestorPtr;
@@ -771,14 +765,13 @@ Tcl_CreateNamespace(interp, name, clientData, deleteProc)
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
/*
- * If there is no active namespace, the interpreter is being
- * initialized.
+ * If there is no active namespace, the interpreter is being initialized.
*/
if ((globalNsPtr == NULL) && (iPtr->varFramePtr == NULL)) {
/*
- * Treat this namespace as the global namespace, and avoid
- * looking for a parent.
+ * Treat this namespace as the global namespace, and avoid looking for
+ * a parent.
*/
parentPtr = NULL;
@@ -799,9 +792,8 @@ Tcl_CreateNamespace(interp, name, clientData, deleteProc)
/*
* If the unqualified name at the end is empty, there were trailing
- * "::"s after the namespace's name which we ignore. The new
- * namespace was already (recursively) created and is pointed to
- * by parentPtr.
+ * "::"s after the namespace's name which we ignore. The new namespace
+ * was already (recursively) created and is pointed to by parentPtr.
*/
if (*simpleName == '\0') {
@@ -809,8 +801,8 @@ Tcl_CreateNamespace(interp, name, clientData, deleteProc)
}
/*
- * Check for a bad namespace name and make sure that the name
- * does not already exist in the parent namespace.
+ * Check for a bad namespace name and make sure that the name does not
+ * already exist in the parent namespace.
*/
if (Tcl_FindHashEntry(&parentPtr->childTable, simpleName) != NULL) {
@@ -821,8 +813,8 @@ Tcl_CreateNamespace(interp, name, clientData, deleteProc)
}
/*
- * Create the new namespace and root it in its parent. Increment the
- * count of namespaces created.
+ * Create the new namespace and root it in its parent. Increment the count
+ * of namespaces created.
*/
nsPtr = (Namespace *) ckalloc(sizeof(Namespace));
@@ -859,10 +851,11 @@ Tcl_CreateNamespace(interp, name, clientData, deleteProc)
&newEntry);
Tcl_SetHashValue(entryPtr, (ClientData) nsPtr);
} else {
- /*
- * In the global namespace create traces to maintain the
- * ::errorInfo and ::errorCode variables.
+ /*
+ * In the global namespace create traces to maintain the ::errorInfo
+ * and ::errorCode variables.
*/
+
iPtr->globalNsPtr = nsPtr;
EstablishErrorInfoTraces(NULL, interp, NULL, NULL, 0);
EstablishErrorCodeTraces(NULL, interp, NULL, NULL, 0);
@@ -913,9 +906,9 @@ Tcl_CreateNamespace(interp, name, clientData, deleteProc)
* None.
*
* Side effects:
- * When a namespace is deleted, it is automatically removed as a
- * child of its parent namespace. Also, all its commands, variables
- * and child namespaces are deleted.
+ * When a namespace is deleted, it is automatically removed as a child of
+ * its parent namespace. Also, all its commands, variables and child
+ * namespaces are deleted.
*
*----------------------------------------------------------------------
*/
@@ -940,8 +933,7 @@ Tcl_DeleteNamespace(namespacePtr)
while (nsPtr->ensembles != NULL) {
/*
- * Splice out and link to indicate that we've already been
- * killed.
+ * Splice out and link to indicate that we've already been killed.
*/
EnsembleConfig *ensemblePtr = (EnsembleConfig *) nsPtr->ensembles;
nsPtr->ensembles = (Tcl_Ensemble *) ensemblePtr->next;
@@ -951,19 +943,19 @@ Tcl_DeleteNamespace(namespacePtr)
/*
* If the namespace is on the call frame stack, it is marked as "dying"
- * (NS_DYING is OR'd into its flags): the namespace can't be looked up
- * by name but its commands and variables are still usable by those
- * active call frames. When all active call frames referring to the
- * namespace have been popped from the Tcl stack, Tcl_PopCallFrame will
- * call this procedure again to delete everything in the namespace.
- * If no nsName objects refer to the namespace (i.e., if its refCount
- * is zero), its commands and variables are deleted and the storage for
- * its namespace structure is freed. Otherwise, if its refCount is
- * nonzero, the namespace's commands and variables are deleted but the
- * structure isn't freed. Instead, NS_DEAD is OR'd into the structure's
- * flags to allow the namespace resolution code to recognize that the
- * namespace is "deleted". The structure's storage is freed by
- * FreeNsNameInternalRep when its refCount reaches 0.
+ * (NS_DYING is OR'd into its flags): the namespace can't be looked up by
+ * name but its commands and variables are still usable by those active
+ * call frames. When all active call frames referring to the namespace
+ * have been popped from the Tcl stack, Tcl_PopCallFrame will call this
+ * function again to delete everything in the namespace. If no nsName
+ * objects refer to the namespace (i.e., if its refCount is zero), its
+ * commands and variables are deleted and the storage for its namespace
+ * structure is freed. Otherwise, if its refCount is nonzero, the
+ * namespace's commands and variables are deleted but the structure isn't
+ * freed. Instead, NS_DEAD is OR'd into the structure's flags to allow the
+ * namespace resolution code to recognize that the namespace is "deleted".
+ * The structure's storage is freed by FreeNsNameInternalRep when its
+ * refCount reaches 0.
*/
if (nsPtr->activationCount > 0) {
@@ -988,9 +980,9 @@ Tcl_DeleteNamespace(namespacePtr)
if ((nsPtr != globalNsPtr) || (iPtr->flags & DELETED)) {
/*
* If this is the global namespace, then it may have residual
- * "errorInfo" and "errorCode" variables for errors that
- * occurred while it was being torn down. Try to clear the
- * variable list one last time.
+ * "errorInfo" and "errorCode" variables for errors that occurred
+ * while it was being torn down. Try to clear the variable list
+ * one last time.
*/
TclDeleteVars((Interp *) nsPtr->interp, &nsPtr->varTable);
@@ -1009,7 +1001,10 @@ Tcl_DeleteNamespace(namespacePtr)
nsPtr->flags |= NS_DEAD;
}
} else {
- /* Restore the ::errorInfo and ::errorCode traces */
+ /*
+ * Restore the ::errorInfo and ::errorCode traces.
+ */
+
EstablishErrorInfoTraces(NULL, nsPtr->interp, NULL, NULL, 0);
EstablishErrorCodeTraces(NULL, nsPtr->interp, NULL, NULL, 0);
}
@@ -1026,7 +1021,7 @@ Tcl_DeleteNamespace(namespacePtr)
* commands, variables, and child namespaces.
*
* This is kept separate from Tcl_DeleteNamespace so that the global
- * namespace can be handled specially.
+ * namespace can be handled specially.
*
* Results:
* None.
@@ -1051,9 +1046,8 @@ TclTeardownNamespace(nsPtr)
int i;
/*
- * Start by destroying the namespace's variable table,
- * since variables might trigger traces.
- * Variable table should be cleared but not freed!
+ * Start by destroying the namespace's variable table, since variables
+ * might trigger traces. Variable table should be cleared but not freed!
* TclDeleteVars frees it, so we reinitialize it afterwards.
*/
@@ -1092,10 +1086,10 @@ TclTeardownNamespace(nsPtr)
/*
* Delete all the child namespaces.
*
- * BE CAREFUL: When each child is deleted, it will divorce
- * itself from its parent. You can't traverse a hash table
- * properly if its elements are being deleted. We use only
- * the Tcl_FirstHashEntry function to be safe.
+ * BE CAREFUL: When each child is deleted, it will divorce itself from its
+ * parent. You can't traverse a hash table properly if its elements are
+ * being deleted. We use only the Tcl_FirstHashEntry function to be
+ * safe.
*
* Don't optimize to Tcl_NextHashEntry() because of traces.
*/
@@ -1149,9 +1143,9 @@ TclTeardownNamespace(nsPtr)
nsPtr->clientData = NULL;
/*
- * Reset the namespace's id field to ensure that this namespace won't
- * be interpreted as valid by, e.g., the cache validation code for
- * cached command references in Tcl_GetCommandFromObj.
+ * Reset the namespace's id field to ensure that this namespace won't be
+ * interpreted as valid by, e.g., the cache validation code for cached
+ * command references in Tcl_GetCommandFromObj.
*/
nsPtr->nsId = 0;
@@ -1162,9 +1156,8 @@ TclTeardownNamespace(nsPtr)
*
* NamespaceFree --
*
- * Called after a namespace has been deleted, when its
- * reference count reaches 0. Frees the data structure
- * representing the namespace.
+ * Called after a namespace has been deleted, when its reference count
+ * reaches 0. Frees the data structure representing the namespace.
*
* Results:
* None.
@@ -1197,10 +1190,10 @@ NamespaceFree(nsPtr)
* Tcl_Export --
*
* Makes all the commands matching a pattern available to later be
- * imported from the namespace specified by namespacePtr (or the
- * current namespace if namespacePtr is NULL). The specified pattern is
- * appended onto the namespace's export pattern list, which is
- * optionally cleared beforehand.
+ * imported from the namespace specified by namespacePtr (or the current
+ * namespace if namespacePtr is NULL). The specified pattern is appended
+ * onto the namespace's export pattern list, which is optionally cleared
+ * beforehand.
*
* Results:
* Returns TCL_OK if successful, or TCL_ERROR (along with an error
@@ -1216,18 +1209,18 @@ NamespaceFree(nsPtr)
int
Tcl_Export(interp, namespacePtr, pattern, resetListFirst)
Tcl_Interp *interp; /* Current interpreter. */
- Tcl_Namespace *namespacePtr; /* Points to the namespace from which
- * commands are to be exported. NULL for
- * the current namespace. */
+ Tcl_Namespace *namespacePtr; /* Points to the namespace from which
+ * commands are to be exported. NULL for the
+ * current namespace. */
CONST char *pattern; /* String pattern indicating which commands
* to export. This pattern may not include
- * any namespace qualifiers; only commands
- * in the specified namespace may be
+ * any namespace qualifiers; only commands in
+ * the specified namespace may be
* exported. */
- int resetListFirst; /* If nonzero, resets the namespace's
- * export list before appending. */
+ int resetListFirst; /* If nonzero, resets the namespace's export
+ * list before appending. */
{
-#define INIT_EXPORT_PATTERNS 5
+#define INIT_EXPORT_PATTERNS 5
Namespace *nsPtr, *exportNsPtr, *dummyPtr;
Namespace *currNsPtr = (Namespace *) Tcl_GetCurrentNamespace(interp);
CONST char *simplePattern;
@@ -1279,6 +1272,7 @@ Tcl_Export(interp, namespacePtr, pattern, resetListFirst)
/*
* Make sure that we don't already have the pattern in the array
*/
+
if (nsPtr->exportArrayPtr != NULL) {
for (i = 0; i < nsPtr->numExportPatterns; i++) {
if (strcmp(pattern, nsPtr->exportArrayPtr[i]) == 0) {
@@ -1291,8 +1285,8 @@ Tcl_Export(interp, namespacePtr, pattern, resetListFirst)
}
/*
- * Make sure there is room in the namespace's pattern array for the
- * new pattern.
+ * Make sure there is room in the namespace's pattern array for the new
+ * pattern.
*/
neededElems = nsPtr->numExportPatterns + 1;
@@ -1325,10 +1319,9 @@ Tcl_Export(interp, namespacePtr, pattern, resetListFirst)
nsPtr->numExportPatterns++;
/*
- * The list of commands actually exported from the namespace might
- * have changed (probably will have!) However, we do not need to
- * recompute this just yet; next time we need the info will be
- * soon enough.
+ * The list of commands actually exported from the namespace might have
+ * changed (probably will have!) However, we do not need to recompute
+ * this just yet; next time we need the info will be soon enough.
*/
TclInvalidateNsCmdLookup(nsPtr);
@@ -1348,12 +1341,12 @@ Tcl_Export(interp, namespacePtr, pattern, resetListFirst)
* Results:
* The return value is normally TCL_OK; in this case the object
* referenced by objPtr has each export pattern appended to it. If an
- * error occurs, TCL_ERROR is returned and the interpreter's result
- * holds an error message.
+ * error occurs, TCL_ERROR is returned and the interpreter's result holds
+ * an error message.
*
* Side effects:
- * If necessary, the object referenced by objPtr is converted into
- * a list object.
+ * If necessary, the object referenced by objPtr is converted into a list
+ * object.
*
*----------------------------------------------------------------------
*/
@@ -1400,22 +1393,22 @@ Tcl_AppendExportList(interp, namespacePtr, objPtr)
* Tcl_Import --
*
* Imports all of the commands matching a pattern into the namespace
- * specified by namespacePtr (or the current namespace if contextNsPtr
- * is NULL). This is done by creating a new command (the "imported
- * command") that points to the real command in its original namespace.
+ * specified by namespacePtr (or the current namespace if contextNsPtr is
+ * NULL). This is done by creating a new command (the "imported command")
+ * that points to the real command in its original namespace.
*
- * If matching commands are on the autoload path but haven't been
- * loaded yet, this command forces them to be loaded, then creates
- * the links to them.
+ * If matching commands are on the autoload path but haven't been loaded
+ * yet, this command forces them to be loaded, then creates the links to
+ * them.
*
* Results:
* Returns TCL_OK if successful, or TCL_ERROR (along with an error
* message in the interpreter's result) if something goes wrong.
*
* Side effects:
- * Creates new commands in the importing namespace. These indirect
- * calls back to the real command and are deleted if the real commands
- * are deleted.
+ * Creates new commands in the importing namespace. These indirect calls
+ * back to the real command and are deleted if the real commands are
+ * deleted.
*
*----------------------------------------------------------------------
*/
@@ -1424,16 +1417,16 @@ int
Tcl_Import(interp, namespacePtr, pattern, allowOverwrite)
Tcl_Interp *interp; /* Current interpreter. */
Tcl_Namespace *namespacePtr; /* Points to the namespace into which the
- * commands are to be imported. NULL for
- * the current namespace. */
+ * commands are to be imported. NULL for the
+ * current namespace. */
CONST char *pattern; /* String pattern indicating which commands
* to import. This pattern should be
* qualified by the name of the namespace
* from which to import the command(s). */
- int allowOverwrite; /* If nonzero, allow existing commands to
- * be overwritten by imported commands.
- * If 0, return an error if an imported
- * cmd conflicts with an existing one. */
+ int allowOverwrite; /* If nonzero, allow existing commands to be
+ * overwritten by imported commands. If 0,
+ * return an error if an imported cmd
+ * conflicts with an existing one. */
{
Namespace *nsPtr, *importNsPtr, *dummyPtr;
CONST char *simplePattern;
@@ -1451,14 +1444,13 @@ Tcl_Import(interp, namespacePtr, pattern, allowOverwrite)
}
/*
- * First, invoke the "auto_import" command with the pattern
- * being imported. This command is part of the Tcl library.
- * It looks for imported commands in autoloaded libraries and
- * loads them in. That way, they will be found when we try
- * to create links below.
+ * First, invoke the "auto_import" command with the pattern being
+ * imported. This command is part of the Tcl library. It looks for
+ * imported commands in autoloaded libraries and loads them in. That way,
+ * they will be found when we try to create links below.
*
- * Note that we don't just call Tcl_EvalObjv() directly because we
- * do not want absence of the command to be a failure case.
+ * Note that we don't just call Tcl_EvalObjv() directly because we do not
+ * want absence of the command to be a failure case.
*/
if (Tcl_FindCommand(interp,"auto_import",NULL,TCL_GLOBAL_ONLY) != NULL) {
@@ -1481,9 +1473,8 @@ Tcl_Import(interp, namespacePtr, pattern, allowOverwrite)
}
/*
- * From the pattern, find the namespace from which we are importing
- * and get the simple pattern (no namespace qualifiers or ::'s) at
- * the end.
+ * From the pattern, find the namespace from which we are importing and
+ * get the simple pattern (no namespace qualifiers or ::'s) at the end.
*/
if (strlen(pattern) == 0) {
@@ -1530,9 +1521,9 @@ Tcl_Import(interp, namespacePtr, pattern, allowOverwrite)
for (hPtr = Tcl_FirstHashEntry(&importNsPtr->cmdTable, &search);
(hPtr != NULL); hPtr = Tcl_NextHashEntry(&search)) {
char *cmdName = Tcl_GetHashKey(&importNsPtr->cmdTable, hPtr);
- if (Tcl_StringMatch(cmdName, simplePattern)
- && (TCL_ERROR == DoImport( interp, nsPtr, hPtr, cmdName,
- pattern, importNsPtr, allowOverwrite))) {
+ if (Tcl_StringMatch(cmdName, simplePattern) &&
+ DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr,
+ allowOverwrite) == TCL_ERROR) {
return TCL_ERROR;
}
}
@@ -1553,9 +1544,8 @@ DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr, allowOverwrite)
Tcl_HashEntry *found;
/*
- * The command cmdName in the source namespace matches the
- * pattern. Check whether it was exported. If it wasn't,
- * we ignore it.
+ * The command cmdName in the source namespace matches the pattern. Check
+ * whether it was exported. If it wasn't, we ignore it.
*/
while (!exported && (i < importNsPtr->numExportPatterns)) {
@@ -1566,16 +1556,16 @@ DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr, allowOverwrite)
}
/*
- * Unless there is a name clash, create an imported command
- * in the current namespace that refers to cmdPtr.
+ * Unless there is a name clash, create an imported command in the current
+ * namespace that refers to cmdPtr.
*/
found = Tcl_FindHashEntry(&nsPtr->cmdTable, cmdName);
if ((found == NULL) || allowOverwrite) {
/*
- * Create the imported command and its client data.
- * To create the new command in the current namespace,
- * generate a fully qualified name for it.
+ * Create the imported command and its client data. To create the new
+ * command in the current namespace, generate a fully qualified name
+ * for it.
*/
Tcl_DString ds;
@@ -1592,9 +1582,8 @@ DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr, allowOverwrite)
Tcl_DStringAppend(&ds, cmdName, -1);
/*
- * Check whether creating the new imported command in the
- * current namespace would create a cycle of imported
- * command references.
+ * Check whether creating the new imported command in the current
+ * namespace would create a cycle of imported command references.
*/
cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
@@ -1608,11 +1597,9 @@ DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr, allowOverwrite)
dataPtr = (ImportedCmdData *) link->objClientData;
link = dataPtr->realCmdPtr;
if (overwrite == link) {
- Tcl_AppendResult(interp, "import pattern \"",
- pattern,
- "\" would create a loop containing ",
- "command \"", Tcl_DStringValue(&ds),
- "\"", (char *) NULL);
+ Tcl_AppendResult(interp, "import pattern \"", pattern,
+ "\" would create a loop containing command \"",
+ Tcl_DStringValue(&ds), "\"", (char *) NULL);
Tcl_DStringFree(&ds);
return TCL_ERROR;
}
@@ -1620,18 +1607,16 @@ DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr, allowOverwrite)
}
dataPtr = (ImportedCmdData *) ckalloc(sizeof(ImportedCmdData));
- importedCmd = Tcl_CreateObjCommand(interp,
- Tcl_DStringValue(&ds), InvokeImportedCmd,
- (ClientData) dataPtr, DeleteImportedCmd);
+ importedCmd = Tcl_CreateObjCommand(interp, Tcl_DStringValue(&ds),
+ InvokeImportedCmd, (ClientData) dataPtr, DeleteImportedCmd);
dataPtr->realCmdPtr = cmdPtr;
dataPtr->selfPtr = (Command *) importedCmd;
dataPtr->selfPtr->compileProc = cmdPtr->compileProc;
Tcl_DStringFree(&ds);
/*
- * Create an ImportRef structure describing this new import
- * command and add it to the import ref list in the "real"
- * command.
+ * Create an ImportRef structure describing this new import command
+ * and add it to the import ref list in the "real" command.
*/
refPtr = (ImportRef *) ckalloc(sizeof(ImportRef));
@@ -1640,9 +1625,10 @@ DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr, allowOverwrite)
cmdPtr->importRefPtr = refPtr;
} else {
Command *overwrite = (Command *) Tcl_GetHashValue(found);
+
if (overwrite->deleteProc == DeleteImportedCmd) {
- ImportedCmdData *dataPtr =
- (ImportedCmdData *) overwrite->objClientData;
+ ImportedCmdData *dataPtr = (ImportedCmdData *)
+ overwrite->objClientData;
if (dataPtr->realCmdPtr == (Command *) Tcl_GetHashValue(hPtr)) {
/* Repeated import of same command -- acceptable */
return TCL_OK;
@@ -1660,25 +1646,24 @@ DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr, allowOverwrite)
*
* Tcl_ForgetImport --
*
- * Deletes commands previously imported into the namespace indicated. The
- * by namespacePtr, or the current namespace of interp, when
+ * Deletes commands previously imported into the namespace indicated.
+ * The by namespacePtr, or the current namespace of interp, when
* namespacePtr is NULL. The pattern controls which imported commands
- * are deleted. A simple pattern, one without namespace separators,
+ * are deleted. A simple pattern, one without namespace separators,
* matches the current command names of imported commands in the
- * namespace. Matching imported commands are deleted. A qualified
- * pattern is interpreted as deletion selection on the basis of where
- * the command is imported from. The original command and "first link"
- * command for each imported command are determined, and they are matched
- * against the pattern. A match leads to deletion of the imported
- * command.
+ * namespace. Matching imported commands are deleted. A qualified pattern
+ * is interpreted as deletion selection on the basis of where the command
+ * is imported from. The original command and "first link" command for
+ * each imported command are determined, and they are matched against the
+ * pattern. A match leads to deletion of the imported command.
*
* Results:
- * Returns TCL_ERROR and records an error message in the interp
- * result if a namespace qualified pattern refers to a namespace
- * that does not exist. Otherwise, returns TCL_OK.
+ * Returns TCL_ERROR and records an error message in the interp result if
+ * a namespace qualified pattern refers to a namespace that does not
+ * exist. Otherwise, returns TCL_OK.
*
* Side effects:
- * May delete commands.
+ * May delete commands.
*
*----------------------------------------------------------------------
*/
@@ -1709,8 +1694,8 @@ Tcl_ForgetImport(interp, namespacePtr, pattern)
}
/*
- * Parse the pattern into its namespace-qualification (if any)
- * and the simple pattern.
+ * Parse the pattern into its namespace-qualification (if any) and the
+ * simple pattern.
*/
TclGetNamespaceForQualName(interp, pattern, nsPtr,
@@ -1726,8 +1711,7 @@ Tcl_ForgetImport(interp, namespacePtr, pattern)
if (strcmp(pattern, simplePattern) == 0) {
/*
- * The pattern is simple.
- * Delete any imported commands that match it.
+ * The pattern is simple. Delete any imported commands that match it.
*/
if (TclMatchIsTrivial(simplePattern)) {
@@ -1741,8 +1725,7 @@ Tcl_ForgetImport(interp, namespacePtr, pattern)
return TCL_OK;
}
for (hPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search);
- (hPtr != NULL);
- hPtr = Tcl_NextHashEntry(&search)) {
+ (hPtr != NULL); hPtr = Tcl_NextHashEntry(&search)) {
Command *cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
if (cmdPtr->deleteProc != DeleteImportedCmd) {
continue;
@@ -1755,7 +1738,9 @@ Tcl_ForgetImport(interp, namespacePtr, pattern)
return TCL_OK;
}
- /* The pattern was namespace-qualified */
+ /*
+ * The pattern was namespace-qualified.
+ */
for (hPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); (hPtr != NULL);
hPtr = Tcl_NextHashEntry(&search)) {
@@ -1764,13 +1749,14 @@ Tcl_ForgetImport(interp, namespacePtr, pattern)
Tcl_Command origin = TclGetOriginalCommand(token);
if (Tcl_GetCommandInfoFromToken(origin, &info) == 0) {
- continue; /* Not an imported command */
+ continue; /* Not an imported command */
}
if (info.namespacePtr != (Tcl_Namespace *) sourceNsPtr) {
/*
- * Original not in namespace we're matching.
- * Check the first link in the import chain.
+ * Original not in namespace we're matching. Check the first link
+ * in the import chain.
*/
+
Command *cmdPtr = (Command *) token;
ImportedCmdData *dataPtr =
(ImportedCmdData *) cmdPtr->objClientData;
@@ -1798,15 +1784,15 @@ Tcl_ForgetImport(interp, namespacePtr, pattern)
*
* An imported command is created in an namespace when a "real" command
* is imported from another namespace. If the specified command is an
- * imported command, this procedure returns the original command it
- * refers to.
+ * imported command, this function returns the original command it refers
+ * to.
*
* Results:
* If the command was imported into a sequence of namespaces a, b,...,n
* where each successive namespace just imports the command from the
- * previous namespace, this procedure returns the Tcl_Command token in
- * the first namespace, a. Otherwise, if the specified command is not
- * an imported command, the procedure returns NULL.
+ * previous namespace, this function returns the Tcl_Command token in the
+ * first namespace, a. Otherwise, if the specified command is not an
+ * imported command, the function returns NULL.
*
* Side effects:
* None.
@@ -1816,8 +1802,8 @@ Tcl_ForgetImport(interp, namespacePtr, pattern)
Tcl_Command
TclGetOriginalCommand(command)
- Tcl_Command command; /* The imported command for which the
- * original command should be returned. */
+ Tcl_Command command; /* The imported command for which the original
+ * command should be returned. */
{
register Command *cmdPtr = (Command *) command;
ImportedCmdData *dataPtr;
@@ -1838,16 +1824,16 @@ TclGetOriginalCommand(command)
*
* InvokeImportedCmd --
*
- * Invoked by Tcl whenever the user calls an imported command that
- * was created by Tcl_Import. Finds the "real" command (in another
+ * Invoked by Tcl whenever the user calls an imported command that was
+ * created by Tcl_Import. Finds the "real" command (in another
* namespace), and passes control to it.
*
* Results:
- * Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
+ * Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns a result in the interpreter's result object. If anything
- * goes wrong, the result object is set to an error message.
+ * Returns a result in the interpreter's result object. If anything goes
+ * wrong, the result object is set to an error message.
*
*----------------------------------------------------------------------
*/
@@ -1873,11 +1859,11 @@ InvokeImportedCmd(clientData, interp, objc, objv)
* DeleteImportedCmd --
*
* Invoked by Tcl whenever an imported command is deleted. The "real"
- * command keeps a list of all the imported commands that refer to it,
- * so those imported commands can be deleted when the real command is
- * deleted. This procedure removes the imported command reference from
- * the real command's list, and frees up the memory associated with
- * the imported command.
+ * command keeps a list of all the imported commands that refer to it, so
+ * those imported commands can be deleted when the real command is
+ * deleted. This function removes the imported command reference from the
+ * real command's list, and frees up the memory associated with the
+ * imported command.
*
* Results:
* None.
@@ -1928,70 +1914,70 @@ DeleteImportedCmd(clientData)
* TclGetNamespaceForQualName --
*
* Given a qualified name specifying a command, variable, or namespace,
- * and a namespace in which to resolve the name, this procedure returns
- * a pointer to the namespace that contains the item. A qualified name
- * consists of the "simple" name of an item qualified by the names of
- * an arbitrary number of containing namespace separated by "::"s. If
- * the qualified name starts with "::", it is interpreted absolutely
- * from the global namespace. Otherwise, it is interpreted relative to
- * the namespace specified by cxtNsPtr if it is non-NULL. If cxtNsPtr
- * is NULL, the name is interpreted relative to the current namespace.
- *
- * A relative name like "foo::bar::x" can be found starting in either
- * the current namespace or in the global namespace. So each search
- * usually follows two tracks, and two possible namespaces are
- * returned. If the procedure sets either *nsPtrPtr or *altNsPtrPtr to
- * NULL, then that path failed.
+ * and a namespace in which to resolve the name, this function returns a
+ * pointer to the namespace that contains the item. A qualified name
+ * consists of the "simple" name of an item qualified by the names of an
+ * arbitrary number of containing namespace separated by "::"s. If the
+ * qualified name starts with "::", it is interpreted absolutely from the
+ * global namespace. Otherwise, it is interpreted relative to the
+ * namespace specified by cxtNsPtr if it is non-NULL. If cxtNsPtr is
+ * NULL, the name is interpreted relative to the current namespace.
+ *
+ * A relative name like "foo::bar::x" can be found starting in either the
+ * current namespace or in the global namespace. So each search usually
+ * follows two tracks, and two possible namespaces are returned. If the
+ * function sets either *nsPtrPtr or *altNsPtrPtr to NULL, then that path
+ * failed.
*
* If "flags" contains TCL_GLOBAL_ONLY, the relative qualified name is
- * sought only in the global :: namespace. The alternate search
- * (also) starting from the global namespace is ignored and
- * *altNsPtrPtr is set NULL.
- *
- * If "flags" contains TCL_NAMESPACE_ONLY, the relative qualified
- * name is sought only in the namespace specified by cxtNsPtr. The
- * alternate search starting from the global namespace is ignored and
- * *altNsPtrPtr is set NULL. If both TCL_GLOBAL_ONLY and
- * TCL_NAMESPACE_ONLY are specified, TCL_GLOBAL_ONLY is ignored and
- * the search starts from the namespace specified by cxtNsPtr.
- *
- * If "flags" contains TCL_CREATE_NS_IF_UNKNOWN, all namespace
- * components of the qualified name that cannot be found are
- * automatically created within their specified parent. This makes sure
- * that functions like Tcl_CreateCommand always succeed. There is no
- * alternate search path, so *altNsPtrPtr is set NULL.
- *
- * If "flags" contains TCL_FIND_ONLY_NS, the qualified name is treated as a
- * reference to a namespace, and the entire qualified name is
- * followed. If the name is relative, the namespace is looked up only
- * in the current namespace. A pointer to the namespace is stored in
- * *nsPtrPtr and NULL is stored in *simpleNamePtr. Otherwise, if
- * TCL_FIND_ONLY_NS is not specified, only the leading components are
- * treated as namespace names, and a pointer to the simple name of the
- * final component is stored in *simpleNamePtr.
+ * sought only in the global :: namespace. The alternate search (also)
+ * starting from the global namespace is ignored and *altNsPtrPtr is set
+ * NULL.
+ *
+ * If "flags" contains TCL_NAMESPACE_ONLY, the relative qualified name is
+ * sought only in the namespace specified by cxtNsPtr. The alternate
+ * search starting from the global namespace is ignored and *altNsPtrPtr
+ * is set NULL. If both TCL_GLOBAL_ONLY and TCL_NAMESPACE_ONLY are
+ * specified, TCL_GLOBAL_ONLY is ignored and the search starts from the
+ * namespace specified by cxtNsPtr.
+ *
+ * If "flags" contains TCL_CREATE_NS_IF_UNKNOWN, all namespace components
+ * of the qualified name that cannot be found are automatically created
+ * within their specified parent. This makes sure that functions like
+ * Tcl_CreateCommand always succeed. There is no alternate search path,
+ * so *altNsPtrPtr is set NULL.
+ *
+ * If "flags" contains TCL_FIND_ONLY_NS, the qualified name is treated as
+ * a reference to a namespace, and the entire qualified name is followed.
+ * If the name is relative, the namespace is looked up only in the
+ * current namespace. A pointer to the namespace is stored in *nsPtrPtr
+ * and NULL is stored in *simpleNamePtr. Otherwise, if TCL_FIND_ONLY_NS
+ * is not specified, only the leading components are treated as namespace
+ * names, and a pointer to the simple name of the final component is
+ * stored in *simpleNamePtr.
*
* Results:
* It sets *nsPtrPtr and *altNsPtrPtr to point to the two possible
* namespaces which represent the last (containing) namespace in the
- * qualified name. If the procedure sets either *nsPtrPtr or *altNsPtrPtr
- * to NULL, then the search along that path failed. The procedure also
+ * qualified name. If the function sets either *nsPtrPtr or *altNsPtrPtr
+ * to NULL, then the search along that path failed. The function also
* stores a pointer to the simple name of the final component in
* *simpleNamePtr. If the qualified name is "::" or was treated as a
- * namespace reference (TCL_FIND_ONLY_NS), the procedure stores a pointer
+ * namespace reference (TCL_FIND_ONLY_NS), the function stores a pointer
* to the namespace in *nsPtrPtr, NULL in *altNsPtrPtr, and sets
* *simpleNamePtr to point to an empty string.
*
- * If there is an error, this procedure returns TCL_ERROR. If "flags"
+ * If there is an error, this function returns TCL_ERROR. If "flags"
* contains TCL_LEAVE_ERR_MSG, an error message is returned in the
* interpreter's result object. Otherwise, the interpreter's result
* object is left unchanged.
*
- * *actualCxtPtrPtr is set to the actual context namespace. It is
- * set to the input context namespace pointer in cxtNsPtr. If cxtNsPtr
- * is NULL, it is set to the current namespace context.
+ * *actualCxtPtrPtr is set to the actual context namespace. It is set to
+ * the input context namespace pointer in cxtNsPtr. If cxtNsPtr is NULL,
+ * it is set to the current namespace context.
*
- * For backwards compatibility with the TclPro byte code loader,
- * this function always returns TCL_OK.
+ * For backwards compatibility with the TclPro byte code loader, this
+ * function always returns TCL_OK.
*
* Side effects:
* If "flags" contains TCL_CREATE_NS_IF_UNKNOWN, new namespaces may be
@@ -2003,42 +1989,42 @@ DeleteImportedCmd(clientData)
int
TclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,
nsPtrPtr, altNsPtrPtr, actualCxtPtrPtr, simpleNamePtr)
- Tcl_Interp *interp; /* Interpreter in which to find the
- * namespace containing qualName. */
- CONST char *qualName; /* A namespace-qualified name of an
- * command, variable, or namespace. */
- Namespace *cxtNsPtr; /* The namespace in which to start the
- * search for qualName's namespace. If NULL
- * start from the current namespace.
- * Ignored if TCL_GLOBAL_ONLY is set. */
+ Tcl_Interp *interp; /* Interpreter in which to find the namespace
+ * containing qualName. */
+ CONST char *qualName; /* A namespace-qualified name of an command,
+ * variable, or namespace. */
+ Namespace *cxtNsPtr; /* The namespace in which to start the search
+ * for qualName's namespace. If NULL start
+ * from the current namespace. Ignored if
+ * TCL_GLOBAL_ONLY is set. */
int flags; /* Flags controlling the search: an OR'd
* combination of TCL_GLOBAL_ONLY,
* TCL_NAMESPACE_ONLY,
* TCL_CREATE_NS_IF_UNKNOWN, and
* TCL_FIND_ONLY_NS. */
- Namespace **nsPtrPtr; /* Address where procedure stores a pointer
- * to containing namespace if qualName is
- * found starting from *cxtNsPtr or, if
+ Namespace **nsPtrPtr; /* Address where function stores a pointer to
+ * containing namespace if qualName is found
+ * starting from *cxtNsPtr or, if
* TCL_GLOBAL_ONLY is set, if qualName is
- * found in the global :: namespace. NULL
- * is stored otherwise. */
- Namespace **altNsPtrPtr; /* Address where procedure stores a pointer
- * to containing namespace if qualName is
- * found starting from the global ::
- * namespace. NULL is stored if qualName
- * isn't found starting from :: or if the
+ * found in the global :: namespace. NULL is
+ * stored otherwise. */
+ Namespace **altNsPtrPtr; /* Address where function stores a pointer to
+ * containing namespace if qualName is found
+ * starting from the global :: namespace.
+ * NULL is stored if qualName isn't found
+ * starting from :: or if the
* TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY,
* TCL_CREATE_NS_IF_UNKNOWN, TCL_FIND_ONLY_NS
* flag is set. */
- Namespace **actualCxtPtrPtr; /* Address where procedure stores a pointer
- * to the actual namespace from which the
- * search started. This is either cxtNsPtr,
- * the :: namespace if TCL_GLOBAL_ONLY was
+ Namespace **actualCxtPtrPtr; /* Address where function stores a pointer to
+ * the actual namespace from which the search
+ * started. This is either cxtNsPtr, the ::
+ * namespace if TCL_GLOBAL_ONLY was
* specified, or the current namespace if
* cxtNsPtr was NULL. */
- CONST char **simpleNamePtr; /* Address where procedure stores the
- * simple name at end of the qualName, or
- * NULL if qualName is "::" or the flag
+ CONST char **simpleNamePtr; /* Address where function stores the simple
+ * name at end of the qualName, or NULL if
+ * qualName is "::" or the flag
* TCL_FIND_ONLY_NS was specified. */
{
Interp *iPtr = (Interp *) interp;
@@ -2053,11 +2039,11 @@ TclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,
/*
* Determine the context namespace nsPtr in which to start the primary
- * search. If the qualName name starts with a "::" or TCL_GLOBAL_ONLY
- * was specified, search from the global namespace. Otherwise, use the
+ * search. If the qualName name starts with a "::" or TCL_GLOBAL_ONLY was
+ * specified, search from the global namespace. Otherwise, use the
* namespace given in cxtNsPtr, or if that is NULL, use the current
- * namespace context. Note that we always treat two or more
- * adjacent ":"s as a namespace separator.
+ * namespace context. Note that we always treat two or more adjacent ":"s
+ * as a namespace separator.
*/
if (flags & TCL_GLOBAL_ONLY) {
@@ -2108,10 +2094,10 @@ TclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,
end = start;
while (*start != '\0') {
/*
- * Find the next namespace qualifier (i.e., a name ending in "::")
- * or the end of the qualified name (i.e., a name ending in "\0").
- * Set len to the number of characters, starting from start,
- * in the name; set end to point after the "::"s or at the "\0".
+ * Find the next namespace qualifier (i.e., a name ending in "::") or
+ * the end of the qualified name (i.e., a name ending in "\0"). Set
+ * len to the number of characters, starting from start, in the name;
+ * set end to point after the "::"s or at the "\0".
*/
len = 0;
@@ -2129,8 +2115,8 @@ TclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,
if (*end=='\0' && !(end-start>=2 && *(end-1)==':' && *(end-2)==':')) {
/*
* qualName ended with a simple name at start. If TCL_FIND_ONLY_NS
- * was specified, look this up as a namespace. Otherwise,
- * start is the name of a cmd or var and we are done.
+ * was specified, look this up as a namespace. Otherwise, start is
+ * the name of a cmd or var and we are done.
*/
if (flags & TCL_FIND_ONLY_NS) {
@@ -2146,9 +2132,9 @@ TclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,
/*
* start points to the beginning of a namespace qualifier ending
* in "::". end points to the start of a name in that namespace
- * that might be empty. Copy the namespace qualifier to a
- * buffer so it can be null terminated. We can't modify the
- * incoming qualName since it may be a string constant.
+ * that might be empty. Copy the namespace qualifier to a buffer
+ * so it can be null terminated. We can't modify the incoming
+ * qualName since it may be a string constant.
*/
Tcl_DStringSetLength(&buffer, 0);
@@ -2159,8 +2145,8 @@ TclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,
/*
* Look up the namespace qualifier nsName in the current namespace
* context. If it isn't found but TCL_CREATE_NS_IF_UNKNOWN is set,
- * create that qualifying namespace. This is needed for procedures
- * like Tcl_CreateCommand that cannot fail.
+ * create that qualifying namespace. This is needed for functions like
+ * Tcl_CreateCommand that cannot fail.
*/
if (nsPtr != NULL) {
@@ -2225,10 +2211,10 @@ TclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,
}
/*
- * As a special case, if we are looking for a namespace and qualName
- * is "" and the current active namespace (nsPtr) is not the global
- * namespace, return NULL (no namespace was found). This is because
- * namespaces can not have empty names except for the global namespace.
+ * As a special case, if we are looking for a namespace and qualName is ""
+ * and the current active namespace (nsPtr) is not the global namespace,
+ * return NULL (no namespace was found). This is because namespaces can
+ * not have empty names except for the global namespace.
*/
if ((flags & TCL_FIND_ONLY_NS) && (*qualName == '\0')
@@ -2250,9 +2236,9 @@ TclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,
* Searches for a namespace.
*
* Results:
- * Returns a pointer to the namespace if it is found. Otherwise,
- * returns NULL and leaves an error message in the interpreter's
- * result object if "flags" contains TCL_LEAVE_ERR_MSG.
+ * Returns a pointer to the namespace if it is found. Otherwise, returns
+ * NULL and leaves an error message in the interpreter's result object if
+ * "flags" contains TCL_LEAVE_ERR_MSG.
*
* Side effects:
* None.
@@ -2269,11 +2255,11 @@ Tcl_FindNamespace(interp, name, contextNsPtr, flags)
* Else, looked up first in contextNsPtr
* (current namespace if contextNsPtr is
* NULL), then in global namespace. */
- Tcl_Namespace *contextNsPtr; /* Ignored if TCL_GLOBAL_ONLY flag is set
- * or if the name starts with "::".
- * Otherwise, points to namespace in which
- * to resolve name; if NULL, look up name
- * in the current namespace. */
+ Tcl_Namespace *contextNsPtr; /* Ignored if TCL_GLOBAL_ONLY flag is set or
+ * if the name starts with "::". Otherwise,
+ * points to namespace in which to resolve
+ * name; if NULL, look up name in the current
+ * namespace. */
register int flags; /* Flags controlling namespace lookup: an
* OR'd combination of TCL_GLOBAL_ONLY and
* TCL_LEAVE_ERR_MSG flags. */
@@ -2282,9 +2268,9 @@ Tcl_FindNamespace(interp, name, contextNsPtr, flags)
CONST char *dummy;
/*
- * Find the namespace(s) that contain the specified namespace name.
- * Add the TCL_FIND_ONLY_NS flag to resolve the name all the way down
- * to its last component, a namespace.
+ * Find the namespace(s) that contain the specified namespace name. Add
+ * the TCL_FIND_ONLY_NS flag to resolve the name all the way down to its
+ * last component, a namespace.
*/
TclGetNamespaceForQualName(interp, name, (Namespace *) contextNsPtr,
@@ -2308,10 +2294,10 @@ Tcl_FindNamespace(interp, name, contextNsPtr, flags)
* Searches for a command.
*
* Results:
- * Returns a token for the command if it is found. Otherwise, if it
- * can't be found or there is an error, returns NULL and leaves an
- * error message in the interpreter's result object if "flags"
- * contains TCL_LEAVE_ERR_MSG.
+ * Returns a token for the command if it is found. Otherwise, if it can't
+ * be found or there is an error, returns NULL and leaves an error
+ * message in the interpreter's result object if "flags" contains
+ * TCL_LEAVE_ERR_MSG.
*
* Side effects:
* None.
@@ -2329,18 +2315,17 @@ Tcl_FindCommand(interp, name, contextNsPtr, flags)
* (current namespace if contextNsPtr is
* NULL), then in global namespace. */
Tcl_Namespace *contextNsPtr; /* Ignored if TCL_GLOBAL_ONLY flag set.
- * Otherwise, points to namespace in which
- * to resolve name. If NULL, look up name
- * in the current namespace. */
+ * Otherwise, points to namespace in which to
+ * resolve name. If NULL, look up name in the
+ * current namespace. */
int flags; /* An OR'd combination of flags:
* TCL_GLOBAL_ONLY (look up name only in
* global namespace), TCL_NAMESPACE_ONLY
* (look up only in contextNsPtr, or the
* current namespace if contextNsPtr is
* NULL), and TCL_LEAVE_ERR_MSG. If both
- * TCL_GLOBAL_ONLY and TCL_NAMESPACE_ONLY
- * are given, TCL_GLOBAL_ONLY is
- * ignored. */
+ * TCL_GLOBAL_ONLY and TCL_NAMESPACE_ONLY are
+ * given, TCL_GLOBAL_ONLY is ignored. */
{
Interp *iPtr = (Interp*)interp;
Namespace *cxtNsPtr;
@@ -2350,12 +2335,13 @@ Tcl_FindCommand(interp, name, contextNsPtr, flags)
int result;
/*
- * If this namespace has a command resolver, then give it first
- * crack at the command resolution. If the interpreter has any
- * command resolvers, consult them next. The command resolver
- * procedures may return a Tcl_Command value, they may signal
- * to continue onward, or they may signal an error.
+ * If this namespace has a command resolver, then give it first crack at
+ * the command resolution. If the interpreter has any command resolvers,
+ * consult them next. The command resolver functions may return a
+ * Tcl_Command value, they may signal to continue onward, or they may
+ * signal an error.
*/
+
if (flags & TCL_GLOBAL_ONLY) {
cxtNsPtr = (Namespace *) Tcl_GetGlobalNamespace(interp);
} else if (contextNsPtr != NULL) {
@@ -2430,8 +2416,8 @@ Tcl_FindCommand(interp, name, contextNsPtr, flags)
}
/*
- * If we've still not found the command, look in the global
- * namespace as a last resort.
+ * If we've still not found the command, look in the global namespace
+ * as a last resort.
*/
if (cmdPtr == NULL) {
@@ -2453,9 +2439,9 @@ Tcl_FindCommand(interp, name, contextNsPtr, flags)
flags, &nsPtr[0], &nsPtr[1], &cxtNsPtr, &simpleName);
/*
- * Look for the command in the command table of its namespace.
- * Be sure to check both possible search paths: from the
- * specified namespace context and from the global namespace.
+ * Look for the command in the command table of its namespace. Be sure
+ * to check both possible search paths: from the specified namespace
+ * context and from the global namespace.
*/
for (search = 0; (search < 2) && (cmdPtr == NULL); search++) {
@@ -2487,14 +2473,14 @@ Tcl_FindCommand(interp, name, contextNsPtr, flags)
* Tcl_FindNamespaceVar --
*
* Searches for a namespace variable, a variable not local to a
- * procedure. The variable can be either a scalar or an array, but
- * may not be an element of an array.
+ * procedure. The variable can be either a scalar or an array, but may
+ * not be an element of an array.
*
* Results:
* Returns a token for the variable if it is found. Otherwise, if it
- * can't be found or there is an error, returns NULL and leaves an
- * error message in the interpreter's result object if "flags"
- * contains TCL_LEAVE_ERR_MSG.
+ * can't be found or there is an error, returns NULL and leaves an error
+ * message in the interpreter's result object if "flags" contains
+ * TCL_LEAVE_ERR_MSG.
*
* Side effects:
* None.
@@ -2512,18 +2498,17 @@ Tcl_FindNamespaceVar(interp, name, contextNsPtr, flags)
* (current namespace if contextNsPtr is
* NULL), then in global namespace. */
Tcl_Namespace *contextNsPtr; /* Ignored if TCL_GLOBAL_ONLY flag set.
- * Otherwise, points to namespace in which
- * to resolve name. If NULL, look up name
- * in the current namespace. */
+ * Otherwise, points to namespace in which to
+ * resolve name. If NULL, look up name in the
+ * current namespace. */
int flags; /* An OR'd combination of flags:
* TCL_GLOBAL_ONLY (look up name only in
* global namespace), TCL_NAMESPACE_ONLY
* (look up only in contextNsPtr, or the
* current namespace if contextNsPtr is
* NULL), and TCL_LEAVE_ERR_MSG. If both
- * TCL_GLOBAL_ONLY and TCL_NAMESPACE_ONLY
- * are given, TCL_GLOBAL_ONLY is
- * ignored. */
+ * TCL_GLOBAL_ONLY and TCL_NAMESPACE_ONLY are
+ * given, TCL_GLOBAL_ONLY is ignored. */
{
Interp *iPtr = (Interp*)interp;
ResolverScheme *resPtr;
@@ -2536,11 +2521,11 @@ Tcl_FindNamespaceVar(interp, name, contextNsPtr, flags)
Tcl_Var var;
/*
- * If this namespace has a variable resolver, then give it first
- * crack at the variable resolution. It may return a Tcl_Var
- * value, it may signal to continue onward, or it may signal
- * an error.
+ * If this namespace has a variable resolver, then give it first crack at
+ * the variable resolution. It may return a Tcl_Var value, it may signal
+ * to continue onward, or it may signal an error.
*/
+
if ((flags & TCL_GLOBAL_ONLY) != 0) {
cxtNsPtr = (Namespace *) Tcl_GetGlobalNamespace(interp);
} else if (contextNsPtr != NULL) {
@@ -2582,9 +2567,9 @@ Tcl_FindNamespaceVar(interp, name, contextNsPtr, flags)
flags, &nsPtr[0], &nsPtr[1], &cxtNsPtr, &simpleName);
/*
- * Look for the variable in the variable table of its namespace.
- * Be sure to check both possible search paths: from the specified
- * namespace context and from the global namespace.
+ * Look for the variable in the variable table of its namespace. Be sure
+ * to check both possible search paths: from the specified namespace
+ * context and from the global namespace.
*/
varPtr = NULL;
@@ -2615,25 +2600,25 @@ Tcl_FindNamespaceVar(interp, name, contextNsPtr, flags)
* command references that the new command may invalidate. Consider the
* following cases that could happen when you add a command "foo" to a
* namespace "b":
- * 1. It could shadow a command named "foo" at the global scope.
- * If it does, all command references in the namespace "b" are
+ * 1. It could shadow a command named "foo" at the global scope. If
+ * it does, all command references in the namespace "b" are
* suspect.
- * 2. Suppose the namespace "b" resides in a namespace "a".
- * Then to "a" the new command "b::foo" could shadow another
- * command "b::foo" in the global namespace. If so, then all
- * command references in "a" are suspect.
- * The same checks are applied to all parent namespaces, until we
- * reach the global :: namespace.
+ * 2. Suppose the namespace "b" resides in a namespace "a". Then to
+ * "a" the new command "b::foo" could shadow another command
+ * "b::foo" in the global namespace. If so, then all command
+ * references in "a" * are suspect.
+ * The same checks are applied to all parent namespaces, until we reach
+ * the global :: namespace.
*
* Results:
* None.
*
* Side effects:
* If the new command shadows an existing command, the cmdRefEpoch
- * counter is incremented in each namespace that sees the shadow.
- * This invalidates all command references that were previously cached
- * in that namespace. The next time the commands are used, they are
- * resolved from scratch.
+ * counter is incremented in each namespace that sees the shadow. This
+ * invalidates all command references that were previously cached in that
+ * namespace. The next time the commands are used, they are resolved from
+ * scratch.
*
*----------------------------------------------------------------------
*/
@@ -2651,7 +2636,7 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
int found, i;
/*
- * This procedure generates an array used to hold the trail list. This
+ * This function generates an array used to hold the trail list. This
* starts out with stack-allocated space but uses dynamically-allocated
* storage if needed.
*/
@@ -2662,9 +2647,9 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
int trailSize = NUM_TRAIL_ELEMS;
/*
- * Start at the namespace containing the new command, and work up
- * through the list of parents. Stop just before the global namespace,
- * since the global namespace can't "shadow" its own entries.
+ * Start at the namespace containing the new command, and work up through
+ * the list of parents. Stop just before the global namespace, since the
+ * global namespace can't "shadow" its own entries.
*
* The namespace "trail" list we build consists of the names of each
* namespace that encloses the new command, in order from outermost to
@@ -2672,23 +2657,22 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
* eventually extends the trail upwards by one namespace, nsPtr. We use
* this trail list to see if nsPtr (e.g. "a" in 2. above) could have
* now-invalid cached command references. This will happen if nsPtr
- * (e.g. "a") contains a sequence of child namespaces (e.g. "b")
- * such that there is a identically-named sequence of child namespaces
- * starting from :: (e.g. "::b") whose tail namespace contains a command
- * also named cmdName.
+ * (e.g. "a") contains a sequence of child namespaces (e.g. "b") such that
+ * there is a identically-named sequence of child namespaces starting from
+ * :: (e.g. "::b") whose tail namespace contains a command also named
+ * cmdName.
*/
cmdName = Tcl_GetHashKey(newCmdPtr->hPtr->tablePtr, newCmdPtr->hPtr);
- for (nsPtr = newCmdPtr->nsPtr;
- (nsPtr != NULL) && (nsPtr != globalNsPtr);
- nsPtr = nsPtr->parentPtr) {
+ for (nsPtr=newCmdPtr->nsPtr ; (nsPtr!=NULL) && (nsPtr!=globalNsPtr) ;
+ nsPtr=nsPtr->parentPtr) {
/*
* Find the maximal sequence of child namespaces contained in nsPtr
- * such that there is a identically-named sequence of child
- * namespaces starting from ::. shadowNsPtr will be the tail of this
- * sequence, or the deepest namespace under :: that might contain a
- * command now shadowed by cmdName. We check below if shadowNsPtr
- * actually contains a command cmdName.
+ * such that there is a identically-named sequence of child namespaces
+ * starting from ::. shadowNsPtr will be the tail of this sequence, or
+ * the deepest namespace under :: that might contain a command now
+ * shadowed by cmdName. We check below if shadowNsPtr actually
+ * contains a command cmdName.
*/
found = 1;
@@ -2707,8 +2691,8 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
}
/*
- * If shadowNsPtr contains a command named cmdName, we invalidate
- * all of the command refs cached in nsPtr. As a boundary case,
+ * If shadowNsPtr contains a command named cmdName, we invalidate all
+ * of the command refs cached in nsPtr. As a boundary case,
* shadowNsPtr is initially :: and we check for case 1. above.
*/
@@ -2718,7 +2702,7 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
nsPtr->cmdRefEpoch++;
TclInvalidateNsPath(nsPtr);
- /*
+ /*
* If the shadowed command was compiled to bytecodes, we
* invalidate all the bytecodes in nsPtr, to force a new
* compilation. We use the resolverEpoch to signal the need
@@ -2732,8 +2716,8 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
}
/*
- * Insert nsPtr at the front of the trail list: i.e., at the end
- * of the trailPtr array.
+ * Insert nsPtr at the front of the trail list: i.e., at the end of
+ * the trailPtr array.
*/
trailFront++;
@@ -2741,8 +2725,7 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
size_t currBytes = trailSize * sizeof(Namespace *);
int newSize = 2*trailSize;
size_t newBytes = newSize * sizeof(Namespace *);
- Namespace **newPtr =
- (Namespace **) ckalloc((unsigned) newBytes);
+ Namespace **newPtr = (Namespace **) ckalloc((unsigned) newBytes);
memcpy((VOID *) newPtr, (VOID *) trailPtr, currBytes);
if (trailPtr != trailStorage) {
@@ -2771,19 +2754,19 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
* Gets the namespace specified by the name in a Tcl_Obj.
*
* Results:
- * Returns TCL_OK if the namespace was resolved successfully, and
- * stores a pointer to the namespace in the location specified by
- * nsPtrPtr. If the namespace can't be found, the procedure stores
- * NULL in *nsPtrPtr and returns TCL_OK. If anything else goes wrong,
- * this procedure returns TCL_ERROR.
+ * Returns TCL_OK if the namespace was resolved successfully, and stores
+ * a pointer to the namespace in the location specified by nsPtrPtr. If
+ * the namespace can't be found, the function stores NULL in *nsPtrPtr
+ * and returns TCL_OK. If anything else goes wrong, this function returns
+ * TCL_ERROR.
*
* Side effects:
* May update the internal representation for the object, caching the
- * namespace reference. The next time this procedure is called, the
+ * namespace reference. The next time this function is called, the
* namespace value can be found quickly.
*
- * If anything goes wrong, an error message is left in the
- * interpreter's result object.
+ * If anything goes wrong, an error message is left in the interpreter's
+ * result object.
*
*----------------------------------------------------------------------
*/
@@ -2791,8 +2774,8 @@ TclResetShadowedCmdRefs(interp, newCmdPtr)
int
TclGetNamespaceFromObj(interp, objPtr, nsPtrPtr)
Tcl_Interp *interp; /* The current interpreter. */
- Tcl_Obj *objPtr; /* The object to be resolved as the name
- * of a namespace. */
+ Tcl_Obj *objPtr; /* The object to be resolved as the name of a
+ * namespace. */
Tcl_Namespace **nsPtrPtr; /* Result namespace pointer goes here. */
{
Interp *iPtr = (Interp *) interp;
@@ -2804,9 +2787,9 @@ TclGetNamespaceFromObj(interp, objPtr, nsPtrPtr)
char *name;
/*
- * If the namespace name is fully qualified, do as if the lookup were
- * done from the global namespace; this helps avoid repeated lookups
- * of fully qualified names.
+ * If the namespace name is fully qualified, do as if the lookup were done
+ * from the global namespace; this helps avoid repeated lookups of fully
+ * qualified names.
*/
savedFramePtr = iPtr->varFramePtr;
@@ -2819,8 +2802,8 @@ TclGetNamespaceFromObj(interp, objPtr, nsPtrPtr)
/*
* Get the internal representation, converting to a namespace type if
- * needed. The internal representation is a ResolvedNsName that points
- * to the actual namespace.
+ * needed. The internal representation is a ResolvedNsName that points to
+ * the actual namespace.
*/
if (objPtr->typePtr != &tclNsNameType) {
@@ -2832,17 +2815,16 @@ TclGetNamespaceFromObj(interp, objPtr, nsPtrPtr)
resNamePtr = (ResolvedNsName *) objPtr->internalRep.otherValuePtr;
/*
- * Check the context namespace of the resolved symbol to make sure that
- * it is fresh. If not, then force another conversion to the namespace
- * type, to discard the old rep and create a new one. Note that we
- * verify that the namespace id of the cached namespace is the same as
- * the id when we cached it; this insures that the namespace wasn't
- * deleted and a new one created at the same address.
+ * Check the context namespace of the resolved symbol to make sure that it
+ * is fresh. If not, then force another conversion to the namespace type,
+ * to discard the old rep and create a new one. Note that we verify that
+ * the namespace id of the cached namespace is the same as the id when we
+ * cached it; this insures that the namespace wasn't deleted and a new one
+ * created at the same address.
*/
nsPtr = NULL;
- if ((resNamePtr != NULL)
- && (resNamePtr->refNsPtr == currNsPtr)
+ if ((resNamePtr != NULL) && (resNamePtr->refNsPtr == currNsPtr)
&& (resNamePtr->nsId == resNamePtr->nsPtr->nsId)) {
nsPtr = resNamePtr->nsPtr;
if (nsPtr->flags & NS_DEAD) {
@@ -2874,8 +2856,8 @@ TclGetNamespaceFromObj(interp, objPtr, nsPtrPtr)
*
* Tcl_NamespaceObjCmd --
*
- * Invoked to implement the "namespace" command that creates, deletes,
- * or manipulates Tcl namespaces. Handles the following syntax:
+ * Invoked to implement the "namespace" command that creates, deletes, or
+ * manipulates Tcl namespaces. Handles the following syntax:
*
* namespace children ?name? ?pattern?
* namespace code arg
@@ -2899,13 +2881,12 @@ TclGetNamespaceFromObj(interp, objPtr, nsPtrPtr)
* anything goes wrong.
*
* Side effects:
- * Based on the subcommand name (e.g., "import"), this procedure
- * dispatches to a corresponding procedure NamespaceXXXCmd defined
- * statically in this file. This procedure's side effects depend on
- * whatever that subcommand procedure does. If there is an error, this
- * procedure returns an error message in the interpreter's result
- * object. Otherwise it may return a result in the interpreter's result
- * object.
+ * Based on the subcommand name (e.g., "import"), this function
+ * dispatches to a corresponding function NamespaceXXXCmd defined
+ * statically in this file. This function's side effects depend on
+ * whatever that subcommand function does. If there is an error, this
+ * function returns an error message in the interpreter's result object.
+ * Otherwise it may return a result in the interpreter's result object.
*
*----------------------------------------------------------------------
*/
@@ -3008,8 +2989,8 @@ Tcl_NamespaceObjCmd(clientData, interp, objc, objv)
* NamespaceChildrenCmd --
*
* Invoked to implement the "namespace children" command that returns a
- * list containing the fully-qualified names of the child namespaces of
- * a given namespace. Handles the following syntax:
+ * list containing the fully-qualified names of the child namespaces of a
+ * given namespace. Handles the following syntax:
*
* namespace children ?name? ?pattern?
*
@@ -3017,8 +2998,8 @@ Tcl_NamespaceObjCmd(clientData, interp, objc, objv)
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns a result in the interpreter's result object. If anything
- * goes wrong, the result is an error message.
+ * Returns a result in the interpreter's result object. If anything goes
+ * wrong, the result is an error message.
*
*----------------------------------------------------------------------
*/
@@ -3082,8 +3063,8 @@ NamespaceChildrenCmd(dummy, interp, objc, objv)
}
/*
- * Create a list containing the full names of all child namespaces
- * whose names match the specified pattern, if any.
+ * Create a list containing the full names of all child namespaces whose
+ * names match the specified pattern, if any.
*/
listPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL);
@@ -3105,7 +3086,7 @@ NamespaceChildrenCmd(dummy, interp, objc, objv)
entryPtr = Tcl_NextHashEntry(&search);
}
-searchDone:
+ searchDone:
Tcl_SetObjResult(interp, listPtr);
Tcl_DStringFree(&buffer);
return TCL_OK;
@@ -3126,15 +3107,15 @@ searchDone:
*
* list ::namespace inscope [namespace current] $arg
*
- * However, if "arg" is itself a scoped value starting with
- * "::namespace inscope", then the result is just "arg".
+ * However, if "arg" is itself a scoped value starting with "::namespace
+ * inscope", then the result is just "arg".
*
* Results:
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * If anything goes wrong, this procedure returns an error
- * message as the result in the interpreter's result object.
+ * If anything goes wrong, this function returns an error message as the
+ * result in the interpreter's result object.
*
*----------------------------------------------------------------------
*/
@@ -3177,10 +3158,10 @@ NamespaceCodeCmd(dummy, interp, objc, objv)
/*
* Otherwise, construct a scoped command by building a list with
- * "namespace inscope", the full name of the current namespace, and
- * the argument "arg". By constructing a list, we ensure that scoped
- * commands are interpreted properly when they are executed later,
- * by the "namespace inscope" command.
+ * "namespace inscope", the full name of the current namespace, and the
+ * argument "arg". By constructing a list, we ensure that scoped commands
+ * are interpreted properly when they are executed later, by the
+ * "namespace inscope" command.
*/
listPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL);
@@ -3208,9 +3189,9 @@ NamespaceCodeCmd(dummy, interp, objc, objv)
*
* NamespaceCurrentCmd --
*
- * Invoked to implement the "namespace current" command which returns
- * the fully-qualified name of the current namespace. Handles the
- * following syntax:
+ * Invoked to implement the "namespace current" command which returns the
+ * fully-qualified name of the current namespace. Handles the following
+ * syntax:
*
* namespace current
*
@@ -3218,8 +3199,8 @@ NamespaceCodeCmd(dummy, interp, objc, objv)
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns a result in the interpreter's result object. If anything
- * goes wrong, the result is an error message.
+ * Returns a result in the interpreter's result object. If anything goes
+ * wrong, the result is an error message.
*
*----------------------------------------------------------------------
*/
@@ -3239,10 +3220,10 @@ NamespaceCurrentCmd(dummy, interp, objc, objv)
}
/*
- * The "real" name of the global namespace ("::") is the null string,
- * but we return "::" for it as a convenience to programmers. Note that
- * "" and "::" are treated as synonyms by the namespace code so that it
- * is still easy to do things like:
+ * The "real" name of the global namespace ("::") is the null string, but
+ * we return "::" for it as a convenience to programmers. Note that "" and
+ * "::" are treated as synonyms by the namespace code so that it is still
+ * easy to do things like:
*
* namespace [namespace current]::bar { ... }
*/
@@ -3269,12 +3250,12 @@ NamespaceCurrentCmd(dummy, interp, objc, objv)
* Each name identifies a namespace. It may include a sequence of
* namespace qualifiers separated by "::"s. If a namespace is found, it
* is deleted: all variables and procedures contained in that namespace
- * are deleted. If that namespace is being used on the call stack, it
- * is kept alive (but logically deleted) until it is removed from the
- * call stack: that is, it can no longer be referenced by name but any
+ * are deleted. If that namespace is being used on the call stack, it is
+ * kept alive (but logically deleted) until it is removed from the call
+ * stack: that is, it can no longer be referenced by name but any
* currently executing procedure that refers to it is allowed to do so
* until the procedure returns. If the namespace can't be found, this
- * procedure returns an error. If no namespaces are specified, this
+ * function returns an error. If no namespaces are specified, this
* command does nothing.
*
* Results:
@@ -3282,8 +3263,7 @@ NamespaceCurrentCmd(dummy, interp, objc, objv)
*
* Side effects:
* Deletes the specified namespaces. If anything goes wrong, this
- * procedure returns an error message in the interpreter's
- * result object.
+ * function returns an error message in the interpreter's result object.
*
*----------------------------------------------------------------------
*/
@@ -3305,9 +3285,9 @@ NamespaceDeleteCmd(dummy, interp, objc, objv)
}
/*
- * Destroying one namespace may cause another to be destroyed. Break
- * this into two passes: first check to make sure that all namespaces on
- * the command line are valid, and report any errors.
+ * Destroying one namespace may cause another to be destroyed. Break this
+ * into two passes: first check to make sure that all namespaces on the
+ * command line are valid, and report any errors.
*/
for (i = 2; i < objc; i++) {
@@ -3342,24 +3322,24 @@ NamespaceDeleteCmd(dummy, interp, objc, objv)
*
* NamespaceEvalCmd --
*
- * Invoked to implement the "namespace eval" command. Executes
- * commands in a namespace. If the namespace does not already exist,
- * it is created. Handles the following syntax:
+ * Invoked to implement the "namespace eval" command. Executes commands
+ * in a namespace. If the namespace does not already exist, it is
+ * created. Handles the following syntax:
*
* namespace eval name arg ?arg...?
*
* If more than one arg argument is specified, the command that is
- * executed is the result of concatenating the arguments together with
- * a space between each argument.
+ * executed is the result of concatenating the arguments together with a
+ * space between each argument.
*
* Results:
- * Returns TCL_OK if the namespace is found and the commands are
- * executed successfully. Returns TCL_ERROR if anything goes wrong.
+ * Returns TCL_OK if the namespace is found and the commands are executed
+ * successfully. Returns TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns the result of the command in the interpreter's result
- * object. If anything goes wrong, this procedure returns an error
- * message as the result.
+ * Returns the result of the command in the interpreter's result object.
+ * If anything goes wrong, this function returns an error message as the
+ * result.
*
*----------------------------------------------------------------------
*/
@@ -3397,7 +3377,7 @@ NamespaceEvalCmd(dummy, interp, objc, objv)
if (namespacePtr == NULL) {
char *name = TclGetString(objv[2]);
- namespacePtr = Tcl_CreateNamespace(interp, name, (ClientData) NULL,
+ namespacePtr = Tcl_CreateNamespace(interp, name, (ClientData) NULL,
(Tcl_NamespaceDeleteProc *) NULL);
if (namespacePtr == NULL) {
return TCL_ERROR;
@@ -3411,7 +3391,7 @@ NamespaceEvalCmd(dummy, interp, objc, objv)
/* This is needed to satisfy GCC 3.3's strict aliasing rules */
framePtrPtr = &framePtr;
- result = TclPushStackFrame(interp, (Tcl_CallFrame **) framePtrPtr,
+ result = TclPushStackFrame(interp, (Tcl_CallFrame **) framePtrPtr,
namespacePtr, /*isProcCallFrame*/ 0);
if (result != TCL_OK) {
return TCL_ERROR;
@@ -3424,9 +3404,10 @@ NamespaceEvalCmd(dummy, interp, objc, objv)
} else {
/*
* More than one argument: concatenate them together with spaces
- * between, then evaluate the result. Tcl_EvalObjEx will delete
- * the object when it decrements its refcount after eval'ing it.
+ * between, then evaluate the result. Tcl_EvalObjEx will delete the
+ * object when it decrements its refcount after eval'ing it.
*/
+
objPtr = Tcl_ConcatObj(objc-3, objv+3);
result = Tcl_EvalObjEx(interp, objPtr, TCL_EVAL_DIRECT);
}
@@ -3458,7 +3439,7 @@ NamespaceEvalCmd(dummy, interp, objc, objv)
*
* NamespaceExistsCmd --
*
- * Invoked to implement the "namespace exists" command that returns
+ * Invoked to implement the "namespace exists" command that returns
* true if the given namespace currently exists, and false otherwise.
* Handles the following syntax:
*
@@ -3507,18 +3488,18 @@ NamespaceExistsCmd(dummy, interp, objc, objv)
*
* Invoked to implement the "namespace export" command that specifies
* which commands are exported from a namespace. The exported commands
- * are those that can be imported into another namespace using
- * "namespace import". Both commands defined in a namespace and
- * commands the namespace has imported can be exported by a
- * namespace. This command has the following syntax:
+ * are those that can be imported into another namespace using "namespace
+ * import". Both commands defined in a namespace and commands the
+ * namespace has imported can be exported by a namespace. This command
+ * has the following syntax:
*
* namespace export ?-clear? ?pattern pattern...?
*
- * Each pattern may contain "string match"-style pattern matching
- * special characters, but the pattern may not include any namespace
- * qualifiers: that is, the pattern must specify commands in the
- * current (exporting) namespace. The specified patterns are appended
- * onto the namespace's list of export patterns.
+ * Each pattern may contain "string match"-style pattern matching special
+ * characters, but the pattern may not include any namespace qualifiers:
+ * that is, the pattern must specify commands in the current (exporting)
+ * namespace. The specified patterns are appended onto the namespace's
+ * list of export patterns.
*
* To reset the namespace's export pattern list, specify the "-clear"
* flag.
@@ -3530,8 +3511,8 @@ NamespaceExistsCmd(dummy, interp, objc, objv)
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns a result in the interpreter's result object. If anything
- * goes wrong, the result is an error message.
+ * Returns a result in the interpreter's result object. If anything goes
+ * wrong, the result is an error message.
*
*----------------------------------------------------------------------
*/
@@ -3567,8 +3548,8 @@ NamespaceExportCmd(dummy, interp, objc, objv)
}
/*
- * If no pattern arguments are given, and "-clear" isn't specified,
- * return the namespace's current export pattern list.
+ * If no pattern arguments are given, and "-clear" isn't specified, return
+ * the namespace's current export pattern list.
*/
patternCt = (objc - firstArg);
@@ -3607,26 +3588,26 @@ NamespaceExportCmd(dummy, interp, objc, objv)
*
* NamespaceForgetCmd --
*
- * Invoked to implement the "namespace forget" command to remove
- * imported commands from a namespace. Handles the following syntax:
+ * Invoked to implement the "namespace forget" command to remove imported
+ * commands from a namespace. Handles the following syntax:
*
* namespace forget ?pattern pattern...?
*
* Each pattern is a name like "foo::*" or "a::b::x*". That is, the
- * pattern may include the special pattern matching characters
- * recognized by the "string match" command, but only in the command
- * name at the end of the qualified name; the special pattern
- * characters may not appear in a namespace name. All of the commands
- * that match that pattern are checked to see if they have an imported
- * command in the current namespace that refers to the matched
- * command. If there is an alias, it is removed.
- *
+ * pattern may include the special pattern matching characters recognized
+ * by the "string match" command, but only in the command name at the end
+ * of the qualified name; the special pattern characters may not appear
+ * in a namespace name. All of the commands that match that pattern are
+ * checked to see if they have an imported command in the current
+ * namespace that refers to the matched command. If there is an alias, it
+ * is removed.
+ *
* Results:
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Imported commands are removed from the current namespace. If
- * anything goes wrong, this procedure returns an error message in the
+ * Imported commands are removed from the current namespace. If anything
+ * goes wrong, this function returns an error message in the
* interpreter's result object.
*
*----------------------------------------------------------------------
@@ -3667,28 +3648,27 @@ NamespaceForgetCmd(dummy, interp, objc, objv)
*
* namespace import ?-force? ?pattern pattern...?
*
- * Each pattern is a namespace-qualified name like "foo::*",
- * "a::b::x*", or "bar::p". That is, the pattern may include the
- * special pattern matching characters recognized by the "string match"
- * command, but only in the command name at the end of the qualified
- * name; the special pattern characters may not appear in a namespace
- * name. All of the commands that match the pattern and which are
- * exported from their namespace are made accessible from the current
- * namespace context. This is done by creating a new "imported command"
- * in the current namespace that points to the real command in its
- * original namespace; when the imported command is called, it invokes
- * the real command.
+ * Each pattern is a namespace-qualified name like "foo::*", "a::b::x*",
+ * or "bar::p". That is, the pattern may include the special pattern
+ * matching characters recognized by the "string match" command, but only
+ * in the command name at the end of the qualified name; the special
+ * pattern characters may not appear in a namespace name. All of the
+ * commands that match the pattern and which are exported from their
+ * namespace are made accessible from the current namespace context. This
+ * is done by creating a new "imported command" in the current namespace
+ * that points to the real command in its original namespace; when the
+ * imported command is called, it invokes the real command.
*
* If an imported command conflicts with an existing command, it is
* treated as an error. But if the "-force" option is included, then
* existing commands are overwritten by the imported commands.
- *
+ *
* Results:
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
* Adds imported commands to the current namespace. If anything goes
- * wrong, this procedure returns an error message in the interpreter's
+ * wrong, this function returns an error message in the interpreter's
* result object.
*
*----------------------------------------------------------------------
@@ -3746,17 +3726,17 @@ NamespaceImportCmd(dummy, interp, objc, objv)
*
* Invoked to implement the "namespace inscope" command that executes a
* script in the context of a particular namespace. This command is not
- * expected to be used directly by programmers; calls to it are
- * generated implicitly when programs use "namespace code" commands
- * to register callback scripts. Handles the following syntax:
+ * expected to be used directly by programmers; calls to it are generated
+ * implicitly when programs use "namespace code" commands to register
+ * callback scripts. Handles the following syntax:
*
* namespace inscope name arg ?arg...?
*
* The "namespace inscope" command is much like the "namespace eval"
* command except that it has lappend semantics and the namespace must
- * already exist. It treats the first argument as a list, and appends
- * any arguments after the first onto the end as proper list elements.
- * For example,
+ * already exist. It treats the first argument as a list, and appends any
+ * arguments after the first onto the end as proper list elements. For
+ * example,
*
* namespace inscope ::foo a b c d
*
@@ -3764,12 +3744,11 @@ NamespaceImportCmd(dummy, interp, objc, objv)
*
* namespace eval ::foo [concat a [list b c d]]
*
- * This lappend semantics is important because many callback scripts
- * are actually prefixes.
+ * This lappend semantics is important because many callback scripts are
+ * actually prefixes.
*
* Results:
- * Returns TCL_OK to indicate success, or TCL_ERROR to indicate
- * failure.
+ * Returns TCL_OK to indicate success, or TCL_ERROR to indicate failure.
*
* Side effects:
* Returns a result in the Tcl interpreter's result object.
@@ -3818,8 +3797,8 @@ NamespaceInscopeCmd(dummy, interp, objc, objv)
}
/*
- * Execute the command. If there is just one argument, just treat it as
- * a script and evaluate it. Otherwise, create a list from the arguments
+ * Execute the command. If there is just one argument, just treat it as a
+ * script and evaluate it. Otherwise, create a list from the arguments
* after the first one, then concatenate the first argument and the list
* of extra arguments to form the command to evaluate.
*/
@@ -3849,6 +3828,7 @@ NamespaceInscopeCmd(dummy, interp, objc, objv)
if (result == TCL_ERROR) {
Tcl_Obj *errorLine = Tcl_NewIntObj(interp->errorLine);
Tcl_Obj *msg = Tcl_NewStringObj("\n (in namespace inscope \"", -1);
+
Tcl_IncrRefCount(errorLine);
Tcl_IncrRefCount(msg);
TclAppendLimitedToObj(msg, namespacePtr->fullName, -1, 200, "");
@@ -3887,12 +3867,12 @@ NamespaceInscopeCmd(dummy, interp, objc, objv)
* command returns the fully-qualified name of the original command in
* the first namespace, a. If "name" does not refer to an alias, its
* fully-qualified name is returned. The returned name is stored in the
- * interpreter's result object. This procedure returns TCL_OK if
+ * interpreter's result object. This function returns TCL_OK if
* successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * If anything goes wrong, this procedure returns an error message in
- * the interpreter's result object.
+ * If anything goes wrong, this function returns an error message in the
+ * interpreter's result object.
*
*----------------------------------------------------------------------
*/
@@ -3923,8 +3903,8 @@ NamespaceOriginCmd(dummy, interp, objc, objv)
if (origCommand == (Tcl_Command) NULL) {
/*
* The specified command isn't an imported command. Return the
- * command's name qualified by the full name of the namespace it
- * was defined in.
+ * command's name qualified by the full name of the namespace it was
+ * defined in.
*/
Tcl_GetCommandFullName(interp, command, resultPtr);
@@ -3950,8 +3930,8 @@ NamespaceOriginCmd(dummy, interp, objc, objv)
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns a result in the interpreter's result object. If anything
- * goes wrong, the result is an error message.
+ * Returns a result in the interpreter's result object. If anything goes
+ * wrong, the result is an error message.
*
*----------------------------------------------------------------------
*/
@@ -4000,24 +3980,24 @@ NamespaceParentCmd(dummy, interp, objc, objv)
*
* NamespacePathCmd --
*
- * Invoked to implement the "namespace path" command that reads
- * and writes the current namespace's command resolution path.
- * Has one optional argument: if present, it is a list of named
- * namespaces to set the path to, and if absent, the current path
- * should be returned. Handles the following syntax:
+ * Invoked to implement the "namespace path" command that reads and
+ * writes the current namespace's command resolution path. Has one
+ * optional argument: if present, it is a list of named namespaces to set
+ * the path to, and if absent, the current path should be returned.
+ * Handles the following syntax:
*
* namespace path ?nsList?
*
* Results:
- * Returns TCL_OK if successful, and TCL_ERROR if anything goes
- * wrong (most notably if the namespace list contains the name of
- * something other than a namespace). In the successful-exit
- * case, may set the interpreter result to the list of names of
- * the namespaces on the current namespace's path.
+ * Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong
+ * (most notably if the namespace list contains the name of something
+ * other than a namespace). In the successful-exit case, may set the
+ * interpreter result to the list of names of the namespaces on the
+ * current namespace's path.
*
* Side effects:
- * May update the namespace path (triggering a recomputing of all
- * command names that depend on the namespace for resolution).
+ * May update the namespace path (triggering a recomputing of all command
+ * names that depend on the namespace for resolution).
*
*----------------------------------------------------------------------
*/
@@ -4048,6 +4028,7 @@ NamespacePathCmd(dummy, interp, objc, objv)
/*
* Not a very fast way to compute this, but easy to get right.
*/
+
for (i=0 ; i<nsPtr->commandPathLength ; i++) {
if (nsPtr->commandPathArray[i].nsPtr != NULL) {
Tcl_AppendElement(interp,
@@ -4058,8 +4039,7 @@ NamespacePathCmd(dummy, interp, objc, objv)
}
/*
- * There is a path given, so parse it into an array of namespace
- * pointers.
+ * There is a path given, so parse it into an array of namespace pointers.
*/
if (Tcl_ListObjGetElements(interp, objv[2], &nsObjc, &nsObjv) != TCL_OK) {
@@ -4087,8 +4067,7 @@ NamespacePathCmd(dummy, interp, objc, objv)
}
/*
- * Now we have the list of valid namespaces, install it as the
- * path.
+ * Now we have the list of valid namespaces, install it as the path.
*/
SetNsPath(nsPtr, nsObjc, namespaceList);
@@ -4106,10 +4085,10 @@ NamespacePathCmd(dummy, interp, objc, objv)
*
* SetNsPath --
*
- * Sets the namespace command name resolution path to the given
- * list of namespaces. If the list is empty (of zero length) the
- * path is set to empty and the default old-style behaviour of
- * command name resolution is used.
+ * Sets the namespace command name resolution path to the given list of
+ * namespaces. If the list is empty (of zero length) the path is set to
+ * empty and the default old-style behaviour of command name resolution
+ * is used.
*
* Results:
* nothing
@@ -4165,16 +4144,16 @@ SetNsPath(nsPtr, pathLength, pathAry)
*
* UnlinkNsPath --
*
- * Delete the given namespace's command name resolution path. Only
- * call if the path is non-empty. Caller must reset the counter
- * containing the path size.
+ * Delete the given namespace's command name resolution path. Only call
+ * if the path is non-empty. Caller must reset the counter containing the
+ * path size.
*
* Results:
* nothing
*
* Side effects:
- * Deletes the array of path entries and unlinks those path entries
- * from the target namespace's list of interested namespaces.
+ * Deletes the array of path entries and unlinks those path entries from
+ * the target namespace's list of interested namespaces.
*
*----------------------------------------------------------------------
*/
@@ -4206,17 +4185,17 @@ UnlinkNsPath(nsPtr)
*
* TclInvalidateNsPath --
*
- * Invalidate the name resolution caches for all names looked up
- * in namespaces whose name path includes the given namespace.
+ * Invalidate the name resolution caches for all names looked up in
+ * namespaces whose name path includes the given namespace.
*
* Results:
* nothing
*
* Side effects:
- * Increments the command reference epoch in each namespace whose
- * path includes the given namespace. This causes any cached
- * resolved names whose root cacheing context starts at that
- * namespace to be recomputed the next time they are used.
+ * Increments the command reference epoch in each namespace whose path
+ * includes the given namespace. This causes any cached resolved names
+ * whose root cacheing context starts at that namespace to be recomputed
+ * the next time they are used.
*
*----------------------------------------------------------------------
*/
@@ -4242,11 +4221,10 @@ TclInvalidateNsPath(nsPtr)
* Invoked to implement the "namespace qualifiers" command that returns
* any leading namespace qualifiers in a string. These qualifiers are
* namespace names separated by "::"s. For example, for "::foo::p" this
- * command returns "::foo", and for "::" it returns "". This command
- * is the complement of the "namespace tail" command. Note that this
- * command does not check whether the "namespace" names are, in fact,
- * the names of currently defined namespaces. Handles the following
- * syntax:
+ * command returns "::foo", and for "::" it returns "". This command is
+ * the complement of the "namespace tail" command. Note that this command
+ * does not check whether the "namespace" names are, in fact, the names
+ * of currently defined namespaces. Handles the following syntax:
*
* namespace qualifiers string
*
@@ -4254,8 +4232,8 @@ TclInvalidateNsPath(nsPtr)
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns a result in the interpreter's result object. If anything
- * goes wrong, the result is an error message.
+ * Returns a result in the interpreter's result object. If anything goes
+ * wrong, the result is an error message.
*
*----------------------------------------------------------------------
*/
@@ -4276,8 +4254,8 @@ NamespaceQualifiersCmd(dummy, interp, objc, objv)
}
/*
- * Find the end of the string, then work backward and find
- * the start of the last "::" qualifier.
+ * Find the end of the string, then work backward and find the start of
+ * the last "::" qualifier.
*/
name = TclGetString(objv[2]);
@@ -4307,13 +4285,13 @@ NamespaceQualifiersCmd(dummy, interp, objc, objv)
* NamespaceTailCmd --
*
* Invoked to implement the "namespace tail" command that returns the
- * trailing name at the end of a string with "::" namespace
- * qualifiers. These qualifiers are namespace names separated by
- * "::"s. For example, for "::foo::p" this command returns "p", and for
- * "::" it returns "". This command is the complement of the "namespace
- * qualifiers" command. Note that this command does not check whether
- * the "namespace" names are, in fact, the names of currently defined
- * namespaces. Handles the following syntax:
+ * trailing name at the end of a string with "::" namespace qualifiers.
+ * These qualifiers are namespace names separated by "::"s. For example,
+ * for "::foo::p" this command returns "p", and for "::" it returns
+ * "". This command is the complement of the "namespace qualifiers"
+ * command. Note that this command does not check whether the "namespace"
+ * names are, in fact, the names of currently defined namespaces. Handles
+ * the following syntax:
*
* namespace tail string
*
@@ -4321,8 +4299,8 @@ NamespaceQualifiersCmd(dummy, interp, objc, objv)
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns a result in the interpreter's result object. If anything
- * goes wrong, the result is an error message.
+ * Returns a result in the interpreter's result object. If anything goes
+ * wrong, the result is an error message.
*
*----------------------------------------------------------------------
*/
@@ -4342,8 +4320,8 @@ NamespaceTailCmd(dummy, interp, objc, objv)
}
/*
- * Find the end of the string, then work backward and find the
- * last "::" qualifier.
+ * Find the end of the string, then work backward and find the last "::"
+ * qualifier.
*/
name = TclGetString(objv[2]);
@@ -4379,8 +4357,8 @@ NamespaceTailCmd(dummy, interp, objc, objv)
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Returns a result in the interpreter's result object. If anything
- * goes wrong, the result is an error message.
+ * Returns a result in the interpreter's result object. If anything goes
+ * wrong, the result is an error message.
*
*----------------------------------------------------------------------
*/
@@ -4421,7 +4399,7 @@ NamespaceWhichCmd(dummy, interp, objc, objv)
switch (lookupType) {
case 0: { /* -command */
Tcl_Command cmd = Tcl_GetCommandFromObj(interp, objv[objc-1]);
- if (cmd != (Tcl_Command) NULL) {
+ if (cmd != (Tcl_Command) NULL) {
Tcl_GetCommandFullName(interp, cmd, resultPtr);
}
break;
@@ -4451,9 +4429,9 @@ NamespaceWhichCmd(dummy, interp, objc, objv)
* None.
*
* Side effects:
- * Decrements the ref count of any Namespace structure pointed
- * to by the nsName's internal representation. If there are no more
- * references to the namespace, it's structure will be freed.
+ * Decrements the ref count of any Namespace structure pointed to by the
+ * nsName's internal representation. If there are no more references to
+ * the namespace, it's structure will be freed.
*
*----------------------------------------------------------------------
*/
@@ -4468,8 +4446,8 @@ FreeNsNameInternalRep(objPtr)
Namespace *nsPtr;
/*
- * Decrement the reference count of the namespace. If there are no
- * more references, free it up.
+ * Decrement the reference count of the namespace. If there are no more
+ * references, free it up.
*/
if (resNamePtr != NULL) {
@@ -4477,9 +4455,9 @@ FreeNsNameInternalRep(objPtr)
if (resNamePtr->refCount == 0) {
/*
- * Decrement the reference count for the cached namespace. If
- * the namespace is dead, and there are no more references to
- * it, free it.
+ * Decrement the reference count for the cached namespace. If the
+ * namespace is dead, and there are no more references to it, free
+ * it.
*/
nsPtr = resNamePtr->nsPtr;
@@ -4505,8 +4483,8 @@ FreeNsNameInternalRep(objPtr)
*
* Side effects:
* copyPtr's internal rep is set to refer to the same namespace
- * referenced by srcPtr's internal rep. Increments the ref count of
- * the ResolvedNsName structure used to hold the namespace reference.
+ * referenced by srcPtr's internal rep. Increments the ref count of the
+ * ResolvedNsName structure used to hold the namespace reference.
*
*----------------------------------------------------------------------
*/
@@ -4531,29 +4509,28 @@ DupNsNameInternalRep(srcPtr, copyPtr)
*
* SetNsNameFromAny --
*
- * Attempt to generate a nsName internal representation for a
- * Tcl object.
+ * Attempt to generate a nsName internal representation for a Tcl object.
*
* Results:
- * Returns TCL_OK if the value could be converted to a proper
- * namespace reference. Otherwise, it returns TCL_ERROR, along
- * with an error message in the interpreter's result object.
+ * Returns TCL_OK if the value could be converted to a proper namespace
+ * reference. Otherwise, it returns TCL_ERROR, along with an error
+ * message in the interpreter's result object.
*
* Side effects:
- * If successful, the object is made a nsName object. Its internal rep
- * is set to point to a ResolvedNsName, which contains a cached pointer
- * to the Namespace. Reference counts are kept on both the
- * ResolvedNsName and the Namespace, so we can keep track of their
- * usage and free them when appropriate.
+ * If successful, the object is made a nsName object. Its internal rep is
+ * set to point to a ResolvedNsName, which contains a cached pointer to
+ * the Namespace. Reference counts are kept on both the ResolvedNsName
+ * and the Namespace, so we can keep track of their usage and free them
+ * when appropriate.
*
*----------------------------------------------------------------------
*/
static int
SetNsNameFromAny(interp, objPtr)
- Tcl_Interp *interp; /* Points to the namespace in which to
- * resolve name. Also used for error
- * reporting if not NULL. */
+ Tcl_Interp *interp; /* Points to the namespace in which to resolve
+ * name. Also used for error reporting if not
+ * NULL. */
register Tcl_Obj *objPtr; /* The object to convert. */
{
char *name;
@@ -4571,10 +4548,10 @@ SetNsNameFromAny(interp, objPtr)
}
/*
- * Look for the namespace "name" in the current namespace. If there is
- * an error parsing the (possibly qualified) name, return an error.
- * If the namespace isn't found, we convert the object to an nsName
- * object with a NULL ResolvedNsName* internal rep.
+ * Look for the namespace "name" in the current namespace. If there is an
+ * error parsing the (possibly qualified) name, return an error. If the
+ * namespace isn't found, we convert the object to an nsName object with a
+ * NULL ResolvedNsName* internal rep.
*/
TclGetNamespaceForQualName(interp, name, (Namespace *) NULL,
@@ -4600,9 +4577,9 @@ SetNsNameFromAny(interp, objPtr)
}
/*
- * Free the old internalRep before setting the new one.
- * We do this as late as possible to allow the conversion code
- * (in particular, Tcl_GetStringFromObj) to use that old internalRep.
+ * Free the old internalRep before setting the new one. We do this as
+ * late as possible to allow the conversion code (in particular,
+ * Tcl_GetStringFromObj) to use that old internalRep.
*/
TclFreeIntRep(objPtr);
@@ -4616,16 +4593,16 @@ SetNsNameFromAny(interp, objPtr)
*
* UpdateStringOfNsName --
*
- * Updates the string representation for a nsName object.
- * Note: This procedure does not free an existing old string rep
- * so storage will be lost if this has not already been done.
+ * Updates the string representation for a nsName object. Note: This
+ * function does not free an existing old string rep so storage will be
+ * lost if this has not already been done.
*
* Results:
* None.
*
* Side effects:
- * The object's string is set to a copy of the fully qualified
- * namespace name.
+ * The object's string is set to a copy of the fully qualified namespace
+ * name.
*
*----------------------------------------------------------------------
*/
@@ -4652,8 +4629,8 @@ UpdateStringOfNsName(objPtr)
}
/*
- * The following sets the string rep to an empty string on the heap
- * if the internal rep is NULL.
+ * The following sets the string rep to an empty string on the heap if the
+ * internal rep is NULL.
*/
length = strlen(name);
@@ -4672,9 +4649,9 @@ UpdateStringOfNsName(objPtr)
*
* NamespaceEnsembleCmd --
*
- * Invoked to implement the "namespace ensemble" command that
- * creates and manipulates ensembles built on top of namespaces.
- * Handles the following syntax:
+ * Invoked to implement the "namespace ensemble" command that creates and
+ * manipulates ensembles built on top of namespaces. Handles the
+ * following syntax:
*
* namespace ensemble name ?dictionary?
*
@@ -4682,9 +4659,9 @@ UpdateStringOfNsName(objPtr)
* Returns TCL_OK if successful, and TCL_ERROR if anything goes wrong.
*
* Side effects:
- * Creates the ensemble for the namespace if one did not
- * previously exist. Alternatively, alters the way that the
- * ensemble's subcommand => implementation prefix is configured.
+ * Creates the ensemble for the namespace if one did not previously
+ * exist. Alternatively, alters the way that the ensemble's subcommand
+ * => implementation prefix is configured.
*
*----------------------------------------------------------------------
*/
@@ -4754,19 +4731,18 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
objc -= 3;
/*
- * Work out what name to use for the command to create. If
- * supplied, it is either fully specified or relative to the
- * current namespace. If not supplied, it is exactly the name
- * of the current namespace.
+ * Work out what name to use for the command to create. If supplied,
+ * it is either fully specified or relative to the current namespace.
+ * If not supplied, it is exactly the name of the current namespace.
*/
name = nsPtr->fullName;
/*
- * Parse the option list, applying type checks as we go. Note
- * that we are not incrementing any reference counts in the
- * objects at this stage, so the presence of an option
- * multiple times won't cause any memory leaks.
+ * Parse the option list, applying type checks as we go. Note that we
+ * are not incrementing any reference counts in the objects at this
+ * stage, so the presence of an option multiple times won't cause any
+ * memory leaks.
*/
for (; objc>1 ; objc-=2,objv+=2 ) {
@@ -4792,9 +4768,11 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
continue;
case CRT_MAP: {
Tcl_Obj *patchedDict = NULL, *subcmdObj;
+
/*
* Verify that the map is sensible.
*/
+
if (Tcl_DictObjFirst(interp, objv[1], &search,
&subcmdObj, &listObj, &done) != TCL_OK) {
if (allocatedMapFlag) {
@@ -4837,8 +4815,8 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
cmd = TclGetString(listv[0]);
if (!(cmd[0] == ':' && cmd[1] == ':')) {
Tcl_Obj *newList = Tcl_NewListObj(len, listv);
- Tcl_Obj *newCmd =
- Tcl_NewStringObj(nsPtr->fullName, -1);
+ Tcl_Obj *newCmd = Tcl_NewStringObj(nsPtr->fullName,-1);
+
if (nsPtr->parentPtr) {
Tcl_AppendStringsToObj(newCmd, "::", NULL);
}
@@ -4851,6 +4829,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
}
Tcl_DictObjNext(&search, &subcmdObj, &listObj, &done);
} while (!done);
+
if (allocatedMapFlag) {
Tcl_DecrRefCount(mapObj);
}
@@ -4882,11 +4861,10 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
}
/*
- * Create the ensemble. Note that this might delete another
- * ensemble linked to the same namespace, so we must be
- * careful. However, we should be OK because we only link the
- * namespace into the list once we've created it (and after
- * any deletions have occurred.)
+ * Create the ensemble. Note that this might delete another ensemble
+ * linked to the same namespace, so we must be careful. However, we
+ * should be OK because we only link the namespace into the list once
+ * we've created it (and after any deletions have occurred.)
*/
token = Tcl_CreateEnsemble(interp, name, NULL,
@@ -4976,6 +4954,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
int flags;
TclNewObj(resultObj);
+
/* -map option */
Tcl_ListObjAppendElement(NULL, resultObj,
Tcl_NewStringObj(configOptions[CONF_MAP], -1));
@@ -4985,6 +4964,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
} else {
Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewObj());
}
+
/* -namespace option */
Tcl_ListObjAppendElement(NULL, resultObj,
Tcl_NewStringObj(configOptions[CONF_NAMESPACE], -1));
@@ -4992,12 +4972,14 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
Tcl_ListObjAppendElement(NULL, resultObj,
Tcl_NewStringObj(((Namespace *)namespacePtr)->fullName,
-1));
+
/* -prefix option */
Tcl_ListObjAppendElement(NULL, resultObj,
Tcl_NewStringObj(configOptions[CONF_PREFIX], -1));
Tcl_GetEnsembleFlags(NULL, token, &flags);
Tcl_ListObjAppendElement(NULL, resultObj,
Tcl_NewBooleanObj(flags & TCL_ENSEMBLE_PREFIX));
+
/* -subcommands option */
Tcl_ListObjAppendElement(NULL, resultObj,
Tcl_NewStringObj(configOptions[CONF_SUBCMDS], -1));
@@ -5007,6 +4989,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
} else {
Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewObj());
}
+
/* -unknown option */
Tcl_ListObjAppendElement(NULL, resultObj,
Tcl_NewStringObj(configOptions[CONF_UNKNOWN], -1));
@@ -5016,9 +4999,9 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
} else {
Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewObj());
}
+
Tcl_SetObjResult(interp, resultObj);
return TCL_OK;
-
} else {
Tcl_DictSearch search;
Tcl_Obj *listObj;
@@ -5039,10 +5022,10 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
objc -= 4;
/*
- * Parse the option list, applying type checks as we go.
- * Note that we are not incrementing any reference counts
- * in the objects at this stage, so the presence of an
- * option multiple times won't cause any memory leaks.
+ * Parse the option list, applying type checks as we go. Note
+ * that we are not incrementing any reference counts in the
+ * objects at this stage, so the presence of an option multiple
+ * times won't cause any memory leaks.
*/
for (; objc>0 ; objc-=2,objv+=2 ) {
@@ -5163,8 +5146,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
}
/*
- * Update the namespace now that we've finished the
- * parsing stage.
+ * Update the namespace now that we've finished the parsing stage.
*/
flags = (permitPrefix ? flags|TCL_ENSEMBLE_PREFIX
@@ -5215,8 +5197,8 @@ Tcl_CreateEnsemble(interp, name, namespacePtr, flags)
}
/*
- * Make the name of the ensemble into a fully qualified name.
- * This might allocate a temporary object.
+ * Make the name of the ensemble into a fully qualified name. This might
+ * allocate a temporary object.
*/
if (!(name[0] == ':' && name[1] == ':')) {
@@ -5243,12 +5225,14 @@ Tcl_CreateEnsemble(interp, name, namespacePtr, flags)
DeleteEnsembleConfig);
ensemblePtr->next = (EnsembleConfig *) nsPtr->ensembles;
nsPtr->ensembles = (Tcl_Ensemble *) ensemblePtr;
+
/*
- * Trigger an eventual recomputation of the ensemble command
- * set. Note that this is slightly tricky, as it means that
- * we are not actually counting the number of namespace export
- * actions, but it is the simplest way to go!
+ * Trigger an eventual recomputation of the ensemble command set. Note
+ * that this is slightly tricky, as it means that we are not actually
+ * counting the number of namespace export actions, but it is the simplest
+ * way to go!
*/
+
nsPtr->exportLookupEpoch++;
if (nameObj != NULL) {
@@ -5265,8 +5249,8 @@ Tcl_CreateEnsemble(interp, name, namespacePtr, flags)
* Set the subcommand list for a particular ensemble.
*
* Results:
- * Tcl result code (error if command token does not indicate an
- * ensemble or the subcommand list - if non-NULL - is not a list).
+ * Tcl result code (error if command token does not indicate an ensemble
+ * or the subcommand list - if non-NULL - is not a list).
*
* Side effects:
* The ensemble is updated and marked for recompilation.
@@ -5311,11 +5295,12 @@ Tcl_SetEnsembleSubcommandList(interp, token, subcmdList)
}
/*
- * Trigger an eventual recomputation of the ensemble command
- * set. Note that this is slightly tricky, as it means that
- * we are not actually counting the number of namespace export
- * actions, but it is the simplest way to go!
+ * Trigger an eventual recomputation of the ensemble command set. Note
+ * that this is slightly tricky, as it means that we are not actually
+ * counting the number of namespace export actions, but it is the simplest
+ * way to go!
*/
+
ensemblePtr->nsPtr->exportLookupEpoch++;
return TCL_OK;
@@ -5329,8 +5314,8 @@ Tcl_SetEnsembleSubcommandList(interp, token, subcmdList)
* Set the mapping dictionary for a particular ensemble.
*
* Results:
- * Tcl result code (error if command token does not indicate an
- * ensemble or the mapping - if non-NULL - is not a dict).
+ * Tcl result code (error if command token does not indicate an ensemble
+ * or the mapping - if non-NULL - is not a dict).
*
* Side effects:
* The ensemble is updated and marked for recompilation.
@@ -5375,11 +5360,12 @@ Tcl_SetEnsembleMappingDict(interp, token, mapDict)
}
/*
- * Trigger an eventual recomputation of the ensemble command
- * set. Note that this is slightly tricky, as it means that
- * we are not actually counting the number of namespace export
- * actions, but it is the simplest way to go!
+ * Trigger an eventual recomputation of the ensemble command set. Note
+ * that this is slightly tricky, as it means that we are not actually
+ * counting the number of namespace export actions, but it is the simplest
+ * way to go!
*/
+
ensemblePtr->nsPtr->exportLookupEpoch++;
return TCL_OK;
@@ -5393,8 +5379,8 @@ Tcl_SetEnsembleMappingDict(interp, token, mapDict)
* Set the unknown handler for a particular ensemble.
*
* Results:
- * Tcl result code (error if command token does not indicate an
- * ensemble or the unknown handler - if non-NULL - is not a list).
+ * Tcl result code (error if command token does not indicate an ensemble
+ * or the unknown handler - if non-NULL - is not a list).
*
* Side effects:
* The ensemble is updated and marked for recompilation.
@@ -5440,11 +5426,12 @@ Tcl_SetEnsembleUnknownHandler(interp, token, unknownList)
}
/*
- * Trigger an eventual recomputation of the ensemble command
- * set. Note that this is slightly tricky, as it means that
- * we are not actually counting the number of namespace export
- * actions, but it is the simplest way to go!
+ * Trigger an eventual recomputation of the ensemble command set. Note
+ * that this is slightly tricky, as it means that we are not actually
+ * counting the number of namespace export actions, but it is the simplest
+ * way to go!
*/
+
ensemblePtr->nsPtr->exportLookupEpoch++;
return TCL_OK;
@@ -5491,11 +5478,12 @@ Tcl_SetEnsembleFlags(interp, token, flags)
ensemblePtr->flags |= flags & ~ENS_DEAD;
/*
- * Trigger an eventual recomputation of the ensemble command
- * set. Note that this is slightly tricky, as it means that
- * we are not actually counting the number of namespace export
- * actions, but it is the simplest way to go!
+ * Trigger an eventual recomputation of the ensemble command set. Note
+ * that this is slightly tricky, as it means that we are not actually
+ * counting the number of namespace export actions, but it is the simplest
+ * way to go!
*/
+
ensemblePtr->nsPtr->exportLookupEpoch++;
return TCL_OK;
@@ -5511,9 +5499,9 @@ Tcl_SetEnsembleFlags(interp, token, flags)
* Results:
* Tcl result code (error if command token does not indicate an
* ensemble). The list of subcommands is returned by updating the
- * variable pointed to by the last parameter (NULL if this is to
- * be derived from the mapping dictionary or the associated
- * namespace's exported commands).
+ * variable pointed to by the last parameter (NULL if this is to be
+ * derived from the mapping dictionary or the associated namespace's
+ * exported commands).
*
* Side effects:
* None
@@ -5547,14 +5535,13 @@ Tcl_GetEnsembleSubcommandList(interp, token, subcmdListPtr)
*
* Tcl_GetEnsembleMappingDict --
*
- * Get the command mapping dictionary associated with a
- * particular ensemble.
+ * Get the command mapping dictionary associated with a particular
+ * ensemble.
*
* Results:
* Tcl result code (error if command token does not indicate an
- * ensemble). The mapping dict is returned by updating the
- * variable pointed to by the last parameter (NULL if none is
- * installed).
+ * ensemble). The mapping dict is returned by updating the variable
+ * pointed to by the last parameter (NULL if none is installed).
*
* Side effects:
* None
@@ -5592,9 +5579,8 @@ Tcl_GetEnsembleMappingDict(interp, token, mapDictPtr)
*
* Results:
* Tcl result code (error if command token does not indicate an
- * ensemble). The unknown handler is returned by updating the
- * variable pointed to by the last parameter (NULL if no handler
- * is installed).
+ * ensemble). The unknown handler is returned by updating the variable
+ * pointed to by the last parameter (NULL if no handler is installed).
*
* Side effects:
* None
@@ -5632,8 +5618,8 @@ Tcl_GetEnsembleUnknownHandler(interp, token, unknownListPtr)
*
* Results:
* Tcl result code (error if command token does not indicate an
- * ensemble). The flags are returned by updating the variable
- * pointed to by the last parameter.
+ * ensemble). The flags are returned by updating the variable pointed to
+ * by the last parameter.
*
* Side effects:
* None
@@ -5671,8 +5657,8 @@ Tcl_GetEnsembleFlags(interp, token, flagsPtr)
*
* Results:
* Tcl result code (error if command token does not indicate an
- * ensemble). Namespace is returned by updating the variable
- * pointed to by the last parameter.
+ * ensemble). Namespace is returned by updating the variable pointed to
+ * by the last parameter.
*
* Side effects:
* None
@@ -5706,14 +5692,13 @@ Tcl_GetEnsembleNamespace(interp, token, namespacePtrPtr)
*
* Tcl_FindEnsemble --
*
- * Given a command name, get the ensemble token for it, allowing
- * for [namespace import]s. [Bug 1017022]
+ * Given a command name, get the ensemble token for it, allowing for
+ * [namespace import]s. [Bug 1017022]
*
* Results:
- * The token for the ensemble command with the given name, or
- * NULL if the command either does not exist or is not an
- * ensemble (when an error message will be written into the
- * interp if thats non-NULL).
+ * The token for the ensemble command with the given name, or NULL if the
+ * command either does not exist or is not an ensemble (when an error
+ * message will be written into the interp if thats non-NULL).
*
* Side effects:
* None
@@ -5728,8 +5713,9 @@ Tcl_FindEnsemble(interp, cmdNameObj, flags)
* TCL_LEAVE_ERR_MSG is set in the
* flags. */
Tcl_Obj *cmdNameObj; /* Name of command to look up. */
- int flags; /* Either 0 or TCL_LEAVE_ERR_MSG; other
- * flags are probably not useful. */
+ int flags; /* Either 0 or TCL_LEAVE_ERR_MSG;
+ * other flags are probably not
+ * useful. */
{
Command *cmdPtr;
@@ -5740,9 +5726,10 @@ Tcl_FindEnsemble(interp, cmdNameObj, flags)
}
if (cmdPtr->objProc != NsEnsembleImplementationCmd) {
/*
- * Reuse existing infrastructure for following import link
- * chains rather than duplicating it.
+ * Reuse existing infrastructure for following import link chains
+ * rather than duplicating it.
*/
+
cmdPtr = (Command *) TclGetOriginalCommand((Tcl_Command) cmdPtr);
if (cmdPtr == NULL || cmdPtr->objProc != NsEnsembleImplementationCmd) {
@@ -5794,18 +5781,18 @@ Tcl_IsEnsemble(token)
* NsEnsembleImplementationCmd --
*
* Implements an ensemble of commands (being those exported by a
- * namespace other than the global namespace) as a command with
- * the same (short) name as the namespace in the parent namespace.
+ * namespace other than the global namespace) as a command with the same
+ * (short) name as the namespace in the parent namespace.
*
* Results:
- * A standard Tcl result code. Will be TCL_ERROR if the command
- * is not an unambiguous prefix of any command exported by the
- * ensemble's namespace.
+ * A standard Tcl result code. Will be TCL_ERROR if the command is not
+ * an unambiguous prefix of any command exported by the ensemble's
+ * namespace.
*
* Side effects:
- * Depends on the command within the namespace that gets executed.
- * If the ensemble itself returns TCL_ERROR, a descriptive error
- * message will be placed in the interpreter's result.
+ * Depends on the command within the namespace that gets executed. If
+ * the ensemble itself returns TCL_ERROR, a descriptive error message
+ * will be placed in the interpreter's result.
*
*----------------------------------------------------------------------
*/
@@ -5826,13 +5813,13 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
int result; /* The result of the subcommand
* execution. */
Tcl_Obj *prefixObj; /* An object containing the prefix
- * words of the command that implements
- * the subcommand. */
+ * words of the command that
+ * implements the subcommand. */
Tcl_HashEntry *hPtr; /* Used for efficient lookup of fully
- * specified but not yet cached command
- * names. */
- Tcl_Obj **prefixObjv; /* The list of objects to substitute in
- * as the target command prefix. */
+ * specified but not yet cached
+ * command names. */
+ Tcl_Obj **prefixObjv; /* The list of objects to substitute
+ * in as the target command prefix. */
int prefixObjc; /* Size of prefixObjv of course! */
int reparseCount = 0; /* Number of reparses. */
@@ -5846,6 +5833,7 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
/*
* Don't know how we got here, but make things give up quickly.
*/
+
if (!Tcl_InterpDeleted(interp)) {
Tcl_AppendResult(interp,
"ensemble activated for deleted namespace", NULL);
@@ -5858,11 +5846,10 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
BuildEnsembleConfig(ensemblePtr);
} else {
/*
- * Table of subcommands is still valid; therefore there might
- * be a valid cache of discovered information which we can
- * reuse. Do the check here, and if we're still valid, we can
- * jump straight to the part where we do the invocation of the
- * subcommand.
+ * Table of subcommands is still valid; therefore there might be a
+ * valid cache of discovered information which we can reuse. Do the
+ * check here, and if we're still valid, we can jump straight to the
+ * part where we do the invocation of the subcommand.
*/
if (objv[1]->typePtr == &ensembleCmdType) {
@@ -5879,8 +5866,8 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
}
/*
- * Look in the hashtable for the subcommand name; this is the
- * fastest way of all.
+ * Look in the hashtable for the subcommand name; this is the fastest way
+ * of all.
*/
hPtr = Tcl_FindHashEntry(&ensemblePtr->subcommandTable,
@@ -5901,9 +5888,9 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
goto unknownOrAmbiguousSubcommand;
} else {
/*
- * If we've not already confirmed the command with the hash as
- * part of building our export table, we need to scan the
- * sorted array for matches.
+ * If we've not already confirmed the command with the hash as part of
+ * building our export table, we need to scan the sorted array for
+ * matches.
*/
char *subcmdName; /* Name of the subcommand, or unique
@@ -5918,24 +5905,23 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
for (i=0 ; i<tableLength ; i++) {
register int cmp = strncmp(subcmdName,
ensemblePtr->subcommandArrayPtr[i],
- (unsigned)stringLength);
+ (unsigned) stringLength);
if (cmp == 0) {
if (fullName != NULL) {
/*
- * Since there's never the exact-match case to
- * worry about (hash search filters this), getting
- * here indicates that our subcommand is an
- * ambiguous prefix of (at least) two exported
- * subcommands, which is an error case.
+ * Since there's never the exact-match case to worry about
+ * (hash search filters this), getting here indicates that
+ * our subcommand is an ambiguous prefix of (at least) two
+ * exported subcommands, which is an error case.
*/
goto unknownOrAmbiguousSubcommand;
}
fullName = ensemblePtr->subcommandArrayPtr[i];
} else if (cmp < 0) {
/*
- * Because we are searching a sorted table, we can now
- * stop searching because we have gone past anything
- * that could possibly match.
+ * Because we are searching a sorted table, we can now stop
+ * searching because we have gone past anything that could
+ * possibly match.
*/
break;
}
@@ -5961,14 +5947,13 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
}
/*
- * Do the real work of execution of the subcommand by building an
- * array of objects (note that this is potentially not the same
- * length as the number of arguments to this ensemble command),
- * populating it and then feeding it back through the main
- * command-lookup engine. In theory, we could look up the command
- * in the namespace ourselves, as we already have the namespace in
- * which it is guaranteed to exist, but we don't do that (the
- * cacheing of the command object used should help with that.)
+ * Do the real work of execution of the subcommand by building an array of
+ * objects (note that this is potentially not the same length as the
+ * number of arguments to this ensemble command), populating it and then
+ * feeding it back through the main command-lookup engine. In theory, we
+ * could look up the command in the namespace ourselves, as we already
+ * have the namespace in which it is guaranteed to exist, but we don't do
+ * that (the cacheing of the command object used should help with that.)
*/
Tcl_IncrRefCount(prefixObj);
@@ -6008,10 +5993,10 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
unknownOrAmbiguousSubcommand:
/*
- * Have not been able to match the subcommand asked for with a
- * real subcommand that we export. See whether a handler has been
- * registered for dealing with this situation. Will only call (at
- * most) once for any particular ensemble invocation.
+ * Have not been able to match the subcommand asked for with a real
+ * subcommand that we export. See whether a handler has been registered
+ * for dealing with this situation. Will only call (at most) once for any
+ * particular ensemble invocation.
*/
if (ensemblePtr->unknownHandler != NULL && reparseCount++ < 1) {
@@ -6044,9 +6029,9 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
}
/*
- * Namespace is still there. Check if the result is a
- * valid list. If it is, and it is non-empty, that list
- * is what we are using as our replacement.
+ * Namespace is still there. Check if the result is a valid list.
+ * If it is, and it is non-empty, that list is what we are using
+ * as our replacement.
*/
if (Tcl_ListObjLength(interp, prefixObj, &prefixObjc) != TCL_OK) {
@@ -6103,9 +6088,9 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
/*
* Cannot determine what subcommand to hand off to, so generate a
- * (standard) failure message. Note the one odd case compared
- * with standard ensemble-like command, which is where a namespace
- * has no exported commands at all...
+ * (standard) failure message. Note the one odd case compared with
+ * standard ensemble-like command, which is where a namespace has no
+ * exported commands at all...
*/
Tcl_ResetResult(interp);
@@ -6137,11 +6122,10 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
*
* MakeCachedEnsembleCommand --
*
- * Cache what we've computed so far; it's not nice to repeatedly
- * copy strings about. Note that to do this, we start by
- * deleting any old representation that there was (though if it
- * was an out of date ensemble rep, we can skip some of the
- * deallocation process.)
+ * Cache what we've computed so far; it's not nice to repeatedly copy
+ * strings about. Note that to do this, we start by deleting any old
+ * representation that there was (though if it was an out of date
+ * ensemble rep, we can skip some of the deallocation process.)
*
* Results:
* None
@@ -6172,8 +6156,8 @@ MakeCachedEnsembleCommand(objPtr, ensemblePtr, subcommandName, prefixObjPtr)
ckfree(ensembleCmd->fullSubcmdName);
} else {
/*
- * Kill the old internal rep, and replace it with a brand new
- * one of our own.
+ * Kill the old internal rep, and replace it with a brand new one of
+ * our own.
*/
TclFreeIntRep(objPtr);
ensembleCmd = (EnsembleCmdRep *) ckalloc(sizeof(EnsembleCmdRep));
@@ -6184,6 +6168,7 @@ MakeCachedEnsembleCommand(objPtr, ensemblePtr, subcommandName, prefixObjPtr)
/*
* Populate the internal rep.
*/
+
ensembleCmd->nsPtr = ensemblePtr->nsPtr;
ensembleCmd->epoch = ensemblePtr->epoch;
ensembleCmd->token = ensemblePtr->token;
@@ -6200,11 +6185,11 @@ MakeCachedEnsembleCommand(objPtr, ensemblePtr, subcommandName, prefixObjPtr)
*
* DeleteEnsembleConfig --
*
- * Destroys the data structure used to represent an ensemble.
- * This is called when the ensemble's command is deleted (which
- * happens automatically if the ensemble's namespace is deleted.)
- * Maintainers should note that ensembles should be deleted by
- * deleting their commands.
+ * Destroys the data structure used to represent an ensemble. This is
+ * called when the ensemble's command is deleted (which happens
+ * automatically if the ensemble's namespace is deleted.) Maintainers
+ * should note that ensembles should be deleted by deleting their
+ * commands.
*
* Results:
* None.
@@ -6225,8 +6210,8 @@ DeleteEnsembleConfig(clientData)
Tcl_HashEntry *hEnt;
/*
- * Unlink from the ensemble chain if it has not been marked as
- * having been done already.
+ * Unlink from the ensemble chain if it has not been marked as having been
+ * done already.
*/
if (ensemblePtr->next != ensemblePtr) {
@@ -6245,8 +6230,8 @@ DeleteEnsembleConfig(clientData)
}
/*
- * Mark the namespace as dead so code that uses Tcl_Preserve() can
- * tell whether disaster happened anyway.
+ * Mark the namespace as dead so code that uses Tcl_Preserve() can tell
+ * whether disaster happened anyway.
*/
ensemblePtr->flags |= ENS_DEAD;
@@ -6276,10 +6261,10 @@ DeleteEnsembleConfig(clientData)
}
/*
- * Arrange for the structure to be reclaimed. Note that this is
- * complex because we have to make sure that we can react sensibly
- * when an ensemble is deleted during the process of initialising
- * the ensemble (especially the unknown callback.)
+ * Arrange for the structure to be reclaimed. Note that this is complex
+ * because we have to make sure that we can react sensibly when an
+ * ensemble is deleted during the process of initialising the ensemble
+ * (especially the unknown callback.)
*/
Tcl_EventuallyFree((ClientData) ensemblePtr, TCL_DYNAMIC);
@@ -6290,19 +6275,19 @@ DeleteEnsembleConfig(clientData)
*
* BuildEnsembleConfig --
*
- * Create the internal data structures that describe how an
- * ensemble looks, being a hash mapping from the full command
- * name to the Tcl list that describes the implementation prefix
- * words, and a sorted array of all the full command names to
- * allow for reasonably efficient unambiguous prefix handling.
+ * Create the internal data structures that describe how an ensemble
+ * looks, being a hash mapping from the full command name to the Tcl list
+ * that describes the implementation prefix words, and a sorted array of
+ * all the full command names to allow for reasonably efficient
+ * unambiguous prefix handling.
*
* Results:
* None.
*
* Side effects:
- * Reallocates and rebuilds the hash table and array stored at
- * the ensemblePtr argument. For large ensembles or large
- * namespaces, this is a potentially expensive operation.
+ * Reallocates and rebuilds the hash table and array stored at the
+ * ensemblePtr argument. For large ensembles or large namespaces, this
+ * is a potentially expensive operation.
*
*----------------------------------------------------------------------
*/
@@ -6336,10 +6321,9 @@ BuildEnsembleConfig(ensemblePtr)
}
/*
- * See if we've got an export list. If so, we will only export
- * exactly those commands, which may be either implemented by the
- * prefix in the subcommandDict or mapped directly onto the
- * namespace's commands.
+ * See if we've got an export list. If so, we will only export exactly
+ * those commands, which may be either implemented by the prefix in the
+ * subcommandDict or mapped directly onto the namespace's commands.
*/
if (ensemblePtr->subcmdList != NULL) {
@@ -6357,9 +6341,11 @@ BuildEnsembleConfig(ensemblePtr)
if (!isNew) {
continue;
}
+
/*
* Look in our dictionary (if present) for the command.
*/
+
if (ensemblePtr->subcommandDict != NULL) {
Tcl_DictObjGet(NULL, ensemblePtr->subcommandDict, subcmdv[i],
&target);
@@ -6369,12 +6355,13 @@ BuildEnsembleConfig(ensemblePtr)
continue;
}
}
+
/*
- * Not there, so map onto the namespace. Note in this
- * case that we do not guarantee that the command is
- * actually there; that is the programmer's responsibility
- * (or [::unknown] of course).
+ * Not there, so map onto the namespace. Note in this case that
+ * we do not guarantee that the command is actually there; that is
+ * the programmer's responsibility (or [::unknown] of course).
*/
+
cmdObj = Tcl_NewStringObj(ensemblePtr->nsPtr->fullName, -1);
if (ensemblePtr->nsPtr->parentPtr != NULL) {
Tcl_AppendStringsToObj(cmdObj, "::", name, NULL);
@@ -6387,11 +6374,11 @@ BuildEnsembleConfig(ensemblePtr)
}
} else if (ensemblePtr->subcommandDict != NULL) {
/*
- * No subcmd list, but we do have a mapping dictionary so we
- * should use the keys of that. Convert the dictionary's
- * contents into the form required for the ensemble's internal
- * hashtable.
+ * No subcmd list, but we do have a mapping dictionary so we should
+ * use the keys of that. Convert the dictionary's contents into the
+ * form required for the ensemble's internal hashtable.
*/
+
Tcl_DictSearch dictSearch;
Tcl_Obj *keyObj, *valueObj;
int done;
@@ -6400,6 +6387,7 @@ BuildEnsembleConfig(ensemblePtr)
&keyObj, &valueObj, &done);
while (!done) {
char *name = TclGetString(keyObj);
+
hPtr = Tcl_CreateHashEntry(hash, name, &isNew);
Tcl_SetHashValue(hPtr, (ClientData) valueObj);
Tcl_IncrRefCount(valueObj);
@@ -6407,19 +6395,18 @@ BuildEnsembleConfig(ensemblePtr)
}
} else {
/*
- * Discover what commands are actually exported by the
- * namespace. What we have is an array of patterns and a hash
- * table whose keys are the command names exported by the
- * namespace (the contents do not matter here.) We must find
- * out what commands are actually exported by filtering each
- * command in the namespace against each of the patterns in
- * the export list. Note that we use an intermediate hash
- * table to make memory management easier, and because that
- * makes exact matching far easier too.
+ * Discover what commands are actually exported by the namespace.
+ * What we have is an array of patterns and a hash table whose keys
+ * are the command names exported by the namespace (the contents do
+ * not matter here.) We must find out what commands are actually
+ * exported by filtering each command in the namespace against each of
+ * the patterns in the export list. Note that we use an intermediate
+ * hash table to make memory management easier, and because that makes
+ * exact matching far easier too.
*
- * Suggestion for future enhancement: compute the unique
- * prefixes and place them in the hash too, which should make
- * for even faster matching.
+ * Suggestion for future enhancement: compute the unique prefixes and
+ * place them in the hash too, which should make for even faster
+ * matching.
*/
hPtr = Tcl_FirstHashEntry(&ensemblePtr->nsPtr->cmdTable, &search);
@@ -6433,9 +6420,9 @@ BuildEnsembleConfig(ensemblePtr)
hPtr = Tcl_CreateHashEntry(hash, nsCmdName, &isNew);
/*
- * Remember, hash entries have a full reference to
- * the substituted part of the command (as a list)
- * as their content!
+ * Remember, hash entries have a full reference to the
+ * substituted part of the command (as a list) as their
+ * content!
*/
if (isNew) {
@@ -6462,40 +6449,36 @@ BuildEnsembleConfig(ensemblePtr)
}
/*
- * Create a sorted array of all subcommands in the ensemble; hash
- * tables are all very well for a quick look for an exact match,
- * but they can't determine things like whether a string is a
- * prefix of another (not without lots of preparation anyway) and
- * they're no good for when we're generating the error message
- * either.
+ * Create a sorted array of all subcommands in the ensemble; hash tables
+ * are all very well for a quick look for an exact match, but they can't
+ * determine things like whether a string is a prefix of another (not
+ * without lots of preparation anyway) and they're no good for when we're
+ * generating the error message either.
*
- * We do this by filling an array with the names (we use the hash
- * keys directly to save a copy, since any time we change the
- * array we change the hash too, and vice versa) and running
- * quicksort over the array.
+ * We do this by filling an array with the names (we use the hash keys
+ * directly to save a copy, since any time we change the array we change
+ * the hash too, and vice versa) and running quicksort over the array.
*/
ensemblePtr->subcommandArrayPtr = (char **)
ckalloc(sizeof(char *) * hash->numEntries);
/*
- * Fill array from both ends as this makes us less likely to end
- * up with performance problems in qsort(), which is good. Note
- * that doing this makes this code much more opaque, but the naive
- * alternatve:
+ * Fill array from both ends as this makes us less likely to end up with
+ * performance problems in qsort(), which is good. Note that doing this
+ * makes this code much more opaque, but the naive alternatve:
*
* for (hPtr=Tcl_FirstHashEntry(hash,&search),i=0 ;
- * hPtr!=NULL ; hPtr=Tcl_NextHashEntry(&search),i++) {
- * ensemblePtr->subcommandArrayPtr[i] =
- * Tcl_GetHashKey(hash, &hPtr);
+ * hPtr!=NULL ; hPtr=Tcl_NextHashEntry(&search),i++) {
+ * ensemblePtr->subcommandArrayPtr[i] = Tcl_GetHashKey(hash, &hPtr);
* }
*
- * can produce long runs of precisely ordered table entries when
- * the commands in the namespace are declared in a sorted fashion
- * (an ordering some people like) and the hashing functions (or
- * the command names themselves) are fairly unfortunate. By
- * filling from both ends, it requires active malice (and probably
- * a debugger) to get qsort() to have awful runtime behaviour.
+ * can produce long runs of precisely ordered table entries when the
+ * commands in the namespace are declared in a sorted fashion (an ordering
+ * some people like) and the hashing functions (or the command names
+ * themselves) are fairly unfortunate. By filling from both ends, it
+ * requires active malice (and probably a debugger) to get qsort() to have
+ * awful runtime behaviour.
*/
i = 0;
@@ -6521,12 +6504,12 @@ BuildEnsembleConfig(ensemblePtr)
*
* NsEnsembleStringOrder --
*
- * Helper function to compare two pointers to two strings for use
- * with qsort().
+ * Helper function to compare two pointers to two strings for use with
+ * qsort().
*
* Results:
- * -1 if the first string is smaller, 1 if the second string is
- * smaller, and 0 if they are equal.
+ * -1 if the first string is smaller, 1 if the second string is smaller,
+ * and 0 if they are equal.
*
* Side effects:
* None.
@@ -6582,15 +6565,15 @@ FreeEnsembleCmdRep(objPtr)
*
* DupEnsembleCmdRep --
*
- * Makes one Tcl_Obj into a copy of another that is a subcommand
- * of an ensemble.
+ * Makes one Tcl_Obj into a copy of another that is a subcommand of an
+ * ensemble.
*
* Results:
* None.
*
* Side effects:
- * Memory is allocated, and the namespace that the ensemble is
- * built on top of gains another reference.
+ * Memory is allocated, and the namespace that the ensemble is built on
+ * top of gains another reference.
*
*----------------------------------------------------------------------
*/
@@ -6623,8 +6606,8 @@ DupEnsembleCmdRep(objPtr, copyPtr)
*
* StringOfEnsembleCmdRep --
*
- * Creates a string representation of a Tcl_Obj that holds a
- * subcommand of an ensemble.
+ * Creates a string representation of a Tcl_Obj that holds a subcommand
+ * of an ensemble.
*
* Results:
* None.