summaryrefslogtreecommitdiffstats
path: root/generic/tclInterp.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclInterp.c')
-rw-r--r--generic/tclInterp.c2051
1 files changed, 846 insertions, 1205 deletions
diff --git a/generic/tclInterp.c b/generic/tclInterp.c
index 5abda57..dbbf10a 100644
--- a/generic/tclInterp.c
+++ b/generic/tclInterp.c
@@ -4,15 +4,14 @@
* This file implements the "interp" command which allows creation and
* manipulation of Tcl interpreters from within Tcl scripts.
*
- * Copyright © 1995-1997 Sun Microsystems, Inc.
- * Copyright © 2004 Donal K. Fellows
+ * Copyright (c) 1995-1997 Sun Microsystems, Inc.
+ * Copyright (c) 2004 Donal K. Fellows
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*/
#include "tclInt.h"
-#include <assert.h>
/*
* A pointer to a string that holds an initialization script that if non-NULL
@@ -20,7 +19,7 @@
* above. This variable can be modified by the function below.
*/
-static const char *tclPreInitScript = NULL;
+static char *tclPreInitScript = NULL;
/* Forward declaration */
struct Target;
@@ -28,84 +27,84 @@ struct Target;
/*
* struct Alias:
*
- * Stores information about an alias. Is stored in the child interpreter and
- * used by the source command to find the target command in the parent when
+ * Stores information about an alias. Is stored in the slave interpreter and
+ * used by the source command to find the target command in the master when
* the source command is invoked.
*/
typedef struct Alias {
- Tcl_Obj *token; /* Token for the alias command in the child
+ Tcl_Obj *token; /* Token for the alias command in the slave
* interp. This used to be the command name in
- * the child when the alias was first
+ * the slave when the alias was first
* created. */
Tcl_Interp *targetInterp; /* Interp in which target command will be
* invoked. */
- Tcl_Command childCmd; /* Source command in child interpreter, bound
+ Tcl_Command slaveCmd; /* Source command in slave interpreter, bound
* to command that invokes the target command
* in the target interpreter. */
Tcl_HashEntry *aliasEntryPtr;
- /* Entry for the alias hash table in child.
+ /* Entry for the alias hash table in slave.
* This is used by alias deletion to remove
- * the alias from the child interpreter alias
+ * the alias from the slave interpreter alias
* table. */
- struct Target *targetPtr; /* Entry for target command in parent. This is
- * used in the parent interpreter to map back
+ struct Target *targetPtr; /* Entry for target command in master. This is
+ * used in the master interpreter to map back
* from the target command to aliases
* redirecting to it. */
int objc; /* Count of Tcl_Obj in the prefix of the
* target command to be invoked in the target
* interpreter. Additional arguments specified
- * when calling the alias in the child interp
+ * when calling the alias in the slave interp
* will be appended to the prefix before the
* command is invoked. */
Tcl_Obj *objPtr; /* The first actual prefix object - the target
* command name; this has to be at the end of
* the structure, which will be extended to
- * accommodate the remaining objects in the
+ * accomodate the remaining objects in the
* prefix. */
} Alias;
/*
*
- * struct Child:
+ * struct Slave:
*
- * Used by the "interp" command to record and find information about child
- * interpreters. Maps from a command name in the parent to information about a
- * child interpreter, e.g. what aliases are defined in it.
+ * Used by the "interp" command to record and find information about slave
+ * interpreters. Maps from a command name in the master to information about a
+ * slave interpreter, e.g. what aliases are defined in it.
*/
-typedef struct Child {
- Tcl_Interp *parentInterp; /* Parent interpreter for this child. */
- Tcl_HashEntry *childEntryPtr;
- /* Hash entry in parents child table for this
- * child interpreter. Used to find this
- * record, and used when deleting the child
- * interpreter to delete it from the parent's
+typedef struct Slave {
+ Tcl_Interp *masterInterp; /* Master interpreter for this slave. */
+ Tcl_HashEntry *slaveEntryPtr;
+ /* Hash entry in masters slave table for this
+ * slave interpreter. Used to find this
+ * record, and used when deleting the slave
+ * interpreter to delete it from the master's
* table. */
- Tcl_Interp *childInterp; /* The child interpreter. */
+ Tcl_Interp *slaveInterp; /* The slave interpreter. */
Tcl_Command interpCmd; /* Interpreter object command. */
Tcl_HashTable aliasTable; /* Table which maps from names of commands in
- * child interpreter to struct Alias defined
+ * slave interpreter to struct Alias defined
* below. */
-} Child;
+} Slave;
/*
* struct Target:
*
- * Maps from parent interpreter commands back to the source commands in child
+ * Maps from master interpreter commands back to the source commands in slave
* interpreters. This is needed because aliases can be created between sibling
* interpreters and must be deleted when the target interpreter is deleted. In
* case they would not be deleted the source interpreter would be left with a
- * "dangling pointer". One such record is stored in the Parent record of the
- * parent interpreter with the parent for each alias which directs to a
- * command in the parent. These records are used to remove the source command
- * for an from a child if/when the parent is deleted. They are organized in a
- * doubly-linked list attached to the parent interpreter.
+ * "dangling pointer". One such record is stored in the Master record of the
+ * master interpreter with the master for each alias which directs to a
+ * command in the master. These records are used to remove the source command
+ * for an from a slave if/when the master is deleted. They are organized in a
+ * doubly-linked list attached to the master interpreter.
*/
typedef struct Target {
- Tcl_Command childCmd; /* Command for alias in child interp. */
- Tcl_Interp *childInterp; /* Child Interpreter. */
+ Tcl_Command slaveCmd; /* Command for alias in slave interp. */
+ Tcl_Interp *slaveInterp; /* Slave Interpreter. */
struct Target *nextPtr; /* Next in list of target records, or NULL if
* at the end of the list of targets. */
struct Target *prevPtr; /* Previous in list of target records, or NULL
@@ -113,43 +112,43 @@ typedef struct Target {
} Target;
/*
- * struct Parent:
+ * struct Master:
*
- * This record is used for two purposes: First, childTable (a hashtable) maps
- * from names of commands to child interpreters. This hashtable is used to
- * store information about child interpreters of this interpreter, to map over
- * all children, etc. The second purpose is to store information about all
- * aliases in children (or siblings) which direct to target commands in this
+ * This record is used for two purposes: First, slaveTable (a hashtable) maps
+ * from names of commands to slave interpreters. This hashtable is used to
+ * store information about slave interpreters of this interpreter, to map over
+ * all slaves, etc. The second purpose is to store information about all
+ * aliases in slaves (or siblings) which direct to target commands in this
* interpreter (using the targetsPtr doubly-linked list).
*
* NB: the flags field in the interp structure, used with SAFE_INTERP mask
* denotes whether the interpreter is safe or not. Safe interpreters have
- * restricted functionality, can only create safe interpreters and can
+ * restricted functionality, can only create safe slave interpreters and can
* only load safe extensions.
*/
-typedef struct Parent {
- Tcl_HashTable childTable; /* Hash table for child interpreters. Maps
- * from command names to Child records. */
+typedef struct Master {
+ Tcl_HashTable slaveTable; /* Hash table for slave interpreters. Maps
+ * from command names to Slave records. */
Target *targetsPtr; /* The head of a doubly-linked list of all the
* target records which denote aliases from
- * children or sibling interpreters that direct
+ * slaves or sibling interpreters that direct
* to commands in this interpreter. This list
* is used to remove dangling pointers from
- * the child (or sibling) interpreters when
+ * the slave (or sibling) interpreters when
* this interpreter is deleted. */
-} Parent;
+} Master;
/*
- * The following structure keeps track of all the Parent and Child information
+ * The following structure keeps track of all the Master and Slave information
* on a per-interp basis.
*/
typedef struct InterpInfo {
- Parent parent; /* Keeps track of all interps for which this
- * interp is the Parent. */
- Child child; /* Information necessary for this interp to
- * function as a child. */
+ Master master; /* Keeps track of all interps for which this
+ * interp is the Master. */
+ Slave slave; /* Information necessary for this interp to
+ * function as a slave. */
} InterpInfo;
/*
@@ -187,7 +186,7 @@ struct LimitHandler {
int flags; /* The state of this particular handler. */
Tcl_LimitHandlerProc *handlerProc;
/* The handler callback. */
- void *clientData; /* Opaque argument to the handler callback. */
+ ClientData clientData; /* Opaque argument to the handler callback. */
Tcl_LimitHandlerDeleteProc *deleteProc;
/* How to delete the clientData. */
LimitHandler *prevPtr; /* Previous item in linked list of
@@ -198,7 +197,7 @@ struct LimitHandler {
/*
* Values for the LimitHandler flags field.
* LIMIT_HANDLER_ACTIVE - Whether the handler is currently being
- * processed; handlers are never to be reentered.
+ * processed; handlers are never to be entered reentrantly.
* LIMIT_HANDLER_DELETED - Whether the handler has been deleted. This
* should not normally be observed because when a handler is
* deleted it is also spliced out of the list of handlers, but
@@ -215,74 +214,73 @@ struct LimitHandler {
*/
static int AliasCreate(Tcl_Interp *interp,
- Tcl_Interp *childInterp, Tcl_Interp *parentInterp,
+ Tcl_Interp *slaveInterp, Tcl_Interp *masterInterp,
Tcl_Obj *namePtr, Tcl_Obj *targetPtr, int objc,
Tcl_Obj *const objv[]);
static int AliasDelete(Tcl_Interp *interp,
- Tcl_Interp *childInterp, Tcl_Obj *namePtr);
+ Tcl_Interp *slaveInterp, Tcl_Obj *namePtr);
static int AliasDescribe(Tcl_Interp *interp,
- Tcl_Interp *childInterp, Tcl_Obj *objPtr);
-static int AliasList(Tcl_Interp *interp, Tcl_Interp *childInterp);
-static Tcl_ObjCmdProc AliasNRCmd;
-static Tcl_CmdDeleteProc AliasObjCmdDeleteProc;
+ Tcl_Interp *slaveInterp, Tcl_Obj *objPtr);
+static int AliasList(Tcl_Interp *interp, Tcl_Interp *slaveInterp);
+static int AliasObjCmd(ClientData dummy,
+ Tcl_Interp *currentInterp, int objc,
+ Tcl_Obj *const objv[]);
+static void AliasObjCmdDeleteProc(ClientData clientData);
static Tcl_Interp * GetInterp(Tcl_Interp *interp, Tcl_Obj *pathPtr);
static Tcl_Interp * GetInterp2(Tcl_Interp *interp, int objc,
Tcl_Obj *const objv[]);
-static Tcl_InterpDeleteProc InterpInfoDeleteProc;
-static int ChildBgerror(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int objc,
+static void InterpInfoDeleteProc(ClientData clientData,
+ Tcl_Interp *interp);
+static int SlaveBgerror(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp, int objc,
Tcl_Obj *const objv[]);
-static Tcl_Interp * ChildCreate(Tcl_Interp *interp, Tcl_Obj *pathPtr,
+static Tcl_Interp * SlaveCreate(Tcl_Interp *interp, Tcl_Obj *pathPtr,
int safe);
-static int ChildDebugCmd(Tcl_Interp *interp,
- Tcl_Interp *childInterp,
+static int SlaveDebugCmd(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp,
int objc, Tcl_Obj *const objv[]);
-static int ChildEval(Tcl_Interp *interp, Tcl_Interp *childInterp,
+static int SlaveEval(Tcl_Interp *interp, Tcl_Interp *slaveInterp,
int objc, Tcl_Obj *const objv[]);
-static int ChildExpose(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int objc,
+static int SlaveExpose(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp, int objc,
Tcl_Obj *const objv[]);
-static int ChildHide(Tcl_Interp *interp, Tcl_Interp *childInterp,
+static int SlaveHide(Tcl_Interp *interp, Tcl_Interp *slaveInterp,
int objc, Tcl_Obj *const objv[]);
-static int ChildHidden(Tcl_Interp *interp,
- Tcl_Interp *childInterp);
-static int ChildInvokeHidden(Tcl_Interp *interp,
- Tcl_Interp *childInterp,
+static int SlaveHidden(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp);
+static int SlaveInvokeHidden(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp,
const char *namespaceName,
- Tcl_Size objc, Tcl_Obj *const objv[]);
-static int ChildMarkTrusted(Tcl_Interp *interp,
- Tcl_Interp *childInterp);
-static Tcl_CmdDeleteProc ChildObjCmdDeleteProc;
-static int ChildRecursionLimit(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int objc,
+ int objc, Tcl_Obj *const objv[]);
+static int SlaveMarkTrusted(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp);
+static int SlaveObjCmd(ClientData dummy, Tcl_Interp *interp,
+ int objc, Tcl_Obj *const objv[]);
+static void SlaveObjCmdDeleteProc(ClientData clientData);
+static int SlaveRecursionLimit(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp, int objc,
Tcl_Obj *const objv[]);
-static int ChildCommandLimitCmd(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int consumedObjc,
+static int SlaveCommandLimitCmd(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp, int consumedObjc,
int objc, Tcl_Obj *const objv[]);
-static int ChildTimeLimitCmd(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int consumedObjc,
+static int SlaveTimeLimitCmd(Tcl_Interp *interp,
+ Tcl_Interp *slaveInterp, int consumedObjc,
int objc, Tcl_Obj *const objv[]);
-static void InheritLimitsFromParent(Tcl_Interp *childInterp,
- Tcl_Interp *parentInterp);
+static void InheritLimitsFromMaster(Tcl_Interp *slaveInterp,
+ Tcl_Interp *masterInterp);
static void SetScriptLimitCallback(Tcl_Interp *interp, int type,
Tcl_Interp *targetInterp, Tcl_Obj *scriptObj);
-static void CallScriptLimitCallback(void *clientData,
+static void CallScriptLimitCallback(ClientData clientData,
Tcl_Interp *interp);
-static void DeleteScriptLimitCallback(void *clientData);
+static void DeleteScriptLimitCallback(ClientData clientData);
static void RunLimitHandlers(LimitHandler *handlerPtr,
Tcl_Interp *interp);
-static void TimeLimitCallback(void *clientData);
-
-/* NRE enabling */
-static Tcl_NRPostProc NRPostInvokeHidden;
-static Tcl_ObjCmdProc NRInterpCmd;
-static Tcl_ObjCmdProc NRChildCmd;
-
+static void TimeLimitCallback(ClientData clientData);
/*
*----------------------------------------------------------------------
*
- * Tcl_SetPreInitScript --
+ * TclSetPreInitScript --
*
* This routine is used to change the value of the internal variable,
* tclPreInitScript.
@@ -296,13 +294,13 @@ static Tcl_ObjCmdProc NRChildCmd;
*----------------------------------------------------------------------
*/
-const char *
-Tcl_SetPreInitScript(
- const char *string) /* Pointer to a script. */
+char *
+TclSetPreInitScript(
+ char *string) /* Pointer to a script. */
{
- const char *prevString = tclPreInitScript;
+ char *prevString = tclPreInitScript;
tclPreInitScript = string;
- return prevString;
+ return(prevString);
}
/*
@@ -324,25 +322,14 @@ Tcl_SetPreInitScript(
*----------------------------------------------------------------------
*/
-typedef struct PkgName {
- struct PkgName *nextPtr; /* Next in list of package names being initialized. */
- char name[4];
-} PkgName;
-
int
Tcl_Init(
Tcl_Interp *interp) /* Interpreter to initialize. */
{
- PkgName pkgName = {NULL, "tcl"};
- PkgName **names = (PkgName **)TclInitPkgFiles(interp);
- int result = TCL_ERROR;
-
- pkgName.nextPtr = *names;
- *names = &pkgName;
if (tclPreInitScript != NULL) {
- if (Tcl_EvalEx(interp, tclPreInitScript, TCL_INDEX_NONE, 0) == TCL_ERROR) {
- goto end;
- }
+ if (Tcl_Eval(interp, tclPreInitScript) == TCL_ERROR) {
+ return (TCL_ERROR);
+ };
}
/*
@@ -386,7 +373,7 @@ Tcl_Init(
* alternate tclInit command before calling Tcl_Init().
*/
- result = Tcl_EvalEx(interp,
+ return Tcl_Eval(interp,
"if {[namespace which -command tclInit] eq \"\"} {\n"
" proc tclInit {} {\n"
" global tcl_libPath tcl_library env tclDefaultLibrary\n"
@@ -402,7 +389,6 @@ Tcl_Init(
"if {$tail eq [info tclversion]} continue\n"
"file join [file dirname $env(TCL_LIBRARY)] tcl[info tclversion]}\n"
" }\n"
-" lappend scripts {::tcl::zipfs::tcl_library_init}\n"
" if {[info exists tclDefaultLibrary]} {\n"
" lappend scripts {set tclDefaultLibrary}\n"
" } else {\n"
@@ -415,7 +401,6 @@ Tcl_Init(
" {file join $grandParentDir lib tcl[info tclversion]} \\\n"
" {file join $parentDir library} \\\n"
" {file join $grandParentDir library} \\\n"
-" {file join $grandParentDir tcl[info tclversion] library} \\\n"
" {file join $grandParentDir tcl[info patchlevel] library} \\\n"
" {\n"
"file join [file dirname $grandParentDir] tcl[info patchlevel] library}\n"
@@ -450,11 +435,7 @@ Tcl_Init(
" error $msg\n"
" }\n"
"}\n"
-"tclInit", TCL_INDEX_NONE, 0);
-
-end:
- *names = (*names)->nextPtr;
- return result;
+"tclInit");
}
/*
@@ -462,7 +443,7 @@ end:
*
* TclInterpInit --
*
- * Initializes the invoking interpreter for using the parent, child and
+ * Initializes the invoking interpreter for using the master, slave and
* safe interp facilities. This is called from inside Tcl_CreateInterp().
*
* Results:
@@ -480,25 +461,24 @@ TclInterpInit(
Tcl_Interp *interp) /* Interpreter to initialize. */
{
InterpInfo *interpInfoPtr;
- Parent *parentPtr;
- Child *childPtr;
+ Master *masterPtr;
+ Slave *slavePtr;
- interpInfoPtr = (InterpInfo *)ckalloc(sizeof(InterpInfo));
+ interpInfoPtr = (InterpInfo *) ckalloc(sizeof(InterpInfo));
((Interp *) interp)->interpInfo = interpInfoPtr;
- parentPtr = &interpInfoPtr->parent;
- Tcl_InitHashTable(&parentPtr->childTable, TCL_STRING_KEYS);
- parentPtr->targetsPtr = NULL;
+ masterPtr = &interpInfoPtr->master;
+ Tcl_InitHashTable(&masterPtr->slaveTable, TCL_STRING_KEYS);
+ masterPtr->targetsPtr = NULL;
- childPtr = &interpInfoPtr->child;
- childPtr->parentInterp = NULL;
- childPtr->childEntryPtr = NULL;
- childPtr->childInterp = interp;
- childPtr->interpCmd = NULL;
- Tcl_InitHashTable(&childPtr->aliasTable, TCL_STRING_KEYS);
+ slavePtr = &interpInfoPtr->slave;
+ slavePtr->masterInterp = NULL;
+ slavePtr->slaveEntryPtr = NULL;
+ slavePtr->slaveInterp = interp;
+ slavePtr->interpCmd = NULL;
+ Tcl_InitHashTable(&slavePtr->aliasTable, TCL_STRING_KEYS);
- Tcl_NRCreateCommand(interp, "interp", Tcl_InterpObjCmd, NRInterpCmd,
- NULL, NULL);
+ Tcl_CreateObjCommand(interp, "interp", Tcl_InterpObjCmd, NULL, NULL);
Tcl_CallWhenDeleted(interp, InterpInfoDeleteProc, NULL);
return TCL_OK;
@@ -510,7 +490,7 @@ TclInterpInit(
* InterpInfoDeleteProc --
*
* Invoked when an interpreter is being deleted. It releases all storage
- * used by the parent/child/safe interpreter facilities.
+ * used by the master/slave/safe interpreter facilities.
*
* Results:
* None.
@@ -523,13 +503,13 @@ TclInterpInit(
static void
InterpInfoDeleteProc(
- TCL_UNUSED(void *),
+ ClientData clientData, /* Ignored. */
Tcl_Interp *interp) /* Interp being deleted. All commands for
- * child interps should already be deleted. */
+ * slave interps should already be deleted. */
{
InterpInfo *interpInfoPtr;
- Child *childPtr;
- Parent *parentPtr;
+ Slave *slavePtr;
+ Master *masterPtr;
Target *targetPtr;
interpInfoPtr = (InterpInfo *) ((Interp *) interp)->interpInfo;
@@ -538,11 +518,11 @@ InterpInfoDeleteProc(
* There shouldn't be any commands left.
*/
- parentPtr = &interpInfoPtr->parent;
- if (parentPtr->childTable.numEntries != 0) {
+ masterPtr = &interpInfoPtr->master;
+ if (masterPtr->slaveTable.numEntries != 0) {
Tcl_Panic("InterpInfoDeleteProc: still exist commands");
}
- Tcl_DeleteHashTable(&parentPtr->childTable);
+ Tcl_DeleteHashTable(&masterPtr->slaveTable);
/*
* Tell any interps that have aliases to this interp that they should
@@ -550,37 +530,37 @@ InterpInfoDeleteProc(
* have removed the target record already.
*/
- for (targetPtr = parentPtr->targetsPtr; targetPtr != NULL; ) {
+ for (targetPtr = masterPtr->targetsPtr; targetPtr != NULL; ) {
Target *tmpPtr = targetPtr->nextPtr;
- Tcl_DeleteCommandFromToken(targetPtr->childInterp,
- targetPtr->childCmd);
+ Tcl_DeleteCommandFromToken(targetPtr->slaveInterp,
+ targetPtr->slaveCmd);
targetPtr = tmpPtr;
}
- childPtr = &interpInfoPtr->child;
- if (childPtr->interpCmd != NULL) {
+ slavePtr = &interpInfoPtr->slave;
+ if (slavePtr->interpCmd != NULL) {
/*
* Tcl_DeleteInterp() was called on this interpreter, rather "interp
- * delete" or the equivalent deletion of the command in the parent.
+ * delete" or the equivalent deletion of the command in the master.
* First ensure that the cleanup callback doesn't try to delete the
* interp again.
*/
- childPtr->childInterp = NULL;
- Tcl_DeleteCommandFromToken(childPtr->parentInterp,
- childPtr->interpCmd);
+ slavePtr->slaveInterp = NULL;
+ Tcl_DeleteCommandFromToken(slavePtr->masterInterp,
+ slavePtr->interpCmd);
}
/*
* There shouldn't be any aliases left.
*/
- if (childPtr->aliasTable.numEntries != 0) {
+ if (slavePtr->aliasTable.numEntries != 0) {
Tcl_Panic("InterpInfoDeleteProc: still exist aliases");
}
- Tcl_DeleteHashTable(&childPtr->aliasTable);
+ Tcl_DeleteHashTable(&slavePtr->aliasTable);
- ckfree(interpInfoPtr);
+ ckfree((char *) interpInfoPtr);
}
/*
@@ -599,187 +579,102 @@ InterpInfoDeleteProc(
*
*----------------------------------------------------------------------
*/
-
+ /* ARGSUSED */
int
Tcl_InterpObjCmd(
- void *clientData,
+ ClientData clientData, /* Unused. */
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- return Tcl_NRCallObjProc(interp, NRInterpCmd, clientData, objc, objv);
-}
-
-static int
-NRInterpCmd(
- TCL_UNUSED(void *),
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- Tcl_Interp *childInterp;
int index;
- static const char *const options[] = {
- "alias", "aliases", "bgerror", "cancel",
- "children", "create", "debug", "delete",
- "eval", "exists", "expose", "hide",
- "hidden", "issafe", "invokehidden",
- "limit", "marktrusted", "recursionlimit",
- "share", "slaves", "target", "transfer",
+ static const char *options[] = {
+ "alias", "aliases", "bgerror", "create",
+ "debug", "delete", "eval", "exists", "expose",
+ "hide", "hidden", "issafe", "invokehidden",
+ "limit", "marktrusted", "recursionlimit","slaves",
+ "share", "target", "transfer",
NULL
};
- static const char *const optionsNoSlaves[] = {
- "alias", "aliases", "bgerror", "cancel",
- "children", "create", "debug", "delete",
- "eval", "exists", "expose",
- "hide", "hidden", "issafe",
- "invokehidden", "limit", "marktrusted", "recursionlimit",
- "share", "target", "transfer", NULL
- };
- enum interpOptionEnum {
- OPT_ALIAS, OPT_ALIASES, OPT_BGERROR, OPT_CANCEL,
- OPT_CHILDREN, OPT_CREATE, OPT_DEBUG, OPT_DELETE,
- OPT_EVAL, OPT_EXISTS, OPT_EXPOSE, OPT_HIDE,
- OPT_HIDDEN, OPT_ISSAFE, OPT_INVOKEHID,
- OPT_LIMIT, OPT_MARKTRUSTED,OPT_RECLIMIT,
- OPT_SHARE, OPT_SLAVES, OPT_TARGET, OPT_TRANSFER
+ enum option {
+ OPT_ALIAS, OPT_ALIASES, OPT_BGERROR, OPT_CREATE,
+ OPT_DEBUG, OPT_DELETE, OPT_EVAL, OPT_EXISTS, OPT_EXPOSE,
+ OPT_HIDE, OPT_HIDDEN, OPT_ISSAFE, OPT_INVOKEHID,
+ OPT_LIMIT, OPT_MARKTRUSTED,OPT_RECLIMIT, OPT_SLAVES,
+ OPT_SHARE, OPT_TARGET, OPT_TRANSFER
};
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "cmd ?arg ...?");
return TCL_ERROR;
}
- if (Tcl_GetIndexFromObj(NULL, objv[1], options,
- "option", 0, &index) != TCL_OK) {
- /* Don't report the "slaves" option as possibility */
- Tcl_GetIndexFromObj(interp, objv[1], optionsNoSlaves,
- "option", 0, &index);
+ if (Tcl_GetIndexFromObj(interp, objv[1], options, "option", 0,
+ &index) != TCL_OK) {
return TCL_ERROR;
}
- switch ((enum interpOptionEnum)index) {
+ switch ((enum option) index) {
case OPT_ALIAS: {
- Tcl_Interp *parentInterp;
+ Tcl_Interp *slaveInterp, *masterInterp;
if (objc < 4) {
aliasArgs:
Tcl_WrongNumArgs(interp, 2, objv,
- "childPath childCmd ?parentPath parentCmd? ?arg ...?");
+ "slavePath slaveCmd ?masterPath masterCmd? ?args ..?");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
if (objc == 4) {
- return AliasDescribe(interp, childInterp, objv[3]);
+ return AliasDescribe(interp, slaveInterp, objv[3]);
}
if ((objc == 5) && (TclGetString(objv[4])[0] == '\0')) {
- return AliasDelete(interp, childInterp, objv[3]);
+ return AliasDelete(interp, slaveInterp, objv[3]);
}
if (objc > 5) {
- parentInterp = GetInterp(interp, objv[4]);
- if (parentInterp == NULL) {
+ masterInterp = GetInterp(interp, objv[4]);
+ if (masterInterp == NULL) {
return TCL_ERROR;
}
-
- return AliasCreate(interp, childInterp, parentInterp, objv[3],
- objv[5], objc - 6, objv + 6);
+ if (TclGetString(objv[5])[0] == '\0') {
+ if (objc == 6) {
+ return AliasDelete(interp, slaveInterp, objv[3]);
+ }
+ } else {
+ return AliasCreate(interp, slaveInterp, masterInterp, objv[3],
+ objv[5], objc - 6, objv + 6);
+ }
}
goto aliasArgs;
}
- case OPT_ALIASES:
- childInterp = GetInterp2(interp, objc, objv);
- if (childInterp == NULL) {
+ case OPT_ALIASES: {
+ Tcl_Interp *slaveInterp;
+
+ slaveInterp = GetInterp2(interp, objc, objv);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return AliasList(interp, childInterp);
- case OPT_BGERROR:
+ return AliasList(interp, slaveInterp);
+ }
+ case OPT_BGERROR: {
+ Tcl_Interp *slaveInterp;
+
if (objc != 3 && objc != 4) {
Tcl_WrongNumArgs(interp, 2, objv, "path ?cmdPrefix?");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildBgerror(interp, childInterp, objc - 3, objv + 3);
- case OPT_CANCEL: {
- int i, flags;
- Tcl_Obj *resultObjPtr;
- static const char *const cancelOptions[] = {
- "-unwind", "--", NULL
- };
- enum optionCancelEnum {
- OPT_UNWIND, OPT_LAST
- };
-
- flags = 0;
-
- for (i = 2; i < objc; i++) {
- if (TclGetString(objv[i])[0] != '-') {
- break;
- }
- if (Tcl_GetIndexFromObj(interp, objv[i], cancelOptions, "option",
- 0, &index) != TCL_OK) {
- return TCL_ERROR;
- }
-
- switch ((enum optionCancelEnum) index) {
- case OPT_UNWIND:
- /*
- * The evaluation stack in the target interp is to be unwound.
- */
-
- flags |= TCL_CANCEL_UNWIND;
- break;
- case OPT_LAST:
- i++;
- goto endOfForLoop;
- }
- }
-
- endOfForLoop:
- if (i < objc - 2) {
- Tcl_WrongNumArgs(interp, 2, objv,
- "?-unwind? ?--? ?path? ?result?");
- return TCL_ERROR;
- }
-
- /*
- * Did they specify a child interp to cancel the script in progress
- * in? If not, use the current interp.
- */
-
- if (i < objc) {
- childInterp = GetInterp(interp, objv[i]);
- if (childInterp == NULL) {
- return TCL_ERROR;
- }
- i++;
- } else {
- childInterp = interp;
- }
-
- if (i < objc) {
- resultObjPtr = objv[i];
-
- /*
- * Tcl_CancelEval removes this reference.
- */
-
- Tcl_IncrRefCount(resultObjPtr);
- i++;
- } else {
- resultObjPtr = NULL;
- }
-
- return Tcl_CancelEval(childInterp, resultObjPtr, 0, flags);
+ return SlaveBgerror(interp, slaveInterp, objc - 3, objv + 3);
}
case OPT_CREATE: {
int i, last, safe;
- Tcl_Obj *childPtr;
+ Tcl_Obj *slavePtr;
char buf[16 + TCL_INTEGER_SPACE];
- static const char *const createOptions[] = {
+ static const char *options[] = {
"-safe", "--", NULL
};
enum option {
@@ -792,12 +687,12 @@ NRInterpCmd(
* Weird historical rules: "-safe" is accepted at the end, too.
*/
- childPtr = NULL;
+ slavePtr = NULL;
last = 0;
for (i = 2; i < objc; i++) {
if ((last == 0) && (Tcl_GetString(objv[i])[0] == '-')) {
- if (Tcl_GetIndexFromObj(interp, objv[i], createOptions,
- "option", 0, &index) != TCL_OK) {
+ if (Tcl_GetIndexFromObj(interp, objv[i], options, "option", 0,
+ &index) != TCL_OK) {
return TCL_ERROR;
}
if (index == OPT_SAFE) {
@@ -807,92 +702,99 @@ NRInterpCmd(
i++;
last = 1;
}
- if (childPtr != NULL) {
+ if (slavePtr != NULL) {
Tcl_WrongNumArgs(interp, 2, objv, "?-safe? ?--? ?path?");
return TCL_ERROR;
}
if (i < objc) {
- childPtr = objv[i];
+ slavePtr = objv[i];
}
}
buf[0] = '\0';
- if (childPtr == NULL) {
+ if (slavePtr == NULL) {
/*
* Create an anonymous interpreter -- we choose its name and the
* name of the command. We check that the command name that we use
* for the interpreter does not collide with an existing command
- * in the parent interpreter.
+ * in the master interpreter.
*/
for (i = 0; ; i++) {
Tcl_CmdInfo cmdInfo;
- snprintf(buf, sizeof(buf), "interp%d", i);
+ sprintf(buf, "interp%d", i);
if (Tcl_GetCommandInfo(interp, buf, &cmdInfo) == 0) {
break;
}
}
- childPtr = Tcl_NewStringObj(buf, -1);
+ slavePtr = Tcl_NewStringObj(buf, -1);
}
- if (ChildCreate(interp, childPtr, safe) == NULL) {
+ if (SlaveCreate(interp, slavePtr, safe) == NULL) {
if (buf[0] != '\0') {
- Tcl_DecrRefCount(childPtr);
+ Tcl_DecrRefCount(slavePtr);
}
return TCL_ERROR;
}
- Tcl_SetObjResult(interp, childPtr);
+ Tcl_SetObjResult(interp, slavePtr);
return TCL_OK;
}
- case OPT_DEBUG: /* TIP #378 */
+ case OPT_DEBUG: {
+ /* TIP #378 */
+ Tcl_Interp *slaveInterp;
+
/*
* Currently only -frame supported, otherwise ?-option ?value??
*/
-
if (objc < 3 || objc > 5) {
Tcl_WrongNumArgs(interp, 2, objv, "path ?-frame ?bool??");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildDebugCmd(interp, childInterp, objc - 3, objv + 3);
+ return SlaveDebugCmd(interp, slaveInterp, objc - 3, objv + 3);
+ }
case OPT_DELETE: {
int i;
InterpInfo *iiPtr;
+ Tcl_Interp *slaveInterp;
for (i = 2; i < objc; i++) {
- childInterp = GetInterp(interp, objv[i]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[i]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
- } else if (childInterp == interp) {
+ } else if (slaveInterp == interp) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"cannot delete the current interpreter", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "DELETESELF", (void *)NULL);
return TCL_ERROR;
}
- iiPtr = (InterpInfo *) ((Interp *) childInterp)->interpInfo;
- Tcl_DeleteCommandFromToken(iiPtr->child.parentInterp,
- iiPtr->child.interpCmd);
+ iiPtr = (InterpInfo *) ((Interp *) slaveInterp)->interpInfo;
+ Tcl_DeleteCommandFromToken(iiPtr->slave.masterInterp,
+ iiPtr->slave.interpCmd);
}
return TCL_OK;
}
- case OPT_EVAL:
+ case OPT_EVAL: {
+ Tcl_Interp *slaveInterp;
+
if (objc < 4) {
Tcl_WrongNumArgs(interp, 2, objv, "path arg ?arg ...?");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildEval(interp, childInterp, objc - 3, objv + 3);
+ return SlaveEval(interp, slaveInterp, objc - 3, objv + 3);
+ }
case OPT_EXISTS: {
- int exists = 1;
+ int exists;
+ Tcl_Interp *slaveInterp;
- childInterp = GetInterp2(interp, objc, objv);
- if (childInterp == NULL) {
+ exists = 1;
+ slaveInterp = GetInterp2(interp, objc, objv);
+ if (slaveInterp == NULL) {
if (objc > 3) {
return TCL_ERROR;
}
@@ -902,43 +804,56 @@ NRInterpCmd(
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(exists));
return TCL_OK;
}
- case OPT_EXPOSE:
+ case OPT_EXPOSE: {
+ Tcl_Interp *slaveInterp;
+
if ((objc < 4) || (objc > 5)) {
Tcl_WrongNumArgs(interp, 2, objv, "path hiddenCmdName ?cmdName?");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildExpose(interp, childInterp, objc - 3, objv + 3);
- case OPT_HIDE:
+ return SlaveExpose(interp, slaveInterp, objc - 3, objv + 3);
+ }
+ case OPT_HIDE: {
+ Tcl_Interp *slaveInterp; /* A slave. */
+
if ((objc < 4) || (objc > 5)) {
Tcl_WrongNumArgs(interp, 2, objv, "path cmdName ?hiddenCmdName?");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildHide(interp, childInterp, objc - 3, objv + 3);
- case OPT_HIDDEN:
- childInterp = GetInterp2(interp, objc, objv);
- if (childInterp == NULL) {
+ return SlaveHide(interp, slaveInterp, objc - 3, objv + 3);
+ }
+ case OPT_HIDDEN: {
+ Tcl_Interp *slaveInterp; /* A slave. */
+
+ slaveInterp = GetInterp2(interp, objc, objv);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildHidden(interp, childInterp);
- case OPT_ISSAFE:
- childInterp = GetInterp2(interp, objc, objv);
- if (childInterp == NULL) {
+ return SlaveHidden(interp, slaveInterp);
+ }
+ case OPT_ISSAFE: {
+ Tcl_Interp *slaveInterp;
+
+ slaveInterp = GetInterp2(interp, objc, objv);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tcl_IsSafe(childInterp)));
+ Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tcl_IsSafe(slaveInterp)));
return TCL_OK;
+ }
case OPT_INVOKEHID: {
- int i;
+ int i, index;
const char *namespaceName;
- static const char *const hiddenOptions[] = {
+ Tcl_Interp *slaveInterp;
+ static const char *hiddenOptions[] = {
"-global", "-namespace", "--", NULL
};
enum hiddenOption {
@@ -972,15 +887,16 @@ NRInterpCmd(
"path ?-namespace ns? ?-global? ?--? cmd ?arg ..?");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildInvokeHidden(interp, childInterp, namespaceName, objc - i,
+ return SlaveInvokeHidden(interp, slaveInterp, namespaceName, objc - i,
objv + i);
}
case OPT_LIMIT: {
- static const char *const limitTypes[] = {
+ Tcl_Interp *slaveInterp;
+ static const char *limitTypes[] = {
"commands", "time", NULL
};
enum LimitTypes {
@@ -989,12 +905,11 @@ NRInterpCmd(
int limitType;
if (objc < 4) {
- Tcl_WrongNumArgs(interp, 2, objv,
- "path limitType ?-option value ...?");
+ Tcl_WrongNumArgs(interp, 2, objv, "path limitType ?options?");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
if (Tcl_GetIndexFromObj(interp, objv[3], limitTypes, "limit type", 0,
@@ -1003,49 +918,54 @@ NRInterpCmd(
}
switch ((enum LimitTypes) limitType) {
case LIMIT_TYPE_COMMANDS:
- return ChildCommandLimitCmd(interp, childInterp, 4, objc,objv);
+ return SlaveCommandLimitCmd(interp, slaveInterp, 4, objc,objv);
case LIMIT_TYPE_TIME:
- return ChildTimeLimitCmd(interp, childInterp, 4, objc, objv);
+ return SlaveTimeLimitCmd(interp, slaveInterp, 4, objc, objv);
}
}
- break;
- case OPT_MARKTRUSTED:
+ case OPT_MARKTRUSTED: {
+ Tcl_Interp *slaveInterp;
+
if (objc != 3) {
Tcl_WrongNumArgs(interp, 2, objv, "path");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildMarkTrusted(interp, childInterp);
- case OPT_RECLIMIT:
+ return SlaveMarkTrusted(interp, slaveInterp);
+ }
+ case OPT_RECLIMIT: {
+ Tcl_Interp *slaveInterp;
+
if (objc != 3 && objc != 4) {
Tcl_WrongNumArgs(interp, 2, objv, "path ?newlimit?");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- return ChildRecursionLimit(interp, childInterp, objc - 3, objv + 3);
- case OPT_CHILDREN:
+ return SlaveRecursionLimit(interp, slaveInterp, objc - 3, objv + 3);
+ }
case OPT_SLAVES: {
+ Tcl_Interp *slaveInterp;
InterpInfo *iiPtr;
Tcl_Obj *resultPtr;
Tcl_HashEntry *hPtr;
Tcl_HashSearch hashSearch;
char *string;
- childInterp = GetInterp2(interp, objc, objv);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp2(interp, objc, objv);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- iiPtr = (InterpInfo *) ((Interp *) childInterp)->interpInfo;
- TclNewObj(resultPtr);
- hPtr = Tcl_FirstHashEntry(&iiPtr->parent.childTable, &hashSearch);
+ iiPtr = (InterpInfo *) ((Interp *) slaveInterp)->interpInfo;
+ resultPtr = Tcl_NewObj();
+ hPtr = Tcl_FirstHashEntry(&iiPtr->master.slaveTable, &hashSearch);
for ( ; hPtr != NULL; hPtr = Tcl_NextHashEntry(&hashSearch)) {
- string = (char *)Tcl_GetHashKey(&iiPtr->parent.childTable, hPtr);
+ string = Tcl_GetHashKey(&iiPtr->master.slaveTable, hPtr);
Tcl_ListObjAppendElement(NULL, resultPtr,
Tcl_NewStringObj(string, -1));
}
@@ -1054,75 +974,75 @@ NRInterpCmd(
}
case OPT_TRANSFER:
case OPT_SHARE: {
- Tcl_Interp *parentInterp; /* The parent of the child. */
+ Tcl_Interp *slaveInterp; /* A slave. */
+ Tcl_Interp *masterInterp; /* Its master. */
Tcl_Channel chan;
if (objc != 5) {
Tcl_WrongNumArgs(interp, 2, objv, "srcPath channelId destPath");
return TCL_ERROR;
}
- parentInterp = GetInterp(interp, objv[2]);
- if (parentInterp == NULL) {
+ masterInterp = GetInterp(interp, objv[2]);
+ if (masterInterp == NULL) {
return TCL_ERROR;
}
- chan = Tcl_GetChannel(parentInterp, TclGetString(objv[3]), NULL);
+ chan = Tcl_GetChannel(masterInterp, TclGetString(objv[3]), NULL);
if (chan == NULL) {
- Tcl_TransferResult(parentInterp, TCL_OK, interp);
+ TclTransferResult(masterInterp, TCL_OK, interp);
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[4]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[4]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
- Tcl_RegisterChannel(childInterp, chan);
+ Tcl_RegisterChannel(slaveInterp, chan);
if (index == OPT_TRANSFER) {
/*
* When transferring, as opposed to sharing, we must unhitch the
* channel from the interpreter where it started.
*/
- if (Tcl_UnregisterChannel(parentInterp, chan) != TCL_OK) {
- Tcl_TransferResult(parentInterp, TCL_OK, interp);
+ if (Tcl_UnregisterChannel(masterInterp, chan) != TCL_OK) {
+ TclTransferResult(masterInterp, TCL_OK, interp);
return TCL_ERROR;
}
}
return TCL_OK;
}
case OPT_TARGET: {
+ Tcl_Interp *slaveInterp;
InterpInfo *iiPtr;
Tcl_HashEntry *hPtr;
Alias *aliasPtr;
- const char *aliasName;
+ char *aliasName;
if (objc != 4) {
Tcl_WrongNumArgs(interp, 2, objv, "path alias");
return TCL_ERROR;
}
- childInterp = GetInterp(interp, objv[2]);
- if (childInterp == NULL) {
+ slaveInterp = GetInterp(interp, objv[2]);
+ if (slaveInterp == NULL) {
return TCL_ERROR;
}
aliasName = TclGetString(objv[3]);
- iiPtr = (InterpInfo *) ((Interp *) childInterp)->interpInfo;
- hPtr = Tcl_FindHashEntry(&iiPtr->child.aliasTable, aliasName);
+ iiPtr = (InterpInfo *) ((Interp *) slaveInterp)->interpInfo;
+ hPtr = Tcl_FindHashEntry(&iiPtr->slave.aliasTable, aliasName);
if (hPtr == NULL) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "alias \"%s\" in path \"%s\" not found",
- aliasName, TclGetString(objv[2])));
+ Tcl_AppendResult(interp, "alias \"", aliasName, "\" in path \"",
+ Tcl_GetString(objv[2]), "\" not found", NULL);
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS", aliasName,
- (void *)NULL);
+ NULL);
return TCL_ERROR;
}
- aliasPtr = (Alias *)Tcl_GetHashValue(hPtr);
+ aliasPtr = Tcl_GetHashValue(hPtr);
if (Tcl_GetInterpPath(interp, aliasPtr->targetInterp) != TCL_OK) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "target interpreter for alias \"%s\" in path \"%s\" is "
- "not my descendant", aliasName, Tcl_GetString(objv[2])));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "TARGETSHROUDED", (void *)NULL);
+ Tcl_ResetResult(interp);
+ Tcl_AppendResult(interp, "target interpreter for alias \"",
+ aliasName, "\" in path \"", Tcl_GetString(objv[2]),
+ "\" is not my descendant", NULL);
return TCL_ERROR;
}
return TCL_OK;
@@ -1180,46 +1100,47 @@ GetInterp2(
* A standard Tcl result.
*
* Side effects:
- * Creates a new alias, manipulates the result field of childInterp.
+ * Creates a new alias, manipulates the result field of slaveInterp.
*
*----------------------------------------------------------------------
*/
int
Tcl_CreateAlias(
- Tcl_Interp *childInterp, /* Interpreter for source command. */
- const char *childCmd, /* Command to install in child. */
+ Tcl_Interp *slaveInterp, /* Interpreter for source command. */
+ const char *slaveCmd, /* Command to install in slave. */
Tcl_Interp *targetInterp, /* Interpreter for target command. */
const char *targetCmd, /* Name of target command. */
- Tcl_Size argc, /* How many additional arguments? */
+ int argc, /* How many additional arguments? */
const char *const *argv) /* These are the additional args. */
{
- Tcl_Obj *childObjPtr, *targetObjPtr;
+ Tcl_Obj *slaveObjPtr, *targetObjPtr;
Tcl_Obj **objv;
- Tcl_Size i;
+ int i;
int result;
- objv = (Tcl_Obj **)TclStackAlloc(childInterp, sizeof(Tcl_Obj *) * argc);
+ objv = (Tcl_Obj **)
+ TclStackAlloc(slaveInterp, (unsigned) sizeof(Tcl_Obj *) * argc);
for (i = 0; i < argc; i++) {
objv[i] = Tcl_NewStringObj(argv[i], -1);
Tcl_IncrRefCount(objv[i]);
}
- childObjPtr = Tcl_NewStringObj(childCmd, -1);
- Tcl_IncrRefCount(childObjPtr);
+ slaveObjPtr = Tcl_NewStringObj(slaveCmd, -1);
+ Tcl_IncrRefCount(slaveObjPtr);
targetObjPtr = Tcl_NewStringObj(targetCmd, -1);
Tcl_IncrRefCount(targetObjPtr);
- result = AliasCreate(childInterp, childInterp, targetInterp, childObjPtr,
+ result = AliasCreate(slaveInterp, slaveInterp, targetInterp, slaveObjPtr,
targetObjPtr, argc, objv);
for (i = 0; i < argc; i++) {
Tcl_DecrRefCount(objv[i]);
}
- TclStackFree(childInterp, objv);
+ TclStackFree(slaveInterp, objv);
Tcl_DecrRefCount(targetObjPtr);
- Tcl_DecrRefCount(childObjPtr);
+ Tcl_DecrRefCount(slaveObjPtr);
return result;
}
@@ -1242,26 +1163,26 @@ Tcl_CreateAlias(
int
Tcl_CreateAliasObj(
- Tcl_Interp *childInterp, /* Interpreter for source command. */
- const char *childCmd, /* Command to install in child. */
+ Tcl_Interp *slaveInterp, /* Interpreter for source command. */
+ const char *slaveCmd, /* Command to install in slave. */
Tcl_Interp *targetInterp, /* Interpreter for target command. */
const char *targetCmd, /* Name of target command. */
- Tcl_Size objc, /* How many additional arguments? */
+ int objc, /* How many additional arguments? */
Tcl_Obj *const objv[]) /* Argument vector. */
{
- Tcl_Obj *childObjPtr, *targetObjPtr;
+ Tcl_Obj *slaveObjPtr, *targetObjPtr;
int result;
- childObjPtr = Tcl_NewStringObj(childCmd, -1);
- Tcl_IncrRefCount(childObjPtr);
+ slaveObjPtr = Tcl_NewStringObj(slaveCmd, -1);
+ Tcl_IncrRefCount(slaveObjPtr);
targetObjPtr = Tcl_NewStringObj(targetCmd, -1);
Tcl_IncrRefCount(targetObjPtr);
- result = AliasCreate(childInterp, childInterp, targetInterp, childObjPtr,
+ result = AliasCreate(slaveInterp, slaveInterp, targetInterp, slaveObjPtr,
targetObjPtr, objc, objv);
- Tcl_DecrRefCount(childObjPtr);
+ Tcl_DecrRefCount(slaveObjPtr);
Tcl_DecrRefCount(targetObjPtr);
return result;
}
@@ -1298,14 +1219,13 @@ Tcl_GetAlias(
int i, objc;
Tcl_Obj **objv;
- hPtr = Tcl_FindHashEntry(&iiPtr->child.aliasTable, aliasName);
+ hPtr = Tcl_FindHashEntry(&iiPtr->slave.aliasTable, aliasName);
if (hPtr == NULL) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "alias \"%s\" not found", aliasName));
- Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS", aliasName, (void *)NULL);
+ Tcl_AppendResult(interp, "alias \"", aliasName, "\" not found", NULL);
+ Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS", aliasName, NULL);
return TCL_ERROR;
}
- aliasPtr = (Alias *)Tcl_GetHashValue(hPtr);
+ aliasPtr = Tcl_GetHashValue(hPtr);
objc = aliasPtr->objc;
objv = &aliasPtr->objPtr;
@@ -1320,7 +1240,7 @@ Tcl_GetAlias(
}
if (argvPtr != NULL) {
*argvPtr = (const char **)
- ckalloc(sizeof(const char *) * (objc - 1));
+ ckalloc((unsigned) sizeof(const char *) * (objc - 1));
for (i = 1; i < objc; i++) {
(*argvPtr)[i - 1] = TclGetString(objv[i]);
}
@@ -1360,14 +1280,13 @@ Tcl_GetAliasObj(
int objc;
Tcl_Obj **objv;
- hPtr = Tcl_FindHashEntry(&iiPtr->child.aliasTable, aliasName);
+ hPtr = Tcl_FindHashEntry(&iiPtr->slave.aliasTable, aliasName);
if (hPtr == NULL) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "alias \"%s\" not found", aliasName));
- Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS", aliasName, (void *)NULL);
+ Tcl_AppendResult(interp, "alias \"", aliasName, "\" not found", NULL);
+ Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS", aliasName, NULL);
return TCL_ERROR;
}
- aliasPtr = (Alias *)Tcl_GetHashValue(hPtr);
+ aliasPtr = Tcl_GetHashValue(hPtr);
objc = aliasPtr->objc;
objv = &aliasPtr->objPtr;
@@ -1425,8 +1344,7 @@ TclPreventAliasLoop(
* create or rename the command.
*/
- if (cmdPtr->objProc != TclAliasObjCmd
- && cmdPtr->objProc != TclLocalAliasObjCmd) {
+ if (cmdPtr->objProc != AliasObjCmd) {
return TCL_OK;
}
@@ -1436,7 +1354,7 @@ TclPreventAliasLoop(
* chain then we have a loop.
*/
- aliasPtr = (Alias *)cmdPtr->objClientData;
+ aliasPtr = (Alias *) cmdPtr->objClientData;
nextAliasPtr = aliasPtr;
while (1) {
Tcl_Obj *cmdNamePtr;
@@ -1448,13 +1366,13 @@ TclPreventAliasLoop(
if (Tcl_InterpDeleted(nextAliasPtr->targetInterp)) {
/*
- * The child interpreter can be deleted while creating the alias.
+ * The slave interpreter can be deleted while creating the alias.
* [Bug #641195]
*/
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "cannot define or rename alias \"%s\": interpreter deleted",
- Tcl_GetCommandName(cmdInterp, cmd)));
+ Tcl_AppendResult(interp, "cannot define or rename alias \"",
+ Tcl_GetCommandName(cmdInterp, cmd),
+ "\": interpreter deleted", NULL);
return TCL_ERROR;
}
cmdNamePtr = nextAliasPtr->objPtr;
@@ -1467,11 +1385,9 @@ TclPreventAliasLoop(
}
aliasCmdPtr = (Command *) aliasCmd;
if (aliasCmdPtr == cmdPtr) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "cannot define or rename alias \"%s\": would create a loop",
- Tcl_GetCommandName(cmdInterp, cmd)));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "ALIASLOOP", (void *)NULL);
+ Tcl_AppendResult(interp, "cannot define or rename alias \"",
+ Tcl_GetCommandName(cmdInterp, cmd),
+ "\": would create a loop", NULL);
return TCL_ERROR;
}
@@ -1481,12 +1397,13 @@ TclPreventAliasLoop(
* Otherwise we do not have a loop.
*/
- if (aliasCmdPtr->objProc != TclAliasObjCmd
- && aliasCmdPtr->objProc != TclLocalAliasObjCmd) {
+ if (aliasCmdPtr->objProc != AliasObjCmd) {
return TCL_OK;
}
- nextAliasPtr = (Alias *)aliasCmdPtr->objClientData;
+ nextAliasPtr = (Alias *) aliasCmdPtr->objClientData;
}
+
+ /* NOTREACHED */
}
/*
@@ -1501,7 +1418,7 @@ TclPreventAliasLoop(
*
* Side effects:
* An alias command is created and entered into the alias table for the
- * child interpreter.
+ * slave interpreter.
*
*----------------------------------------------------------------------
*/
@@ -1509,9 +1426,9 @@ TclPreventAliasLoop(
static int
AliasCreate(
Tcl_Interp *interp, /* Interp for error reporting. */
- Tcl_Interp *childInterp, /* Interp where alias cmd will live or from
+ Tcl_Interp *slaveInterp, /* Interp where alias cmd will live or from
* which alias will be deleted. */
- Tcl_Interp *parentInterp, /* Interp in which target command will be
+ Tcl_Interp *masterInterp, /* Interp in which target command will be
* invoked. */
Tcl_Obj *namePtr, /* Name of alias cmd. */
Tcl_Obj *targetNamePtr, /* Name of target cmd. */
@@ -1521,15 +1438,16 @@ AliasCreate(
Alias *aliasPtr;
Tcl_HashEntry *hPtr;
Target *targetPtr;
- Child *childPtr;
- Parent *parentPtr;
+ Slave *slavePtr;
+ Master *masterPtr;
Tcl_Obj **prefv;
int isNew, i;
- aliasPtr = (Alias *)ckalloc(sizeof(Alias) + objc * sizeof(Tcl_Obj *));
+ aliasPtr = (Alias *) ckalloc((unsigned) (sizeof(Alias)
+ + objc * sizeof(Tcl_Obj *)));
aliasPtr->token = namePtr;
Tcl_IncrRefCount(aliasPtr->token);
- aliasPtr->targetInterp = parentInterp;
+ aliasPtr->targetInterp = masterInterp;
aliasPtr->objc = objc + 1;
prefv = &aliasPtr->objPtr;
@@ -1541,21 +1459,15 @@ AliasCreate(
Tcl_IncrRefCount(objv[i]);
}
- Tcl_Preserve(childInterp);
- Tcl_Preserve(parentInterp);
+ Tcl_Preserve(slaveInterp);
+ Tcl_Preserve(masterInterp);
- if (childInterp == parentInterp) {
- aliasPtr->childCmd = Tcl_NRCreateCommand(childInterp,
- TclGetString(namePtr), TclLocalAliasObjCmd, AliasNRCmd,
- aliasPtr, AliasObjCmdDeleteProc);
- } else {
- aliasPtr->childCmd = Tcl_CreateObjCommand(childInterp,
- TclGetString(namePtr), TclAliasObjCmd, aliasPtr,
- AliasObjCmdDeleteProc);
- }
+ aliasPtr->slaveCmd = Tcl_CreateObjCommand(slaveInterp,
+ TclGetString(namePtr), AliasObjCmd, aliasPtr,
+ AliasObjCmdDeleteProc);
- if (TclPreventAliasLoop(interp, childInterp,
- aliasPtr->childCmd) != TCL_OK) {
+ if (TclPreventAliasLoop(interp, slaveInterp,
+ aliasPtr->slaveCmd) != TCL_OK) {
/*
* Found an alias loop! The last call to Tcl_CreateObjCommand made the
* alias point to itself. Delete the command and its alias record. Be
@@ -1571,20 +1483,20 @@ AliasCreate(
Tcl_DecrRefCount(objv[i]);
}
- cmdPtr = (Command *) aliasPtr->childCmd;
+ cmdPtr = (Command *) aliasPtr->slaveCmd;
cmdPtr->clientData = NULL;
cmdPtr->deleteProc = NULL;
cmdPtr->deleteData = NULL;
- Tcl_DeleteCommandFromToken(childInterp, aliasPtr->childCmd);
+ Tcl_DeleteCommandFromToken(slaveInterp, aliasPtr->slaveCmd);
- ckfree(aliasPtr);
+ ckfree((char *) aliasPtr);
/*
* The result was already set by TclPreventAliasLoop.
*/
- Tcl_Release(childInterp);
- Tcl_Release(parentInterp);
+ Tcl_Release(slaveInterp);
+ Tcl_Release(masterInterp);
return TCL_ERROR;
}
@@ -1592,13 +1504,13 @@ AliasCreate(
* Make an entry in the alias table. If it already exists, retry.
*/
- childPtr = &((InterpInfo *) ((Interp *) childInterp)->interpInfo)->child;
+ slavePtr = &((InterpInfo *) ((Interp *) slaveInterp)->interpInfo)->slave;
while (1) {
Tcl_Obj *newToken;
- const char *string;
+ char *string;
string = TclGetString(aliasPtr->token);
- hPtr = Tcl_CreateHashEntry(&childPtr->aliasTable, string, &isNew);
+ hPtr = Tcl_CreateHashEntry(&slavePtr->aliasTable, string, &isNew);
if (isNew != 0) {
break;
}
@@ -1634,23 +1546,23 @@ AliasCreate(
* interp alias {} foo {} zop # Now recreate "foo"...
*/
- targetPtr = (Target *)ckalloc(sizeof(Target));
- targetPtr->childCmd = aliasPtr->childCmd;
- targetPtr->childInterp = childInterp;
+ targetPtr = (Target *) ckalloc((unsigned) sizeof(Target));
+ targetPtr->slaveCmd = aliasPtr->slaveCmd;
+ targetPtr->slaveInterp = slaveInterp;
- parentPtr = &((InterpInfo*) ((Interp*) parentInterp)->interpInfo)->parent;
- targetPtr->nextPtr = parentPtr->targetsPtr;
+ masterPtr = &((InterpInfo *) ((Interp*) masterInterp)->interpInfo)->master;
+ targetPtr->nextPtr = masterPtr->targetsPtr;
targetPtr->prevPtr = NULL;
- if (parentPtr->targetsPtr != NULL) {
- parentPtr->targetsPtr->prevPtr = targetPtr;
+ if (masterPtr->targetsPtr != NULL) {
+ masterPtr->targetsPtr->prevPtr = targetPtr;
}
- parentPtr->targetsPtr = targetPtr;
+ masterPtr->targetsPtr = targetPtr;
aliasPtr->targetPtr = targetPtr;
Tcl_SetObjResult(interp, aliasPtr->token);
- Tcl_Release(childInterp);
- Tcl_Release(parentInterp);
+ Tcl_Release(slaveInterp);
+ Tcl_Release(masterInterp);
return TCL_OK;
}
@@ -1659,13 +1571,13 @@ AliasCreate(
*
* AliasDelete --
*
- * Deletes the given alias from the child interpreter given.
+ * Deletes the given alias from the slave interpreter given.
*
* Results:
* A standard Tcl result.
*
* Side effects:
- * Deletes the alias from the child interpreter.
+ * Deletes the alias from the slave interpreter.
*
*----------------------------------------------------------------------
*/
@@ -1673,30 +1585,30 @@ AliasCreate(
static int
AliasDelete(
Tcl_Interp *interp, /* Interpreter for result & errors. */
- Tcl_Interp *childInterp, /* Interpreter containing alias. */
+ Tcl_Interp *slaveInterp, /* Interpreter containing alias. */
Tcl_Obj *namePtr) /* Name of alias to delete. */
{
- Child *childPtr;
+ Slave *slavePtr;
Alias *aliasPtr;
Tcl_HashEntry *hPtr;
/*
- * If the alias has been renamed in the child, the parent can still use
+ * If the alias has been renamed in the slave, the master can still use
* the original name (with which it was created) to find the alias to
* delete it.
*/
- childPtr = &((InterpInfo *) ((Interp *) childInterp)->interpInfo)->child;
- hPtr = Tcl_FindHashEntry(&childPtr->aliasTable, TclGetString(namePtr));
+ slavePtr = &((InterpInfo *) ((Interp *) slaveInterp)->interpInfo)->slave;
+ hPtr = Tcl_FindHashEntry(&slavePtr->aliasTable, TclGetString(namePtr));
if (hPtr == NULL) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "alias \"%s\" not found", TclGetString(namePtr)));
+ Tcl_AppendResult(interp, "alias \"", TclGetString(namePtr),
+ "\" not found", NULL);
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS",
- TclGetString(namePtr), (void *)NULL);
+ TclGetString(namePtr), NULL);
return TCL_ERROR;
}
- aliasPtr = (Alias *)Tcl_GetHashValue(hPtr);
- Tcl_DeleteCommandFromToken(childInterp, aliasPtr->childCmd);
+ aliasPtr = Tcl_GetHashValue(hPtr);
+ Tcl_DeleteCommandFromToken(slaveInterp, aliasPtr->slaveCmd);
return TCL_OK;
}
@@ -1721,26 +1633,26 @@ AliasDelete(
static int
AliasDescribe(
Tcl_Interp *interp, /* Interpreter for result & errors. */
- Tcl_Interp *childInterp, /* Interpreter containing alias. */
+ Tcl_Interp *slaveInterp, /* Interpreter containing alias. */
Tcl_Obj *namePtr) /* Name of alias to describe. */
{
- Child *childPtr;
+ Slave *slavePtr;
Tcl_HashEntry *hPtr;
Alias *aliasPtr;
Tcl_Obj *prefixPtr;
/*
- * If the alias has been renamed in the child, the parent can still use
+ * If the alias has been renamed in the slave, the master can still use
* the original name (with which it was created) to find the alias to
* describe it.
*/
- childPtr = &((InterpInfo *) ((Interp *) childInterp)->interpInfo)->child;
- hPtr = Tcl_FindHashEntry(&childPtr->aliasTable, Tcl_GetString(namePtr));
+ slavePtr = &((InterpInfo *) ((Interp *) slaveInterp)->interpInfo)->slave;
+ hPtr = Tcl_FindHashEntry(&slavePtr->aliasTable, Tcl_GetString(namePtr));
if (hPtr == NULL) {
return TCL_OK;
}
- aliasPtr = (Alias *)Tcl_GetHashValue(hPtr);
+ aliasPtr = Tcl_GetHashValue(hPtr);
prefixPtr = Tcl_NewListObj(aliasPtr->objc, &aliasPtr->objPtr);
Tcl_SetObjResult(interp, prefixPtr);
return TCL_OK;
@@ -1751,7 +1663,7 @@ AliasDescribe(
*
* AliasList --
*
- * Computes a list of aliases defined in a child interpreter.
+ * Computes a list of aliases defined in a slave interpreter.
*
* Results:
* A standard Tcl result.
@@ -1765,20 +1677,19 @@ AliasDescribe(
static int
AliasList(
Tcl_Interp *interp, /* Interp for data return. */
- Tcl_Interp *childInterp) /* Interp whose aliases to compute. */
+ Tcl_Interp *slaveInterp) /* Interp whose aliases to compute. */
{
Tcl_HashEntry *entryPtr;
Tcl_HashSearch hashSearch;
- Tcl_Obj *resultPtr;
+ Tcl_Obj *resultPtr = Tcl_NewObj();
Alias *aliasPtr;
- Child *childPtr;
+ Slave *slavePtr;
- TclNewObj(resultPtr);
- childPtr = &((InterpInfo *) ((Interp *) childInterp)->interpInfo)->child;
+ slavePtr = &((InterpInfo *) ((Interp *) slaveInterp)->interpInfo)->slave;
- entryPtr = Tcl_FirstHashEntry(&childPtr->aliasTable, &hashSearch);
+ entryPtr = Tcl_FirstHashEntry(&slavePtr->aliasTable, &hashSearch);
for ( ; entryPtr != NULL; entryPtr = Tcl_NextHashEntry(&hashSearch)) {
- aliasPtr = (Alias *)Tcl_GetHashValue(entryPtr);
+ aliasPtr = Tcl_GetHashValue(entryPtr);
Tcl_ListObjAppendElement(NULL, resultPtr, aliasPtr->token);
}
Tcl_SetObjResult(interp, resultPtr);
@@ -1788,19 +1699,14 @@ AliasList(
/*
*----------------------------------------------------------------------
*
- * TclAliasObjCmd, TclLocalAliasObjCmd --
+ * AliasObjCmd --
*
- * This is the function that services invocations of aliases in a child
+ * This is the function that services invocations of aliases in a slave
* interpreter. One such command exists for each alias. When invoked,
* this function redirects the invocation to the target command in the
- * parent interpreter as designated by the Alias record associated with
+ * master interpreter as designated by the Alias record associated with
* this command.
*
- * TclLocalAliasObjCmd is a stripped down version used when the source
- * and target interpreters of the alias are the same. That lets a number
- * of safety precautions be avoided: the state is much more precisely
- * known.
- *
* Results:
* A standard Tcl result.
*
@@ -1813,73 +1719,20 @@ AliasList(
*/
static int
-AliasNRCmd(
- void *clientData, /* Alias record. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument vector. */
-{
- Alias *aliasPtr = (Alias *)clientData;
- int prefc, cmdc, i;
- Tcl_Obj **prefv, **cmdv;
- Tcl_Obj *listPtr;
- ListRep listRep;
- int flags = TCL_EVAL_INVOKE;
-
- /*
- * Append the arguments to the command prefix and invoke the command in
- * the target interp's global namespace.
- */
-
- prefc = aliasPtr->objc;
- prefv = &aliasPtr->objPtr;
- cmdc = prefc + objc - 1;
-
- /* TODO - encapsulate this into tclListObj.c */
- listPtr = Tcl_NewListObj(cmdc, NULL);
- ListObjGetRep(listPtr, &listRep);
- cmdv = ListRepElementsBase(&listRep);
- listRep.storePtr->numUsed = cmdc;
- if (listRep.spanPtr) {
- listRep.spanPtr->spanStart = listRep.storePtr->firstUsed;
- listRep.spanPtr->spanLength = listRep.storePtr->numUsed;
- }
-
- prefv = &aliasPtr->objPtr;
- memcpy(cmdv, prefv, prefc * sizeof(Tcl_Obj *));
- memcpy(cmdv+prefc, objv+1, (objc-1) * sizeof(Tcl_Obj *));
-
- for (i=0; i<cmdc; i++) {
- Tcl_IncrRefCount(cmdv[i]);
- }
-
- /*
- * Use the ensemble rewriting machinery to ensure correct error messages:
- * only the source command should show, not the full target prefix.
- */
-
- if (TclInitRewriteEnsemble(interp, 1, prefc, objv)) {
- TclNRAddCallback(interp, TclClearRootEnsemble, NULL, NULL, NULL, NULL);
- }
- TclSkipTailcall(interp);
- return Tcl_NREvalObj(interp, listPtr, flags);
-}
-
-int
-TclAliasObjCmd(
- void *clientData, /* Alias record. */
+AliasObjCmd(
+ ClientData clientData, /* Alias record. */
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument vector. */
{
#define ALIAS_CMDV_PREALLOC 10
- Alias *aliasPtr = (Alias *)clientData;
+ Alias *aliasPtr = clientData;
Tcl_Interp *targetInterp = aliasPtr->targetInterp;
int result, prefc, cmdc, i;
Tcl_Obj **prefv, **cmdv;
Tcl_Obj *cmdArr[ALIAS_CMDV_PREALLOC];
Interp *tPtr = (Interp *) targetInterp;
- int isRootEnsemble;
+ int isRootEnsemble = (tPtr->ensembleRewrite.sourceObjs == NULL);
/*
* Append the arguments to the command prefix and invoke the command in
@@ -1892,11 +1745,11 @@ TclAliasObjCmd(
if (cmdc <= ALIAS_CMDV_PREALLOC) {
cmdv = cmdArr;
} else {
- cmdv = (Tcl_Obj **)TclStackAlloc(interp, cmdc * sizeof(Tcl_Obj *));
+ cmdv = (Tcl_Obj **) TclStackAlloc(interp, cmdc*(int)sizeof(Tcl_Obj*));
}
- memcpy(cmdv, prefv, prefc * sizeof(Tcl_Obj *));
- memcpy(cmdv+prefc, objv+1, (objc-1) * sizeof(Tcl_Obj *));
+ memcpy(cmdv, prefv, (size_t) (prefc * sizeof(Tcl_Obj *)));
+ memcpy(cmdv+prefc, objv+1, (size_t) ((objc-1) * sizeof(Tcl_Obj *)));
Tcl_ResetResult(targetInterp);
@@ -1909,7 +1762,13 @@ TclAliasObjCmd(
* only the source command should show, not the full target prefix.
*/
- isRootEnsemble = TclInitRewriteEnsemble((Tcl_Interp *)tPtr, 1, prefc, objv);
+ if (isRootEnsemble) {
+ tPtr->ensembleRewrite.sourceObjs = objv;
+ tPtr->ensembleRewrite.numRemovedObjs = 1;
+ tPtr->ensembleRewrite.numInsertedObjs = prefc;
+ } else {
+ tPtr->ensembleRewrite.numInsertedObjs += prefc - 1;
+ }
/*
* Protect the target interpreter if it isn't the same as the source
@@ -1932,7 +1791,9 @@ TclAliasObjCmd(
*/
if (isRootEnsemble) {
- TclResetRewriteEnsemble((Tcl_Interp *)tPtr, 1);
+ tPtr->ensembleRewrite.sourceObjs = NULL;
+ tPtr->ensembleRewrite.numRemovedObjs = 0;
+ tPtr->ensembleRewrite.numInsertedObjs = 0;
}
/*
@@ -1942,7 +1803,7 @@ TclAliasObjCmd(
*/
if (targetInterp != interp) {
- Tcl_TransferResult(targetInterp, result, interp);
+ TclTransferResult(targetInterp, result, interp);
Tcl_Release(targetInterp);
}
@@ -1955,80 +1816,13 @@ TclAliasObjCmd(
return result;
#undef ALIAS_CMDV_PREALLOC
}
-
-int
-TclLocalAliasObjCmd(
- void *clientData, /* Alias record. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument vector. */
-{
-#define ALIAS_CMDV_PREALLOC 10
- Alias *aliasPtr = (Alias *)clientData;
- int result, prefc, cmdc, i;
- Tcl_Obj **prefv, **cmdv;
- Tcl_Obj *cmdArr[ALIAS_CMDV_PREALLOC];
- Interp *iPtr = (Interp *) interp;
- int isRootEnsemble;
-
- /*
- * Append the arguments to the command prefix and invoke the command in
- * the global namespace.
- */
-
- prefc = aliasPtr->objc;
- prefv = &aliasPtr->objPtr;
- cmdc = prefc + objc - 1;
- if (cmdc <= ALIAS_CMDV_PREALLOC) {
- cmdv = cmdArr;
- } else {
- cmdv = (Tcl_Obj **)TclStackAlloc(interp, cmdc * sizeof(Tcl_Obj *));
- }
-
- memcpy(cmdv, prefv, prefc * sizeof(Tcl_Obj *));
- memcpy(cmdv+prefc, objv+1, (objc-1) * sizeof(Tcl_Obj *));
-
- for (i=0; i<cmdc; i++) {
- Tcl_IncrRefCount(cmdv[i]);
- }
-
- /*
- * Use the ensemble rewriting machinery to ensure correct error messages:
- * only the source command should show, not the full target prefix.
- */
-
- isRootEnsemble = TclInitRewriteEnsemble((Tcl_Interp *)iPtr, 1, prefc, objv);
-
- /*
- * Execute the target command in the target interpreter.
- */
-
- result = Tcl_EvalObjv(interp, cmdc, cmdv, TCL_EVAL_INVOKE);
-
- /*
- * Clean up the ensemble rewrite info if we set it in the first place.
- */
-
- if (isRootEnsemble) {
- TclResetRewriteEnsemble((Tcl_Interp *)iPtr, 1);
- }
-
- for (i=0; i<cmdc; i++) {
- Tcl_DecrRefCount(cmdv[i]);
- }
- if (cmdv != cmdArr) {
- TclStackFree(interp, cmdv);
- }
- return result;
-#undef ALIAS_CMDV_PREALLOC
-}
/*
*----------------------------------------------------------------------
*
* AliasObjCmdDeleteProc --
*
- * Is invoked when an alias command is deleted in a child. Cleans up all
+ * Is invoked when an alias command is deleted in a slave. Cleans up all
* storage associated with this alias.
*
* Results:
@@ -2043,9 +1837,9 @@ TclLocalAliasObjCmd(
static void
AliasObjCmdDeleteProc(
- void *clientData) /* The alias record for this alias. */
+ ClientData clientData) /* The alias record for this alias. */
{
- Alias *aliasPtr = (Alias *)clientData;
+ Alias *aliasPtr = clientData;
Target *targetPtr;
int i;
Tcl_Obj **objv;
@@ -2058,36 +1852,36 @@ AliasObjCmdDeleteProc(
Tcl_DeleteHashEntry(aliasPtr->aliasEntryPtr);
/*
- * Splice the target record out of the target interpreter's parent list.
+ * Splice the target record out of the target interpreter's master list.
*/
targetPtr = aliasPtr->targetPtr;
if (targetPtr->prevPtr != NULL) {
targetPtr->prevPtr->nextPtr = targetPtr->nextPtr;
} else {
- Parent *parentPtr = &((InterpInfo *) ((Interp *)
- aliasPtr->targetInterp)->interpInfo)->parent;
+ Master *masterPtr = &((InterpInfo *) ((Interp *)
+ aliasPtr->targetInterp)->interpInfo)->master;
- parentPtr->targetsPtr = targetPtr->nextPtr;
+ masterPtr->targetsPtr = targetPtr->nextPtr;
}
if (targetPtr->nextPtr != NULL) {
targetPtr->nextPtr->prevPtr = targetPtr->prevPtr;
}
- ckfree(targetPtr);
- ckfree(aliasPtr);
+ ckfree((char *) targetPtr);
+ ckfree((char *) aliasPtr);
}
/*
*----------------------------------------------------------------------
*
- * Tcl_CreateChild --
+ * Tcl_CreateSlave --
*
- * Creates a child interpreter. The childPath argument denotes the name
- * of the new child relative to the current interpreter; the child is a
+ * Creates a slave interpreter. The slavePath argument denotes the name
+ * of the new slave relative to the current interpreter; the slave is a
* direct descendant of the one-before-last component of the path,
- * e.g. it is a descendant of the current interpreter if the childPath
- * argument contains only one component. Optionally makes the child
+ * e.g. it is a descendant of the current interpreter if the slavePath
+ * argument contains only one component. Optionally makes the slave
* interpreter safe.
*
* Results:
@@ -2096,33 +1890,33 @@ AliasObjCmdDeleteProc(
*
* Side effects:
* Creates a new interpreter and a new interpreter object command in the
- * interpreter indicated by the childPath argument.
+ * interpreter indicated by the slavePath argument.
*
*----------------------------------------------------------------------
*/
Tcl_Interp *
-Tcl_CreateChild(
+Tcl_CreateSlave(
Tcl_Interp *interp, /* Interpreter to start search at. */
- const char *childPath, /* Name of child to create. */
- int isSafe) /* Should new child be "safe" ? */
+ const char *slavePath, /* Name of slave to create. */
+ int isSafe) /* Should new slave be "safe" ? */
{
Tcl_Obj *pathPtr;
- Tcl_Interp *childInterp;
+ Tcl_Interp *slaveInterp;
- pathPtr = Tcl_NewStringObj(childPath, -1);
- childInterp = ChildCreate(interp, pathPtr, isSafe);
+ pathPtr = Tcl_NewStringObj(slavePath, -1);
+ slaveInterp = SlaveCreate(interp, pathPtr, isSafe);
Tcl_DecrRefCount(pathPtr);
- return childInterp;
+ return slaveInterp;
}
/*
*----------------------------------------------------------------------
*
- * Tcl_GetChild --
+ * Tcl_GetSlave --
*
- * Finds a child interpreter by its path name.
+ * Finds a slave interpreter by its path name.
*
* Results:
* Returns a Tcl_Interp * for the named interpreter or NULL if not found.
@@ -2134,29 +1928,29 @@ Tcl_CreateChild(
*/
Tcl_Interp *
-Tcl_GetChild(
+Tcl_GetSlave(
Tcl_Interp *interp, /* Interpreter to start search from. */
- const char *childPath) /* Path of child to find. */
+ const char *slavePath) /* Path of slave to find. */
{
Tcl_Obj *pathPtr;
- Tcl_Interp *childInterp;
+ Tcl_Interp *slaveInterp;
- pathPtr = Tcl_NewStringObj(childPath, -1);
- childInterp = GetInterp(interp, pathPtr);
+ pathPtr = Tcl_NewStringObj(slavePath, -1);
+ slaveInterp = GetInterp(interp, pathPtr);
Tcl_DecrRefCount(pathPtr);
- return childInterp;
+ return slaveInterp;
}
/*
*----------------------------------------------------------------------
*
- * Tcl_GetParent --
+ * Tcl_GetMaster --
*
- * Finds the parent interpreter of a child interpreter.
+ * Finds the master interpreter of a slave interpreter.
*
* Results:
- * Returns a Tcl_Interp * for the parent interpreter or NULL if none.
+ * Returns a Tcl_Interp * for the master interpreter or NULL if none.
*
* Side effects:
* None.
@@ -2165,82 +1959,16 @@ Tcl_GetChild(
*/
Tcl_Interp *
-Tcl_GetParent(
- Tcl_Interp *interp) /* Get the parent of this interpreter. */
+Tcl_GetMaster(
+ Tcl_Interp *interp) /* Get the master of this interpreter. */
{
- Child *childPtr; /* Child record of this interpreter. */
+ Slave *slavePtr; /* Slave record of this interpreter. */
if (interp == NULL) {
return NULL;
}
- childPtr = &((InterpInfo *) ((Interp *) interp)->interpInfo)->child;
- return childPtr->parentInterp;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TclSetChildCancelFlags --
- *
- * This function marks all child interpreters belonging to a given
- * interpreter as being canceled or not canceled, depending on the
- * provided flags.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TclSetChildCancelFlags(
- Tcl_Interp *interp, /* Set cancel flags of this interpreter. */
- int flags, /* Collection of OR-ed bits that control
- * the cancellation of the script. Only
- * TCL_CANCEL_UNWIND is currently
- * supported. */
- int force) /* Non-zero to ignore numLevels for the purpose
- * of resetting the cancellation flags. */
-{
- Parent *parentPtr; /* Parent record of given interpreter. */
- Tcl_HashEntry *hPtr; /* Search element. */
- Tcl_HashSearch hashSearch; /* Search variable. */
- Child *childPtr; /* Child record of interpreter. */
- Interp *iPtr;
-
- if (interp == NULL) {
- return;
- }
-
- flags &= (CANCELED | TCL_CANCEL_UNWIND);
-
- parentPtr = &((InterpInfo *) ((Interp *) interp)->interpInfo)->parent;
-
- hPtr = Tcl_FirstHashEntry(&parentPtr->childTable, &hashSearch);
- for ( ; hPtr != NULL; hPtr = Tcl_NextHashEntry(&hashSearch)) {
- childPtr = (Child *)Tcl_GetHashValue(hPtr);
- iPtr = (Interp *) childPtr->childInterp;
-
- if (iPtr == NULL) {
- continue;
- }
-
- if (flags == 0) {
- TclResetCancellation((Tcl_Interp *) iPtr, force);
- } else {
- TclSetCancelFlags(iPtr, flags);
- }
-
- /*
- * Now, recursively handle this for the children of this child
- * interpreter.
- */
-
- TclSetChildCancelFlags((Tcl_Interp *) iPtr, flags, force);
- }
+ slavePtr = &((InterpInfo *) ((Interp *) interp)->interpInfo)->slave;
+ return slavePtr->masterInterp;
}
/*
@@ -2251,7 +1979,7 @@ TclSetChildCancelFlags(
* Sets the result of the asking interpreter to a proper Tcl list
* containing the names of interpreters between the asking and target
* interpreters. The target interpreter must be either the same as the
- * asking interpreter or one of its children (including recursively).
+ * asking interpreter or one of its slaves (including recursively).
*
* Results:
* TCL_OK if the target interpreter is the same as, or a descendant of,
@@ -2269,25 +1997,23 @@ TclSetChildCancelFlags(
int
Tcl_GetInterpPath(
- Tcl_Interp *interp, /* Interpreter to start search from. */
+ Tcl_Interp *askingInterp, /* Interpreter to start search from. */
Tcl_Interp *targetInterp) /* Interpreter to find. */
{
InterpInfo *iiPtr;
- if (targetInterp == interp) {
- Tcl_ResetResult(interp);
+ if (targetInterp == askingInterp) {
return TCL_OK;
}
if (targetInterp == NULL) {
return TCL_ERROR;
}
iiPtr = (InterpInfo *) ((Interp *) targetInterp)->interpInfo;
- if (Tcl_GetInterpPath(interp, iiPtr->child.parentInterp) != TCL_OK){
+ if (Tcl_GetInterpPath(askingInterp, iiPtr->slave.masterInterp) != TCL_OK) {
return TCL_ERROR;
}
- Tcl_ListObjAppendElement(NULL, Tcl_GetObjResult(interp),
- Tcl_NewStringObj((const char *)Tcl_GetHashKey(&iiPtr->parent.childTable,
- iiPtr->child.childEntryPtr), -1));
+ Tcl_AppendElement(askingInterp, Tcl_GetHashKey(&iiPtr->master.slaveTable,
+ iiPtr->slave.slaveEntryPtr));
return TCL_OK;
}
@@ -2296,10 +2022,10 @@ Tcl_GetInterpPath(
*
* GetInterp --
*
- * Helper function to find a child interpreter given a pathname.
+ * Helper function to find a slave interpreter given a pathname.
*
* Results:
- * Returns the child interpreter known by that name in the calling
+ * Returns the slave interpreter known by that name in the calling
* interpreter, or NULL if no interpreter known by that name exists.
*
* Side effects:
@@ -2315,11 +2041,11 @@ GetInterp(
* be found. */
{
Tcl_HashEntry *hPtr; /* Search element. */
- Child *childPtr; /* Interim child record. */
+ Slave *slavePtr; /* Interim slave record. */
Tcl_Obj **objv;
- Tcl_Size objc, i;
+ int objc, i;
Tcl_Interp *searchInterp; /* Interim storage for interp. to find. */
- InterpInfo *parentInfoPtr;
+ InterpInfo *masterInfoPtr;
if (TclListObjGetElements(interp, pathPtr, &objc, &objv) != TCL_OK) {
return NULL;
@@ -2327,24 +2053,24 @@ GetInterp(
searchInterp = interp;
for (i = 0; i < objc; i++) {
- parentInfoPtr = (InterpInfo *) ((Interp *) searchInterp)->interpInfo;
- hPtr = Tcl_FindHashEntry(&parentInfoPtr->parent.childTable,
+ masterInfoPtr = (InterpInfo *) ((Interp *) searchInterp)->interpInfo;
+ hPtr = Tcl_FindHashEntry(&masterInfoPtr->master.slaveTable,
TclGetString(objv[i]));
if (hPtr == NULL) {
searchInterp = NULL;
break;
}
- childPtr = (Child *)Tcl_GetHashValue(hPtr);
- searchInterp = childPtr->childInterp;
+ slavePtr = Tcl_GetHashValue(hPtr);
+ searchInterp = slavePtr->slaveInterp;
if (searchInterp == NULL) {
break;
}
}
if (searchInterp == NULL) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "could not find interpreter \"%s\"", TclGetString(pathPtr)));
+ Tcl_AppendResult(interp, "could not find interpreter \"",
+ TclGetString(pathPtr), "\"", NULL);
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "INTERP",
- TclGetString(pathPtr), (void *)NULL);
+ TclGetString(pathPtr), NULL);
}
return searchInterp;
}
@@ -2352,7 +2078,7 @@ GetInterp(
/*
*----------------------------------------------------------------------
*
- * ChildBgerror --
+ * SlaveBgerror --
*
* Helper function to set/query the background error handling command
* prefix of an interp
@@ -2361,43 +2087,41 @@ GetInterp(
* A standard Tcl result.
*
* Side effects:
- * When (objc == 1), childInterp will be set to a new background handler
+ * When (objc == 1), slaveInterp will be set to a new background handler
* of objv[0].
*
*----------------------------------------------------------------------
*/
static int
-ChildBgerror(
+SlaveBgerror(
Tcl_Interp *interp, /* Interp for error return. */
- Tcl_Interp *childInterp, /* Interp in which limit is set/queried. */
+ Tcl_Interp *slaveInterp, /* Interp in which limit is set/queried. */
int objc, /* Set or Query. */
Tcl_Obj *const objv[]) /* Argument strings. */
{
if (objc) {
- Tcl_Size length;
+ int length;
if (TCL_ERROR == TclListObjLength(NULL, objv[0], &length)
|| (length < 1)) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "cmdPrefix must be list of length >= 1", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "BGERRORFORMAT", (void *)NULL);
+ Tcl_AppendResult(interp, "cmdPrefix must be list of length >= 1",
+ NULL);
return TCL_ERROR;
}
- TclSetBgErrorHandler(childInterp, objv[0]);
+ TclSetBgErrorHandler(slaveInterp, objv[0]);
}
- Tcl_SetObjResult(interp, TclGetBgErrorHandler(childInterp));
+ Tcl_SetObjResult(interp, TclGetBgErrorHandler(slaveInterp));
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
- * ChildCreate --
+ * SlaveCreate --
*
- * Helper function to do the actual work of creating a child interp and
- * new object command. Also optionally makes the new child interpreter
+ * Helper function to do the actual work of creating a slave interp and
+ * new object command. Also optionally makes the new slave interpreter
* "safe".
*
* Results:
@@ -2405,102 +2129,100 @@ ChildBgerror(
* the result of the invoking interpreter contains an error message.
*
* Side effects:
- * Creates a new child interpreter and a new object command.
+ * Creates a new slave interpreter and a new object command.
*
*----------------------------------------------------------------------
*/
static Tcl_Interp *
-ChildCreate(
+SlaveCreate(
Tcl_Interp *interp, /* Interp. to start search from. */
- Tcl_Obj *pathPtr, /* Path (name) of child to create. */
+ Tcl_Obj *pathPtr, /* Path (name) of slave to create. */
int safe) /* Should we make it "safe"? */
{
- Tcl_Interp *parentInterp, *childInterp;
- Child *childPtr;
- InterpInfo *parentInfoPtr;
+ Tcl_Interp *masterInterp, *slaveInterp;
+ Slave *slavePtr;
+ InterpInfo *masterInfoPtr;
Tcl_HashEntry *hPtr;
- const char *path;
- int isNew;
- Tcl_Size objc;
+ char *path;
+ int isNew, objc;
Tcl_Obj **objv;
- if (TclListObjGetElements(interp, pathPtr, &objc, &objv) != TCL_OK) {
+ if (Tcl_ListObjGetElements(interp, pathPtr, &objc, &objv) != TCL_OK) {
return NULL;
}
if (objc < 2) {
- parentInterp = interp;
+ masterInterp = interp;
path = TclGetString(pathPtr);
} else {
Tcl_Obj *objPtr;
objPtr = Tcl_NewListObj(objc - 1, objv);
- parentInterp = GetInterp(interp, objPtr);
+ masterInterp = GetInterp(interp, objPtr);
Tcl_DecrRefCount(objPtr);
- if (parentInterp == NULL) {
+ if (masterInterp == NULL) {
return NULL;
}
path = TclGetString(objv[objc - 1]);
}
if (safe == 0) {
- safe = Tcl_IsSafe(parentInterp);
+ safe = Tcl_IsSafe(masterInterp);
}
- parentInfoPtr = (InterpInfo *) ((Interp *) parentInterp)->interpInfo;
- hPtr = Tcl_CreateHashEntry(&parentInfoPtr->parent.childTable, path,
+ masterInfoPtr = (InterpInfo *) ((Interp *) masterInterp)->interpInfo;
+ hPtr = Tcl_CreateHashEntry(&masterInfoPtr->master.slaveTable, path,
&isNew);
if (isNew == 0) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "interpreter named \"%s\" already exists, cannot create",
- path));
+ Tcl_AppendResult(interp, "interpreter named \"", path,
+ "\" already exists, cannot create", NULL);
return NULL;
}
- childInterp = Tcl_CreateInterp();
- childPtr = &((InterpInfo *) ((Interp *) childInterp)->interpInfo)->child;
- childPtr->parentInterp = parentInterp;
- childPtr->childEntryPtr = hPtr;
- childPtr->childInterp = childInterp;
- childPtr->interpCmd = Tcl_NRCreateCommand(parentInterp, path,
- TclChildObjCmd, NRChildCmd, childInterp, ChildObjCmdDeleteProc);
- Tcl_InitHashTable(&childPtr->aliasTable, TCL_STRING_KEYS);
- Tcl_SetHashValue(hPtr, childPtr);
- Tcl_SetVar2(childInterp, "tcl_interactive", NULL, "0", TCL_GLOBAL_ONLY);
+ slaveInterp = Tcl_CreateInterp();
+ slavePtr = &((InterpInfo *) ((Interp *) slaveInterp)->interpInfo)->slave;
+ slavePtr->masterInterp = masterInterp;
+ slavePtr->slaveEntryPtr = hPtr;
+ slavePtr->slaveInterp = slaveInterp;
+ slavePtr->interpCmd = Tcl_CreateObjCommand(masterInterp, path,
+ SlaveObjCmd, slaveInterp, SlaveObjCmdDeleteProc);
+ Tcl_InitHashTable(&slavePtr->aliasTable, TCL_STRING_KEYS);
+ Tcl_SetHashValue(hPtr, slavePtr);
+ Tcl_SetVar(slaveInterp, "tcl_interactive", "0", TCL_GLOBAL_ONLY);
/*
* Inherit the recursion limit.
*/
- ((Interp *) childInterp)->maxNestingDepth =
- ((Interp *) parentInterp)->maxNestingDepth;
+ ((Interp *) slaveInterp)->maxNestingDepth =
+ ((Interp *) masterInterp)->maxNestingDepth;
if (safe) {
- if (TclMakeSafe(childInterp) == TCL_ERROR) {
+ if (Tcl_MakeSafe(slaveInterp) == TCL_ERROR) {
goto error;
}
} else {
- if (Tcl_Init(childInterp) == TCL_ERROR) {
+ if (Tcl_Init(slaveInterp) == TCL_ERROR) {
goto error;
}
/*
- * This will create the "memory" command in child interpreters if we
+ * This will create the "memory" command in slave interpreters if we
* compiled with TCL_MEM_DEBUG, otherwise it does nothing.
*/
- Tcl_InitMemory(childInterp);
+ Tcl_InitMemory(slaveInterp);
}
/*
* Inherit the TIP#143 limits.
*/
- InheritLimitsFromParent(childInterp, parentInterp);
+ InheritLimitsFromMaster(slaveInterp, masterInterp);
/*
* The [clock] command presents a safe API, but uses unsafe features in
* its implementation. This means it has to be implemented in safe interps
- * as an alias to a version in the (trusted) parent.
+ * as an alias to a version in the (trusted) master.
*/
if (safe) {
@@ -2509,7 +2231,7 @@ ChildCreate(
TclNewLiteralStringObj(clockObj, "clock");
Tcl_IncrRefCount(clockObj);
- status = AliasCreate(interp, childInterp, parentInterp, clockObj,
+ status = AliasCreate(interp, slaveInterp, masterInterp, clockObj,
clockObj, 0, NULL);
Tcl_DecrRefCount(clockObj);
if (status != TCL_OK) {
@@ -2517,12 +2239,12 @@ ChildCreate(
}
}
- return childInterp;
+ return slaveInterp;
error:
- Tcl_TransferResult(childInterp, TCL_ERROR, interp);
+ TclTransferResult(slaveInterp, TCL_ERROR, interp);
error2:
- Tcl_DeleteInterp(childInterp);
+ Tcl_DeleteInterp(slaveInterp);
return NULL;
}
@@ -2530,10 +2252,10 @@ ChildCreate(
/*
*----------------------------------------------------------------------
*
- * TclChildObjCmd --
+ * SlaveObjCmd --
*
* Command to manipulate an interpreter, e.g. to send commands to it to
- * be evaluated. One such command exists for each child interpreter.
+ * be evaluated. One such command exists for each slave interpreter.
*
* Results:
* A standard Tcl result.
@@ -2544,40 +2266,28 @@ ChildCreate(
*----------------------------------------------------------------------
*/
-int
-TclChildObjCmd(
- void *clientData, /* Child interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *const objv[]) /* Argument objects. */
-{
- return Tcl_NRCallObjProc(interp, NRChildCmd, clientData, objc, objv);
-}
-
static int
-NRChildCmd(
- void *clientData, /* Child interpreter. */
+SlaveObjCmd(
+ ClientData clientData, /* Slave interpreter. */
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- Tcl_Interp *childInterp = (Tcl_Interp *)clientData;
+ Tcl_Interp *slaveInterp = clientData;
int index;
- static const char *const options[] = {
- "alias", "aliases", "bgerror", "debug",
- "eval", "expose", "hide", "hidden",
- "issafe", "invokehidden", "limit", "marktrusted",
- "recursionlimit", NULL
+ static const char *options[] = {
+ "alias", "aliases", "bgerror", "debug", "eval",
+ "expose", "hide", "hidden", "issafe",
+ "invokehidden", "limit", "marktrusted", "recursionlimit", NULL
};
- enum childCmdOptionsEnum {
- OPT_ALIAS, OPT_ALIASES, OPT_BGERROR, OPT_DEBUG,
- OPT_EVAL, OPT_EXPOSE, OPT_HIDE, OPT_HIDDEN,
- OPT_ISSAFE, OPT_INVOKEHIDDEN, OPT_LIMIT, OPT_MARKTRUSTED,
- OPT_RECLIMIT
+ enum options {
+ OPT_ALIAS, OPT_ALIASES, OPT_BGERROR, OPT_DEBUG, OPT_EVAL,
+ OPT_EXPOSE, OPT_HIDE, OPT_HIDDEN, OPT_ISSAFE,
+ OPT_INVOKEHIDDEN, OPT_LIMIT, OPT_MARKTRUSTED, OPT_RECLIMIT
};
- if (childInterp == NULL) {
- Tcl_Panic("TclChildObjCmd: interpreter has been deleted");
+ if (slaveInterp == NULL) {
+ Tcl_Panic("SlaveObjCmd: interpreter has been deleted");
}
if (objc < 2) {
@@ -2589,80 +2299,80 @@ NRChildCmd(
return TCL_ERROR;
}
- switch ((enum childCmdOptionsEnum) index) {
+ switch ((enum options) index) {
case OPT_ALIAS:
if (objc > 2) {
if (objc == 3) {
- return AliasDescribe(interp, childInterp, objv[2]);
+ return AliasDescribe(interp, slaveInterp, objv[2]);
}
if (TclGetString(objv[3])[0] == '\0') {
if (objc == 4) {
- return AliasDelete(interp, childInterp, objv[2]);
+ return AliasDelete(interp, slaveInterp, objv[2]);
}
} else {
- return AliasCreate(interp, childInterp, interp, objv[2],
+ return AliasCreate(interp, slaveInterp, interp, objv[2],
objv[3], objc - 4, objv + 4);
}
}
- Tcl_WrongNumArgs(interp, 2, objv, "aliasName ?targetName? ?arg ...?");
+ Tcl_WrongNumArgs(interp, 2, objv, "aliasName ?targetName? ?args..?");
return TCL_ERROR;
case OPT_ALIASES:
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
- return AliasList(interp, childInterp);
+ return AliasList(interp, slaveInterp);
case OPT_BGERROR:
if (objc != 2 && objc != 3) {
Tcl_WrongNumArgs(interp, 2, objv, "?cmdPrefix?");
return TCL_ERROR;
}
- return ChildBgerror(interp, childInterp, objc - 2, objv + 2);
+ return SlaveBgerror(interp, slaveInterp, objc - 2, objv + 2);
case OPT_DEBUG:
/*
- * TIP #378
+ * TIP #378 *
* Currently only -frame supported, otherwise ?-option ?value? ...?
*/
if (objc > 4) {
Tcl_WrongNumArgs(interp, 2, objv, "?-frame ?bool??");
return TCL_ERROR;
}
- return ChildDebugCmd(interp, childInterp, objc - 2, objv + 2);
+ return SlaveDebugCmd(interp, slaveInterp, objc - 2, objv + 2);
case OPT_EVAL:
if (objc < 3) {
Tcl_WrongNumArgs(interp, 2, objv, "arg ?arg ...?");
return TCL_ERROR;
}
- return ChildEval(interp, childInterp, objc - 2, objv + 2);
+ return SlaveEval(interp, slaveInterp, objc - 2, objv + 2);
case OPT_EXPOSE:
if ((objc < 3) || (objc > 4)) {
Tcl_WrongNumArgs(interp, 2, objv, "hiddenCmdName ?cmdName?");
return TCL_ERROR;
}
- return ChildExpose(interp, childInterp, objc - 2, objv + 2);
+ return SlaveExpose(interp, slaveInterp, objc - 2, objv + 2);
case OPT_HIDE:
if ((objc < 3) || (objc > 4)) {
Tcl_WrongNumArgs(interp, 2, objv, "cmdName ?hiddenCmdName?");
return TCL_ERROR;
}
- return ChildHide(interp, childInterp, objc - 2, objv + 2);
+ return SlaveHide(interp, slaveInterp, objc - 2, objv + 2);
case OPT_HIDDEN:
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
- return ChildHidden(interp, childInterp);
+ return SlaveHidden(interp, slaveInterp);
case OPT_ISSAFE:
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tcl_IsSafe(childInterp)));
+ Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tcl_IsSafe(slaveInterp)));
return TCL_OK;
case OPT_INVOKEHIDDEN: {
- int i;
+ int i, index;
const char *namespaceName;
- static const char *const hiddenOptions[] = {
+ static const char *hiddenOptions[] = {
"-global", "-namespace", "--", NULL
};
enum hiddenOption {
@@ -2696,11 +2406,11 @@ NRChildCmd(
"?-namespace ns? ?-global? ?--? cmd ?arg ..?");
return TCL_ERROR;
}
- return ChildInvokeHidden(interp, childInterp, namespaceName,
+ return SlaveInvokeHidden(interp, slaveInterp, namespaceName,
objc - i, objv + i);
}
case OPT_LIMIT: {
- static const char *const limitTypes[] = {
+ static const char *limitTypes[] = {
"commands", "time", NULL
};
enum LimitTypes {
@@ -2709,7 +2419,7 @@ NRChildCmd(
int limitType;
if (objc < 3) {
- Tcl_WrongNumArgs(interp, 2, objv, "limitType ?-option value ...?");
+ Tcl_WrongNumArgs(interp, 2, objv, "limitType ?options?");
return TCL_ERROR;
}
if (Tcl_GetIndexFromObj(interp, objv[2], limitTypes, "limit type", 0,
@@ -2718,24 +2428,23 @@ NRChildCmd(
}
switch ((enum LimitTypes) limitType) {
case LIMIT_TYPE_COMMANDS:
- return ChildCommandLimitCmd(interp, childInterp, 3, objc,objv);
+ return SlaveCommandLimitCmd(interp, slaveInterp, 3, objc,objv);
case LIMIT_TYPE_TIME:
- return ChildTimeLimitCmd(interp, childInterp, 3, objc, objv);
+ return SlaveTimeLimitCmd(interp, slaveInterp, 3, objc, objv);
}
}
- break;
case OPT_MARKTRUSTED:
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
- return ChildMarkTrusted(interp, childInterp);
+ return SlaveMarkTrusted(interp, slaveInterp);
case OPT_RECLIMIT:
if (objc != 2 && objc != 3) {
Tcl_WrongNumArgs(interp, 2, objv, "?newlimit?");
return TCL_ERROR;
}
- return ChildRecursionLimit(interp, childInterp, objc - 2, objv + 2);
+ return SlaveRecursionLimit(interp, slaveInterp, objc - 2, objv + 2);
}
return TCL_ERROR;
@@ -2744,76 +2453,76 @@ NRChildCmd(
/*
*----------------------------------------------------------------------
*
- * ChildObjCmdDeleteProc --
+ * SlaveObjCmdDeleteProc --
*
- * Invoked when an object command for a child interpreter is deleted;
- * cleans up all state associated with the child interpreter and destroys
- * the child interpreter.
+ * Invoked when an object command for a slave interpreter is deleted;
+ * cleans up all state associated with the slave interpreter and destroys
+ * the slave interpreter.
*
* Results:
* None.
*
* Side effects:
- * Cleans up all state associated with the child interpreter and destroys
- * the child interpreter.
+ * Cleans up all state associated with the slave interpreter and destroys
+ * the slave interpreter.
*
*----------------------------------------------------------------------
*/
static void
-ChildObjCmdDeleteProc(
- void *clientData) /* The ChildRecord for the command. */
+SlaveObjCmdDeleteProc(
+ ClientData clientData) /* The SlaveRecord for the command. */
{
- Child *childPtr; /* Interim storage for Child record. */
- Tcl_Interp *childInterp = (Tcl_Interp *)clientData;
- /* And for a child interp. */
+ Slave *slavePtr; /* Interim storage for Slave record. */
+ Tcl_Interp *slaveInterp = clientData;
+ /* And for a slave interp. */
- childPtr = &((InterpInfo *) ((Interp *) childInterp)->interpInfo)->child;
+ slavePtr = &((InterpInfo *) ((Interp *) slaveInterp)->interpInfo)->slave;
/*
- * Unlink the child from its parent interpreter.
+ * Unlink the slave from its master interpreter.
*/
- Tcl_DeleteHashEntry(childPtr->childEntryPtr);
+ Tcl_DeleteHashEntry(slavePtr->slaveEntryPtr);
/*
- * Set to NULL so that when the InterpInfo is cleaned up in the child it
+ * Set to NULL so that when the InterpInfo is cleaned up in the slave it
* does not try to delete the command causing all sorts of grief. See
- * ChildRecordDeleteProc().
+ * SlaveRecordDeleteProc().
*/
- childPtr->interpCmd = NULL;
+ slavePtr->interpCmd = NULL;
- if (childPtr->childInterp != NULL) {
- Tcl_DeleteInterp(childPtr->childInterp);
+ if (slavePtr->slaveInterp != NULL) {
+ Tcl_DeleteInterp(slavePtr->slaveInterp);
}
}
/*
*----------------------------------------------------------------------
*
- * ChildDebugCmd -- TIP #378
+ * SlaveDebugCmd -- TIP #378
*
- * Helper function to handle 'debug' command in a child interpreter.
+ * Helper function to handle 'debug' command in a slave interpreter.
*
* Results:
* A standard Tcl result.
*
* Side effects:
- * May modify INTERP_DEBUG_FRAME flag in the child.
+ * May modify INTERP_DEBUG flag in the slave.
*
*----------------------------------------------------------------------
*/
static int
-ChildDebugCmd(
+SlaveDebugCmd(
Tcl_Interp *interp, /* Interp for error return. */
- Tcl_Interp *childInterp, /* The child interpreter in which command
+ Tcl_Interp *slaveInterp, /* The slave interpreter in which command
* will be evaluated. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- static const char *const debugTypes[] = {
+ static const char *debugTypes[] = {
"-frame", NULL
};
enum DebugTypes {
@@ -2823,17 +2532,17 @@ ChildDebugCmd(
Interp *iPtr;
Tcl_Obj *resultPtr;
- iPtr = (Interp *) childInterp;
+ iPtr = (Interp *) slaveInterp;
if (objc == 0) {
- TclNewObj(resultPtr);
+ resultPtr = Tcl_NewObj();
Tcl_ListObjAppendElement(NULL, resultPtr,
Tcl_NewStringObj("-frame", -1));
Tcl_ListObjAppendElement(NULL, resultPtr,
Tcl_NewBooleanObj(iPtr->flags & INTERP_DEBUG_FRAME));
Tcl_SetObjResult(interp, resultPtr);
} else {
- if (Tcl_GetIndexFromObj(interp, objv[0], debugTypes, "debug option",
- 0, &debugType) != TCL_OK) {
+ if (Tcl_GetIndexFromObj(interp, objv[0], debugTypes,
+ "debug option", 0, &debugType) != TCL_OK) {
return TCL_ERROR;
}
if (debugType == DEBUG_TYPE_FRAME) {
@@ -2842,13 +2551,11 @@ ChildDebugCmd(
!= TCL_OK) {
return TCL_ERROR;
}
-
/*
- * Quietly ignore attempts to disable interp debugging. This
- * is a one-way switch as frame debug info is maintained in a
- * stack that must be consistent once turned on.
+ * Quietly ignore attempts to disable interp debugging.
+ * This is a one-way switch as frame debug info is maintained
+ * in a stack that must be consistent once turned on.
*/
-
if (debugType) {
iPtr->flags |= INTERP_DEBUG_FRAME;
}
@@ -2863,9 +2570,9 @@ ChildDebugCmd(
/*
*----------------------------------------------------------------------
*
- * ChildEval --
+ * SlaveEval --
*
- * Helper function to evaluate a command in a child interpreter.
+ * Helper function to evaluate a command in a slave interpreter.
*
* Results:
* A standard Tcl result.
@@ -2877,91 +2584,79 @@ ChildDebugCmd(
*/
static int
-ChildEval(
+SlaveEval(
Tcl_Interp *interp, /* Interp for error return. */
- Tcl_Interp *childInterp, /* The child interpreter in which command
+ Tcl_Interp *slaveInterp, /* The slave interpreter in which command
* will be evaluated. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
int result;
+ Tcl_Obj *objPtr;
- /*
- * TIP #285: If necessary, reset the cancellation flags for the child
- * interpreter now; otherwise, canceling a script in a parent interpreter
- * can result in a situation where a child interpreter can no longer
- * evaluate any scripts unless somebody calls the TclResetCancellation
- * function for that particular Tcl_Interp.
- */
-
- TclSetChildCancelFlags(childInterp, 0, 0);
-
- Tcl_Preserve(childInterp);
- Tcl_AllowExceptions(childInterp);
+ Tcl_Preserve(slaveInterp);
+ Tcl_AllowExceptions(slaveInterp);
if (objc == 1) {
/*
* TIP #280: Make actual argument location available to eval'd script.
*/
- Interp *iPtr = (Interp *) interp;
- CmdFrame *invoker = iPtr->cmdFramePtr;
- int word = 0;
+ Interp *iPtr = (Interp *) interp;
+ CmdFrame* invoker = iPtr->cmdFramePtr;
+ int word = 0;
- TclArgumentGet(interp, objv[0], &invoker, &word);
-
- result = TclEvalObjEx(childInterp, objv[0], 0, invoker, word);
+ TclArgumentGet (interp, objv[0], &invoker, &word);
+ result = TclEvalObjEx(slaveInterp, objv[0], 0, invoker, word);
} else {
- Tcl_Obj *objPtr = Tcl_ConcatObj(objc, objv);
+ objPtr = Tcl_ConcatObj(objc, objv);
Tcl_IncrRefCount(objPtr);
- result = Tcl_EvalObjEx(childInterp, objPtr, 0);
+ result = Tcl_EvalObjEx(slaveInterp, objPtr, 0);
Tcl_DecrRefCount(objPtr);
}
- Tcl_TransferResult(childInterp, result, interp);
+ TclTransferResult(slaveInterp, result, interp);
- Tcl_Release(childInterp);
+ Tcl_Release(slaveInterp);
return result;
}
/*
*----------------------------------------------------------------------
*
- * ChildExpose --
+ * SlaveExpose --
*
- * Helper function to expose a command in a child interpreter.
+ * Helper function to expose a command in a slave interpreter.
*
* Results:
* A standard Tcl result.
*
* Side effects:
- * After this call scripts in the child will be able to invoke the newly
+ * After this call scripts in the slave will be able to invoke the newly
* exposed command.
*
*----------------------------------------------------------------------
*/
static int
-ChildExpose(
+SlaveExpose(
Tcl_Interp *interp, /* Interp for error return. */
- Tcl_Interp *childInterp, /* Interp in which command will be exposed. */
+ Tcl_Interp *slaveInterp, /* Interp in which command will be exposed. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument strings. */
{
- const char *name;
+ char *name;
if (Tcl_IsSafe(interp)) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"permission denied: safe interpreter cannot expose commands",
-1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "UNSAFE",
- (void *)NULL);
return TCL_ERROR;
}
name = TclGetString(objv[(objc == 1) ? 0 : 1]);
- if (Tcl_ExposeCommand(childInterp, TclGetString(objv[0]),
+ if (Tcl_ExposeCommand(slaveInterp, TclGetString(objv[0]),
name) != TCL_OK) {
- Tcl_TransferResult(childInterp, TCL_ERROR, interp);
+ TclTransferResult(slaveInterp, TCL_ERROR, interp);
return TCL_ERROR;
}
return TCL_OK;
@@ -2970,7 +2665,7 @@ ChildExpose(
/*
*----------------------------------------------------------------------
*
- * ChildRecursionLimit --
+ * SlaveRecursionLimit --
*
* Helper function to set/query the Recursion limit of an interp
*
@@ -2978,16 +2673,16 @@ ChildExpose(
* A standard Tcl result.
*
* Side effects:
- * When (objc == 1), childInterp will be set to a new recursion limit of
+ * When (objc == 1), slaveInterp will be set to a new recursion limit of
* objv[0].
*
*----------------------------------------------------------------------
*/
static int
-ChildRecursionLimit(
+SlaveRecursionLimit(
Tcl_Interp *interp, /* Interp for error return. */
- Tcl_Interp *childInterp, /* Interp in which limit is set/queried. */
+ Tcl_Interp *slaveInterp, /* Interp in which limit is set/queried. */
int objc, /* Set or Query. */
Tcl_Obj *const objv[]) /* Argument strings. */
{
@@ -2996,10 +2691,8 @@ ChildRecursionLimit(
if (objc) {
if (Tcl_IsSafe(interp)) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj("permission denied: "
- "safe interpreters cannot change recursion limit", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "UNSAFE",
- (void *)NULL);
+ Tcl_AppendResult(interp, "permission denied: "
+ "safe interpreters cannot change recursion limit", NULL);
return TCL_ERROR;
}
if (TclGetIntFromObj(interp, objv[0], &limit) == TCL_ERROR) {
@@ -3008,23 +2701,20 @@ ChildRecursionLimit(
if (limit <= 0) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"recursion limit must be > 0", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "BADLIMIT",
- (void *)NULL);
return TCL_ERROR;
}
- Tcl_SetRecursionLimit(childInterp, limit);
- iPtr = (Interp *) childInterp;
- if (interp == childInterp && iPtr->numLevels > limit) {
+ Tcl_SetRecursionLimit(slaveInterp, limit);
+ iPtr = (Interp *) slaveInterp;
+ if (interp == slaveInterp && iPtr->numLevels > limit) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"falling back due to new recursion limit", -1));
- Tcl_SetErrorCode(interp, "TCL", "RECURSION", (void *)NULL);
return TCL_ERROR;
}
Tcl_SetObjResult(interp, objv[0]);
return TCL_OK;
} else {
- limit = Tcl_SetRecursionLimit(childInterp, 0);
- Tcl_SetObjResult(interp, Tcl_NewWideIntObj(limit));
+ limit = Tcl_SetRecursionLimit(slaveInterp, 0);
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(limit));
return TCL_OK;
}
}
@@ -3032,41 +2722,39 @@ ChildRecursionLimit(
/*
*----------------------------------------------------------------------
*
- * ChildHide --
+ * SlaveHide --
*
- * Helper function to hide a command in a child interpreter.
+ * Helper function to hide a command in a slave interpreter.
*
* Results:
* A standard Tcl result.
*
* Side effects:
- * After this call scripts in the child will no longer be able to invoke
+ * After this call scripts in the slave will no longer be able to invoke
* the named command.
*
*----------------------------------------------------------------------
*/
static int
-ChildHide(
+SlaveHide(
Tcl_Interp *interp, /* Interp for error return. */
- Tcl_Interp *childInterp, /* Interp in which command will be exposed. */
+ Tcl_Interp *slaveInterp, /* Interp in which command will be exposed. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument strings. */
{
- const char *name;
+ char *name;
if (Tcl_IsSafe(interp)) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"permission denied: safe interpreter cannot hide commands",
-1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "UNSAFE",
- (void *)NULL);
return TCL_ERROR;
}
name = TclGetString(objv[(objc == 1) ? 0 : 1]);
- if (Tcl_HideCommand(childInterp, TclGetString(objv[0]), name) != TCL_OK) {
- Tcl_TransferResult(childInterp, TCL_ERROR, interp);
+ if (Tcl_HideCommand(slaveInterp, TclGetString(objv[0]), name) != TCL_OK) {
+ TclTransferResult(slaveInterp, TCL_ERROR, interp);
return TCL_ERROR;
}
return TCL_OK;
@@ -3075,9 +2763,9 @@ ChildHide(
/*
*----------------------------------------------------------------------
*
- * ChildHidden --
+ * SlaveHidden --
*
- * Helper function to compute list of hidden commands in a child
+ * Helper function to compute list of hidden commands in a slave
* interpreter.
*
* Results:
@@ -3090,23 +2778,22 @@ ChildHide(
*/
static int
-ChildHidden(
+SlaveHidden(
Tcl_Interp *interp, /* Interp for data return. */
- Tcl_Interp *childInterp) /* Interp whose hidden commands to query. */
+ Tcl_Interp *slaveInterp) /* Interp whose hidden commands to query. */
{
- Tcl_Obj *listObjPtr; /* Local object pointer. */
+ Tcl_Obj *listObjPtr = Tcl_NewObj(); /* Local object pointer. */
Tcl_HashTable *hTblPtr; /* For local searches. */
Tcl_HashEntry *hPtr; /* For local searches. */
Tcl_HashSearch hSearch; /* For local searches. */
- TclNewObj(listObjPtr);
- hTblPtr = ((Interp *) childInterp)->hiddenCmdTablePtr;
+ hTblPtr = ((Interp *) slaveInterp)->hiddenCmdTablePtr;
if (hTblPtr != NULL) {
for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
hPtr != NULL;
hPtr = Tcl_NextHashEntry(&hSearch)) {
Tcl_ListObjAppendElement(NULL, listObjPtr,
- Tcl_NewStringObj((const char *)Tcl_GetHashKey(hTblPtr, hPtr), -1));
+ Tcl_NewStringObj(Tcl_GetHashKey(hTblPtr, hPtr), -1));
}
}
Tcl_SetObjResult(interp, listObjPtr);
@@ -3116,9 +2803,9 @@ ChildHidden(
/*
*----------------------------------------------------------------------
*
- * ChildInvokeHidden --
+ * SlaveInvokeHidden --
*
- * Helper function to invoke a hidden command in a child interpreter.
+ * Helper function to invoke a hidden command in a slave interpreter.
*
* Results:
* A standard Tcl result.
@@ -3130,12 +2817,12 @@ ChildHidden(
*/
static int
-ChildInvokeHidden(
+SlaveInvokeHidden(
Tcl_Interp *interp, /* Interp for error return. */
- Tcl_Interp *childInterp, /* The child interpreter in which command will
+ Tcl_Interp *slaveInterp, /* The slave interpreter in which command will
* be invoked. */
const char *namespaceName, /* The namespace to use, if any. */
- Tcl_Size objc, /* Number of arguments. */
+ int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
int result;
@@ -3144,88 +2831,63 @@ ChildInvokeHidden(
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"not allowed to invoke hidden commands from safe interpreter",
-1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "UNSAFE",
- (void *)NULL);
return TCL_ERROR;
}
- Tcl_Preserve(childInterp);
- Tcl_AllowExceptions(childInterp);
+ Tcl_Preserve(slaveInterp);
+ Tcl_AllowExceptions(slaveInterp);
if (namespaceName == NULL) {
- NRE_callback *rootPtr = TOP_CB(childInterp);
-
- Tcl_NRAddCallback(interp, NRPostInvokeHidden, childInterp,
- rootPtr, NULL, NULL);
- return TclNRInvoke(NULL, childInterp, objc, objv);
+ result = TclObjInvoke(slaveInterp, objc, objv, TCL_INVOKE_HIDDEN);
} else {
Namespace *nsPtr, *dummy1, *dummy2;
const char *tail;
- result = TclGetNamespaceForQualName(childInterp, namespaceName, NULL,
+ result = TclGetNamespaceForQualName(slaveInterp, namespaceName, NULL,
TCL_FIND_ONLY_NS | TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG
| TCL_CREATE_NS_IF_UNKNOWN, &nsPtr, &dummy1, &dummy2, &tail);
if (result == TCL_OK) {
- result = TclObjInvokeNamespace(childInterp, objc, objv,
- (Tcl_Namespace *) nsPtr, TCL_INVOKE_HIDDEN);
+ result = TclObjInvokeNamespace(slaveInterp, objc, objv,
+ (Tcl_Namespace *)nsPtr, TCL_INVOKE_HIDDEN);
}
}
- Tcl_TransferResult(childInterp, result, interp);
-
- Tcl_Release(childInterp);
- return result;
-}
-
-static int
-NRPostInvokeHidden(
- void *data[],
- Tcl_Interp *interp,
- int result)
-{
- Tcl_Interp *childInterp = (Tcl_Interp *)data[0];
- NRE_callback *rootPtr = (NRE_callback *)data[1];
+ TclTransferResult(slaveInterp, result, interp);
- if (interp != childInterp) {
- result = TclNRRunCallbacks(childInterp, result, rootPtr);
- Tcl_TransferResult(childInterp, result, interp);
- }
- Tcl_Release(childInterp);
+ Tcl_Release(slaveInterp);
return result;
}
/*
*----------------------------------------------------------------------
*
- * ChildMarkTrusted --
+ * SlaveMarkTrusted --
*
- * Helper function to mark a child interpreter as trusted (unsafe).
+ * Helper function to mark a slave interpreter as trusted (unsafe).
*
* Results:
* A standard Tcl result.
*
* Side effects:
* After this call the hard-wired security checks in the core no longer
- * prevent the child from performing certain operations.
+ * prevent the slave from performing certain operations.
*
*----------------------------------------------------------------------
*/
static int
-ChildMarkTrusted(
+SlaveMarkTrusted(
Tcl_Interp *interp, /* Interp for error return. */
- Tcl_Interp *childInterp) /* The child interpreter which will be marked
+ Tcl_Interp *slaveInterp) /* The slave interpreter which will be marked
* trusted. */
{
if (Tcl_IsSafe(interp)) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"permission denied: safe interpreter cannot mark trusted",
-1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "UNSAFE",
- (void *)NULL);
return TCL_ERROR;
}
- ((Interp *) childInterp)->flags &= ~SAFE_INTERP;
+ ((Interp *) slaveInterp)->flags &= ~SAFE_INTERP;
return TCL_OK;
}
@@ -3260,7 +2922,7 @@ Tcl_IsSafe(
/*
*----------------------------------------------------------------------
*
- * TclMakeSafe --
+ * Tcl_MakeSafe --
*
* Makes its argument interpreter contain only functionality that is
* defined to be part of Safe Tcl. Unsafe commands are hidden, the env
@@ -3277,25 +2939,29 @@ Tcl_IsSafe(
*/
int
-TclMakeSafe(
+Tcl_MakeSafe(
Tcl_Interp *interp) /* Interpreter to be made safe. */
{
Tcl_Channel chan; /* Channel to remove from safe interpreter. */
Interp *iPtr = (Interp *) interp;
- Tcl_Interp *parent = ((InterpInfo*) iPtr->interpInfo)->child.parentInterp;
+ Tcl_Interp *master = ((InterpInfo*) iPtr->interpInfo)->slave.masterInterp;
TclHideUnsafeCommands(interp);
- if (parent != NULL) {
+ if (master != NULL) {
/*
- * Alias these function implementations in the child to those in the
- * parent; the overall implementations are safe, but they're normally
+ * Alias these function implementations in the slave to those in the
+ * master; the overall implementations are safe, but they're normally
* defined by init.tcl which is not sourced by safe interpreters.
* Assume these functions all work. [Bug 2895741]
*/
- (void) Tcl_EvalEx(interp,
- "namespace eval ::tcl {namespace eval mathfunc {}}", TCL_INDEX_NONE, 0);
+ (void) Tcl_Eval(interp,
+ "namespace eval ::tcl {namespace eval mathfunc {}}");
+ (void) Tcl_CreateAlias(interp, "::tcl::mathfunc::min", master,
+ "::tcl::mathfunc::min", 0, NULL);
+ (void) Tcl_CreateAlias(interp, "::tcl::mathfunc::max", master,
+ "::tcl::mathfunc::max", 0, NULL);
}
iPtr->flags |= SAFE_INTERP;
@@ -3306,10 +2972,10 @@ TclMakeSafe(
*/
/*
- * No env array in a safe interpreter.
+ * No env array in a safe slave.
*/
- Tcl_UnsetVar2(interp, "env", NULL, TCL_GLOBAL_ONLY);
+ Tcl_UnsetVar(interp, "env", TCL_GLOBAL_ONLY);
/*
* Remove unsafe parts of tcl_platform
@@ -3321,13 +2987,13 @@ TclMakeSafe(
Tcl_UnsetVar2(interp, "tcl_platform", "user", TCL_GLOBAL_ONLY);
/*
- * Unset path information variables (the only one remaining is [info
+ * Unset path informations variables (the only one remaining is [info
* nameofexecutable])
*/
- Tcl_UnsetVar2(interp, "tclDefaultLibrary", NULL, TCL_GLOBAL_ONLY);
- Tcl_UnsetVar2(interp, "tcl_library", NULL, TCL_GLOBAL_ONLY);
- Tcl_UnsetVar2(interp, "tcl_pkgPath", NULL, TCL_GLOBAL_ONLY);
+ Tcl_UnsetVar(interp, "tclDefaultLibrary", TCL_GLOBAL_ONLY);
+ Tcl_UnsetVar(interp, "tcl_library", TCL_GLOBAL_ONLY);
+ Tcl_UnsetVar(interp, "tcl_pkgPath", TCL_GLOBAL_ONLY);
/*
* Remove the standard channels from the interpreter; safe interpreters do
@@ -3380,7 +3046,7 @@ int
Tcl_LimitExceeded(
Tcl_Interp *interp)
{
- Interp *iPtr = (Interp *) interp;
+ register Interp *iPtr = (Interp *) interp;
return iPtr->limit.exceeded != 0;
}
@@ -3411,10 +3077,10 @@ int
Tcl_LimitReady(
Tcl_Interp *interp)
{
- Interp *iPtr = (Interp *) interp;
+ register Interp *iPtr = (Interp *) interp;
if (iPtr->limit.active != 0) {
- int ticker = ++iPtr->limit.granularityTicker;
+ register int ticker = ++iPtr->limit.granularityTicker;
if ((iPtr->limit.active & TCL_LIMIT_COMMANDS) &&
((iPtr->limit.cmdGranularity == 1) ||
@@ -3458,7 +3124,7 @@ Tcl_LimitCheck(
Tcl_Interp *interp)
{
Interp *iPtr = (Interp *) interp;
- int ticker = iPtr->limit.granularityTicker;
+ register int ticker = iPtr->limit.granularityTicker;
if (Tcl_InterpDeleted(interp)) {
return TCL_OK;
@@ -3474,9 +3140,8 @@ Tcl_LimitCheck(
if (iPtr->limit.cmdCount >= iPtr->cmdCount) {
iPtr->limit.exceeded &= ~TCL_LIMIT_COMMANDS;
} else if (iPtr->limit.exceeded & TCL_LIMIT_COMMANDS) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "command count limit exceeded", -1));
- Tcl_SetErrorCode(interp, "TCL", "LIMIT", "COMMANDS", (void *)NULL);
+ Tcl_ResetResult(interp);
+ Tcl_AppendResult(interp, "command count limit exceeded", NULL);
Tcl_Release(interp);
return TCL_ERROR;
}
@@ -3500,9 +3165,8 @@ Tcl_LimitCheck(
iPtr->limit.time.usec >= now.usec)) {
iPtr->limit.exceeded &= ~TCL_LIMIT_TIME;
} else if (iPtr->limit.exceeded & TCL_LIMIT_TIME) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "time limit exceeded", -1));
- Tcl_SetErrorCode(interp, "TCL", "LIMIT", "TIME", (void *)NULL);
+ Tcl_ResetResult(interp);
+ Tcl_AppendResult(interp, "time limit exceeded", NULL);
Tcl_Release(interp);
return TCL_ERROR;
}
@@ -3555,7 +3219,7 @@ RunLimitHandlers(
*/
handlerPtr->flags |= LIMIT_HANDLER_ACTIVE;
- handlerPtr->handlerProc(handlerPtr->clientData, interp);
+ (handlerPtr->handlerProc)(handlerPtr->clientData, interp);
handlerPtr->flags &= ~LIMIT_HANDLER_ACTIVE;
/*
@@ -3576,9 +3240,9 @@ RunLimitHandlers(
if (handlerPtr->flags & LIMIT_HANDLER_DELETED) {
if (handlerPtr->deleteProc != NULL) {
- handlerPtr->deleteProc(handlerPtr->clientData);
+ (handlerPtr->deleteProc)(handlerPtr->clientData);
}
- ckfree(handlerPtr);
+ ckfree((char *) handlerPtr);
}
}
}
@@ -3599,20 +3263,12 @@ RunLimitHandlers(
*----------------------------------------------------------------------
*/
-/* Bug 52dbc4b3f8: wrap Tcl_Free since it is not a Tcl_LimitHandlerDeleteProc. */
-static void
-WrapFree(
- void *ptr)
-{
- ckfree(ptr);
-}
-
void
Tcl_LimitAddHandler(
Tcl_Interp *interp,
int type,
Tcl_LimitHandlerProc *handlerProc,
- void *clientData,
+ ClientData clientData,
Tcl_LimitHandlerDeleteProc *deleteProc)
{
Interp *iPtr = (Interp *) interp;
@@ -3623,14 +3279,17 @@ Tcl_LimitAddHandler(
*/
if (deleteProc == (Tcl_LimitHandlerDeleteProc *) TCL_DYNAMIC) {
- deleteProc = WrapFree;
+ deleteProc = (Tcl_LimitHandlerDeleteProc *) Tcl_Free;
+ }
+ if (deleteProc == (Tcl_LimitHandlerDeleteProc *) TCL_STATIC) {
+ deleteProc = NULL;
}
/*
* Allocate a handler record.
*/
- handlerPtr = (LimitHandler *)ckalloc(sizeof(LimitHandler));
+ handlerPtr = (LimitHandler *) ckalloc(sizeof(LimitHandler));
handlerPtr->flags = 0;
handlerPtr->handlerProc = handlerProc;
handlerPtr->clientData = clientData;
@@ -3686,7 +3345,7 @@ Tcl_LimitRemoveHandler(
Tcl_Interp *interp,
int type,
Tcl_LimitHandlerProc *handlerProc,
- void *clientData)
+ ClientData clientData)
{
Interp *iPtr = (Interp *) interp;
LimitHandler *handlerPtr;
@@ -3747,9 +3406,9 @@ Tcl_LimitRemoveHandler(
if (!(handlerPtr->flags & LIMIT_HANDLER_ACTIVE)) {
if (handlerPtr->deleteProc != NULL) {
- handlerPtr->deleteProc(handlerPtr->clientData);
+ (handlerPtr->deleteProc)(handlerPtr->clientData);
}
- ckfree(handlerPtr);
+ ckfree((char *) handlerPtr);
}
return;
}
@@ -3807,9 +3466,9 @@ TclLimitRemoveAllHandlers(
if (!(handlerPtr->flags & LIMIT_HANDLER_ACTIVE)) {
if (handlerPtr->deleteProc != NULL) {
- handlerPtr->deleteProc(handlerPtr->clientData);
+ (handlerPtr->deleteProc)(handlerPtr->clientData);
}
- ckfree(handlerPtr);
+ ckfree((char *) handlerPtr);
}
}
@@ -3840,9 +3499,9 @@ TclLimitRemoveAllHandlers(
if (!(handlerPtr->flags & LIMIT_HANDLER_ACTIVE)) {
if (handlerPtr->deleteProc != NULL) {
- handlerPtr->deleteProc(handlerPtr->clientData);
+ (handlerPtr->deleteProc)(handlerPtr->clientData);
}
- ckfree(handlerPtr);
+ ckfree((char *) handlerPtr);
}
}
@@ -3989,7 +3648,7 @@ Tcl_LimitTypeReset(
void
Tcl_LimitSetCommands(
Tcl_Interp *interp,
- Tcl_Size commandLimit)
+ int commandLimit)
{
Interp *iPtr = (Interp *) interp;
@@ -4085,10 +3744,10 @@ Tcl_LimitSetTime(
static void
TimeLimitCallback(
- void *clientData)
+ ClientData clientData)
{
- Tcl_Interp *interp = (Tcl_Interp *)clientData;
- Interp *iPtr = (Interp *)clientData;
+ Tcl_Interp *interp = clientData;
+ Interp *iPtr = clientData;
int code;
Tcl_Preserve(interp);
@@ -4105,7 +3764,7 @@ TimeLimitCallback(
code = Tcl_LimitCheck(interp);
if (code != TCL_OK) {
Tcl_AddErrorInfo(interp, "\n (while waiting for event)");
- Tcl_BackgroundException(interp, code);
+ TclBackgroundException(interp, code);
}
Tcl_Release(interp);
}
@@ -4215,7 +3874,7 @@ Tcl_LimitGetGranularity(
* DeleteScriptLimitCallback --
*
* Callback for when a script limit (a limit callback implemented as a
- * Tcl script in a parent interpreter, as set up from Tcl) is deleted.
+ * Tcl script in a master interpreter, as set up from Tcl) is deleted.
*
* Results:
* None.
@@ -4229,15 +3888,15 @@ Tcl_LimitGetGranularity(
static void
DeleteScriptLimitCallback(
- void *clientData)
+ ClientData clientData)
{
- ScriptLimitCallback *limitCBPtr = (ScriptLimitCallback *)clientData;
+ ScriptLimitCallback *limitCBPtr = clientData;
Tcl_DecrRefCount(limitCBPtr->scriptObj);
if (limitCBPtr->entryPtr != NULL) {
Tcl_DeleteHashEntry(limitCBPtr->entryPtr);
}
- ckfree(limitCBPtr);
+ ckfree((char *) limitCBPtr);
}
/*
@@ -4260,10 +3919,10 @@ DeleteScriptLimitCallback(
static void
CallScriptLimitCallback(
- void *clientData,
- TCL_UNUSED(Tcl_Interp *))
+ ClientData clientData,
+ Tcl_Interp *interp) /* Interpreter which failed the limit */
{
- ScriptLimitCallback *limitCBPtr = (ScriptLimitCallback *)clientData;
+ ScriptLimitCallback *limitCBPtr = clientData;
int code;
if (Tcl_InterpDeleted(limitCBPtr->interp)) {
@@ -4273,7 +3932,7 @@ CallScriptLimitCallback(
code = Tcl_EvalObjEx(limitCBPtr->interp, limitCBPtr->scriptObj,
TCL_EVAL_GLOBAL);
if (code != TCL_OK && !Tcl_InterpDeleted(limitCBPtr->interp)) {
- Tcl_BackgroundException(limitCBPtr->interp, code);
+ TclBackgroundException(limitCBPtr->interp, code);
}
Tcl_Release(limitCBPtr->interp);
}
@@ -4293,7 +3952,7 @@ CallScriptLimitCallback(
* None.
*
* Side effects:
- * A limit callback implemented as an invocation of a Tcl script in
+ * A limit callback implemented as an invokation of a Tcl script in
* another interpreter is either installed or removed.
*
*----------------------------------------------------------------------
@@ -4328,16 +3987,16 @@ SetScriptLimitCallback(
return;
}
- hashPtr = Tcl_CreateHashEntry(&iPtr->limit.callbacks, &key,
+ hashPtr = Tcl_CreateHashEntry(&iPtr->limit.callbacks, (char *) &key,
&isNew);
if (!isNew) {
- limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hashPtr);
+ limitCBPtr = Tcl_GetHashValue(hashPtr);
limitCBPtr->entryPtr = NULL;
Tcl_LimitRemoveHandler(targetInterp, type, CallScriptLimitCallback,
limitCBPtr);
}
- limitCBPtr = (ScriptLimitCallback *)ckalloc(sizeof(ScriptLimitCallback));
+ limitCBPtr = (ScriptLimitCallback *) ckalloc(sizeof(ScriptLimitCallback));
limitCBPtr->interp = interp;
limitCBPtr->scriptObj = scriptObj;
limitCBPtr->entryPtr = hashPtr;
@@ -4428,48 +4087,48 @@ TclInitLimitSupport(
/*
*----------------------------------------------------------------------
*
- * InheritLimitsFromParent --
+ * InheritLimitsFromMaster --
*
- * Derive the interpreter limit configuration for a child interpreter
- * from the limit config for the parent.
+ * Derive the interpreter limit configuration for a slave interpreter
+ * from the limit config for the master.
*
* Results:
* None.
*
* Side effects:
- * The child interpreter limits are set so that if the parent has a
- * limit, it may not exceed it by handing off work to child interpreters.
- * Note that this does not transfer limit callbacks from the parent to
- * the child.
+ * The slave interpreter limits are set so that if the master has a
+ * limit, it may not exceed it by handing off work to slave interpreters.
+ * Note that this does not transfer limit callbacks from the master to
+ * the slave.
*
*----------------------------------------------------------------------
*/
static void
-InheritLimitsFromParent(
- Tcl_Interp *childInterp,
- Tcl_Interp *parentInterp)
+InheritLimitsFromMaster(
+ Tcl_Interp *slaveInterp,
+ Tcl_Interp *masterInterp)
{
- Interp *childPtr = (Interp *) childInterp;
- Interp *parentPtr = (Interp *) parentInterp;
+ Interp *slavePtr = (Interp *) slaveInterp;
+ Interp *masterPtr = (Interp *) masterInterp;
- if (parentPtr->limit.active & TCL_LIMIT_COMMANDS) {
- childPtr->limit.active |= TCL_LIMIT_COMMANDS;
- childPtr->limit.cmdCount = 0;
- childPtr->limit.cmdGranularity = parentPtr->limit.cmdGranularity;
+ if (masterPtr->limit.active & TCL_LIMIT_COMMANDS) {
+ slavePtr->limit.active |= TCL_LIMIT_COMMANDS;
+ slavePtr->limit.cmdCount = 0;
+ slavePtr->limit.cmdGranularity = masterPtr->limit.cmdGranularity;
}
- if (parentPtr->limit.active & TCL_LIMIT_TIME) {
- childPtr->limit.active |= TCL_LIMIT_TIME;
- memcpy(&childPtr->limit.time, &parentPtr->limit.time,
+ if (masterPtr->limit.active & TCL_LIMIT_TIME) {
+ slavePtr->limit.active |= TCL_LIMIT_TIME;
+ memcpy(&slavePtr->limit.time, &masterPtr->limit.time,
sizeof(Tcl_Time));
- childPtr->limit.timeGranularity = parentPtr->limit.timeGranularity;
+ slavePtr->limit.timeGranularity = masterPtr->limit.timeGranularity;
}
}
/*
*----------------------------------------------------------------------
*
- * ChildCommandLimitCmd --
+ * SlaveCommandLimitCmd --
*
* Implementation of the [interp limit $i commands] and [$i limit
* commands] subcommands. See the interp manual page for a full
@@ -4485,14 +4144,14 @@ InheritLimitsFromParent(
*/
static int
-ChildCommandLimitCmd(
+SlaveCommandLimitCmd(
Tcl_Interp *interp, /* Current interpreter. */
- Tcl_Interp *childInterp, /* Interpreter being adjusted. */
+ Tcl_Interp *slaveInterp, /* Interpreter being adjusted. */
int consumedObjc, /* Number of args already parsed. */
int objc, /* Total number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- static const char *const options[] = {
+ static const char *options[] = {
"-command", "-granularity", "-value", NULL
};
enum Options {
@@ -4511,10 +4170,9 @@ ChildCommandLimitCmd(
* avoid. [Bug 3398794]
*/
- if (interp == childInterp) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "limits on current interpreter inaccessible", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "SELF", (void *)NULL);
+ if (interp == slaveInterp) {
+ Tcl_AppendResult(interp,
+ "limits on current interpreter inaccessible", NULL);
return TCL_ERROR;
}
@@ -4522,11 +4180,11 @@ ChildCommandLimitCmd(
Tcl_Obj *dictPtr;
TclNewObj(dictPtr);
- key.interp = childInterp;
+ key.interp = slaveInterp;
key.type = TCL_LIMIT_COMMANDS;
hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
if (hPtr != NULL) {
- limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hPtr);
+ limitCBPtr = Tcl_GetHashValue(hPtr);
if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) {
Tcl_DictObjPut(NULL, dictPtr, Tcl_NewStringObj(options[0], -1),
limitCBPtr->scriptObj);
@@ -4542,12 +4200,12 @@ ChildCommandLimitCmd(
Tcl_NewStringObj(options[0], -1), empty);
}
Tcl_DictObjPut(NULL, dictPtr, Tcl_NewStringObj(options[1], -1),
- Tcl_NewWideIntObj(Tcl_LimitGetGranularity(childInterp,
+ Tcl_NewIntObj(Tcl_LimitGetGranularity(slaveInterp,
TCL_LIMIT_COMMANDS)));
- if (Tcl_LimitTypeEnabled(childInterp, TCL_LIMIT_COMMANDS)) {
+ if (Tcl_LimitTypeEnabled(slaveInterp, TCL_LIMIT_COMMANDS)) {
Tcl_DictObjPut(NULL, dictPtr, Tcl_NewStringObj(options[2], -1),
- Tcl_NewWideIntObj(Tcl_LimitGetCommands(childInterp)));
+ Tcl_NewIntObj(Tcl_LimitGetCommands(slaveInterp)));
} else {
Tcl_Obj *empty;
@@ -4564,34 +4222,34 @@ ChildCommandLimitCmd(
}
switch ((enum Options) index) {
case OPT_CMD:
- key.interp = childInterp;
+ key.interp = slaveInterp;
key.type = TCL_LIMIT_COMMANDS;
hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
if (hPtr != NULL) {
- limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hPtr);
+ limitCBPtr = Tcl_GetHashValue(hPtr);
if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) {
Tcl_SetObjResult(interp, limitCBPtr->scriptObj);
}
}
break;
case OPT_GRAN:
- Tcl_SetObjResult(interp, Tcl_NewWideIntObj(
- Tcl_LimitGetGranularity(childInterp, TCL_LIMIT_COMMANDS)));
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(
+ Tcl_LimitGetGranularity(slaveInterp, TCL_LIMIT_COMMANDS)));
break;
case OPT_VAL:
- if (Tcl_LimitTypeEnabled(childInterp, TCL_LIMIT_COMMANDS)) {
+ if (Tcl_LimitTypeEnabled(slaveInterp, TCL_LIMIT_COMMANDS)) {
Tcl_SetObjResult(interp,
- Tcl_NewWideIntObj(Tcl_LimitGetCommands(childInterp)));
+ Tcl_NewIntObj(Tcl_LimitGetCommands(slaveInterp)));
}
break;
}
return TCL_OK;
} else if ((objc-consumedObjc) & 1 /* isOdd(objc-consumedObjc) */) {
- Tcl_WrongNumArgs(interp, consumedObjc, objv, "?-option value ...?");
+ Tcl_WrongNumArgs(interp, consumedObjc, objv,
+ "?-option? ?value? ?-option value ...?");
return TCL_ERROR;
} else {
- int i;
- Tcl_Size scriptLen = 0, limitLen = 0;
+ int i, scriptLen = 0, limitLen = 0;
Tcl_Obj *scriptObj = NULL, *granObj = NULL, *limitObj = NULL;
int gran = 0, limit = 0;
@@ -4603,7 +4261,7 @@ ChildCommandLimitCmd(
switch ((enum Options) index) {
case OPT_CMD:
scriptObj = objv[i+1];
- (void) TclGetStringFromObj(scriptObj, &scriptLen);
+ (void) Tcl_GetStringFromObj(objv[i+1], &scriptLen);
break;
case OPT_GRAN:
granObj = objv[i+1];
@@ -4611,16 +4269,14 @@ ChildCommandLimitCmd(
return TCL_ERROR;
}
if (gran < 1) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "granularity must be at least 1", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "BADVALUE", (void *)NULL);
+ Tcl_AppendResult(interp, "granularity must be at "
+ "least 1", NULL);
return TCL_ERROR;
}
break;
case OPT_VAL:
limitObj = objv[i+1];
- (void) TclGetStringFromObj(objv[i+1], &limitLen);
+ (void) Tcl_GetStringFromObj(objv[i+1], &limitLen);
if (limitLen == 0) {
break;
}
@@ -4628,28 +4284,26 @@ ChildCommandLimitCmd(
return TCL_ERROR;
}
if (limit < 0) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "command limit value must be at least 0", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "BADVALUE", (void *)NULL);
+ Tcl_AppendResult(interp, "command limit value must be at "
+ "least 0", NULL);
return TCL_ERROR;
}
break;
}
}
if (scriptObj != NULL) {
- SetScriptLimitCallback(interp, TCL_LIMIT_COMMANDS, childInterp,
+ SetScriptLimitCallback(interp, TCL_LIMIT_COMMANDS, slaveInterp,
(scriptLen > 0 ? scriptObj : NULL));
}
if (granObj != NULL) {
- Tcl_LimitSetGranularity(childInterp, TCL_LIMIT_COMMANDS, gran);
+ Tcl_LimitSetGranularity(slaveInterp, TCL_LIMIT_COMMANDS, gran);
}
if (limitObj != NULL) {
if (limitLen > 0) {
- Tcl_LimitSetCommands(childInterp, limit);
- Tcl_LimitTypeSet(childInterp, TCL_LIMIT_COMMANDS);
+ Tcl_LimitSetCommands(slaveInterp, limit);
+ Tcl_LimitTypeSet(slaveInterp, TCL_LIMIT_COMMANDS);
} else {
- Tcl_LimitTypeReset(childInterp, TCL_LIMIT_COMMANDS);
+ Tcl_LimitTypeReset(slaveInterp, TCL_LIMIT_COMMANDS);
}
}
return TCL_OK;
@@ -4659,7 +4313,7 @@ ChildCommandLimitCmd(
/*
*----------------------------------------------------------------------
*
- * ChildTimeLimitCmd --
+ * SlaveTimeLimitCmd --
*
* Implementation of the [interp limit $i time] and [$i limit time]
* subcommands. See the interp manual page for a full description.
@@ -4674,14 +4328,14 @@ ChildCommandLimitCmd(
*/
static int
-ChildTimeLimitCmd(
+SlaveTimeLimitCmd(
Tcl_Interp *interp, /* Current interpreter. */
- Tcl_Interp *childInterp, /* Interpreter being adjusted. */
+ Tcl_Interp *slaveInterp, /* Interpreter being adjusted. */
int consumedObjc, /* Number of args already parsed. */
int objc, /* Total number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- static const char *const options[] = {
+ static const char *options[] = {
"-command", "-granularity", "-milliseconds", "-seconds", NULL
};
enum Options {
@@ -4700,10 +4354,9 @@ ChildTimeLimitCmd(
* avoid. [Bug 3398794]
*/
- if (interp == childInterp) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "limits on current interpreter inaccessible", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "SELF", (void *)NULL);
+ if (interp == slaveInterp) {
+ Tcl_AppendResult(interp,
+ "limits on current interpreter inaccessible", NULL);
return TCL_ERROR;
}
@@ -4711,11 +4364,11 @@ ChildTimeLimitCmd(
Tcl_Obj *dictPtr;
TclNewObj(dictPtr);
- key.interp = childInterp;
+ key.interp = slaveInterp;
key.type = TCL_LIMIT_TIME;
hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
if (hPtr != NULL) {
- limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hPtr);
+ limitCBPtr = Tcl_GetHashValue(hPtr);
if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) {
Tcl_DictObjPut(NULL, dictPtr, Tcl_NewStringObj(options[0], -1),
limitCBPtr->scriptObj);
@@ -4730,17 +4383,17 @@ ChildTimeLimitCmd(
Tcl_NewStringObj(options[0], -1), empty);
}
Tcl_DictObjPut(NULL, dictPtr, Tcl_NewStringObj(options[1], -1),
- Tcl_NewWideIntObj(Tcl_LimitGetGranularity(childInterp,
+ Tcl_NewIntObj(Tcl_LimitGetGranularity(slaveInterp,
TCL_LIMIT_TIME)));
- if (Tcl_LimitTypeEnabled(childInterp, TCL_LIMIT_TIME)) {
+ if (Tcl_LimitTypeEnabled(slaveInterp, TCL_LIMIT_TIME)) {
Tcl_Time limitMoment;
- Tcl_LimitGetTime(childInterp, &limitMoment);
+ Tcl_LimitGetTime(slaveInterp, &limitMoment);
Tcl_DictObjPut(NULL, dictPtr, Tcl_NewStringObj(options[2], -1),
- Tcl_NewWideIntObj(limitMoment.usec/1000));
+ Tcl_NewLongObj(limitMoment.usec/1000));
Tcl_DictObjPut(NULL, dictPtr, Tcl_NewStringObj(options[3], -1),
- Tcl_NewWideIntObj(limitMoment.sec));
+ Tcl_NewLongObj(limitMoment.sec));
} else {
Tcl_Obj *empty;
@@ -4759,52 +4412,52 @@ ChildTimeLimitCmd(
}
switch ((enum Options) index) {
case OPT_CMD:
- key.interp = childInterp;
+ key.interp = slaveInterp;
key.type = TCL_LIMIT_TIME;
hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
if (hPtr != NULL) {
- limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hPtr);
+ limitCBPtr = Tcl_GetHashValue(hPtr);
if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) {
Tcl_SetObjResult(interp, limitCBPtr->scriptObj);
}
}
break;
case OPT_GRAN:
- Tcl_SetObjResult(interp, Tcl_NewWideIntObj(
- Tcl_LimitGetGranularity(childInterp, TCL_LIMIT_TIME)));
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(
+ Tcl_LimitGetGranularity(slaveInterp, TCL_LIMIT_TIME)));
break;
case OPT_MILLI:
- if (Tcl_LimitTypeEnabled(childInterp, TCL_LIMIT_TIME)) {
+ if (Tcl_LimitTypeEnabled(slaveInterp, TCL_LIMIT_TIME)) {
Tcl_Time limitMoment;
- Tcl_LimitGetTime(childInterp, &limitMoment);
+ Tcl_LimitGetTime(slaveInterp, &limitMoment);
Tcl_SetObjResult(interp,
- Tcl_NewWideIntObj(limitMoment.usec/1000));
+ Tcl_NewLongObj(limitMoment.usec/1000));
}
break;
case OPT_SEC:
- if (Tcl_LimitTypeEnabled(childInterp, TCL_LIMIT_TIME)) {
+ if (Tcl_LimitTypeEnabled(slaveInterp, TCL_LIMIT_TIME)) {
Tcl_Time limitMoment;
- Tcl_LimitGetTime(childInterp, &limitMoment);
- Tcl_SetObjResult(interp, Tcl_NewWideIntObj(limitMoment.sec));
+ Tcl_LimitGetTime(slaveInterp, &limitMoment);
+ Tcl_SetObjResult(interp, Tcl_NewLongObj(limitMoment.sec));
}
break;
}
return TCL_OK;
} else if ((objc-consumedObjc) & 1 /* isOdd(objc-consumedObjc) */) {
- Tcl_WrongNumArgs(interp, consumedObjc, objv, "?-option value ...?");
+ Tcl_WrongNumArgs(interp, consumedObjc, objv,
+ "?-option? ?value? ?-option value ...?");
return TCL_ERROR;
} else {
- int i;
- Tcl_Size scriptLen = 0, milliLen = 0, secLen = 0;
+ int i, scriptLen = 0, milliLen = 0, secLen = 0;
Tcl_Obj *scriptObj = NULL, *granObj = NULL;
Tcl_Obj *milliObj = NULL, *secObj = NULL;
int gran = 0;
Tcl_Time limitMoment;
- Tcl_WideInt tmp;
+ int tmp;
- Tcl_LimitGetTime(childInterp, &limitMoment);
+ Tcl_LimitGetTime(slaveInterp, &limitMoment);
for (i=consumedObjc ; i<objc ; i+=2) {
if (Tcl_GetIndexFromObj(interp, objv[i], options, "option", 0,
&index) != TCL_OK) {
@@ -4813,7 +4466,7 @@ ChildTimeLimitCmd(
switch ((enum Options) index) {
case OPT_CMD:
scriptObj = objv[i+1];
- (void) TclGetStringFromObj(objv[i+1], &scriptLen);
+ (void) Tcl_GetStringFromObj(objv[i+1], &scriptLen);
break;
case OPT_GRAN:
granObj = objv[i+1];
@@ -4821,48 +4474,42 @@ ChildTimeLimitCmd(
return TCL_ERROR;
}
if (gran < 1) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "granularity must be at least 1", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "BADVALUE", (void *)NULL);
+ Tcl_AppendResult(interp, "granularity must be at "
+ "least 1", NULL);
return TCL_ERROR;
}
break;
case OPT_MILLI:
milliObj = objv[i+1];
- (void) TclGetStringFromObj(objv[i+1], &milliLen);
+ (void) Tcl_GetStringFromObj(objv[i+1], &milliLen);
if (milliLen == 0) {
break;
}
- if (TclGetWideIntFromObj(interp, objv[i+1], &tmp) != TCL_OK) {
+ if (TclGetIntFromObj(interp, objv[i+1], &tmp) != TCL_OK) {
return TCL_ERROR;
}
- if (tmp < 0 || tmp > LONG_MAX) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "milliseconds must be between 0 and %ld", LONG_MAX));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "BADVALUE", (void *)NULL);
+ if (tmp < 0) {
+ Tcl_AppendResult(interp, "milliseconds must be at least 0",
+ NULL);
return TCL_ERROR;
}
limitMoment.usec = ((long)tmp)*1000;
break;
case OPT_SEC:
secObj = objv[i+1];
- (void) TclGetStringFromObj(objv[i+1], &secLen);
+ (void) Tcl_GetStringFromObj(objv[i+1], &secLen);
if (secLen == 0) {
break;
}
- if (TclGetWideIntFromObj(interp, objv[i+1], &tmp) != TCL_OK) {
+ if (TclGetIntFromObj(interp, objv[i+1], &tmp) != TCL_OK) {
return TCL_ERROR;
}
- if (tmp < 0 || tmp > LONG_MAX) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "seconds must be between 0 and %ld", LONG_MAX));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "BADVALUE", (void *)NULL);
+ if (tmp < 0) {
+ Tcl_AppendResult(interp, "seconds must be at least 0",
+ NULL);
return TCL_ERROR;
}
- limitMoment.sec = (long)tmp;
+ limitMoment.sec = tmp;
break;
}
}
@@ -4874,19 +4521,13 @@ ChildTimeLimitCmd(
*/
if (secObj != NULL && secLen == 0 && milliLen > 0) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "may only set -milliseconds if -seconds is not "
- "also being reset", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "BADUSAGE", (void *)NULL);
+ Tcl_AppendResult(interp, "may only set -milliseconds "
+ "if -seconds is not also being reset", NULL);
return TCL_ERROR;
}
if (milliLen == 0 && (secObj == NULL || secLen > 0)) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "may only reset -milliseconds if -seconds is "
- "also being reset", -1));
- Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
- "BADUSAGE", (void *)NULL);
+ Tcl_AppendResult(interp, "may only reset -milliseconds "
+ "if -seconds is also being reset", NULL);
return TCL_ERROR;
}
}
@@ -4901,18 +4542,18 @@ ChildTimeLimitCmd(
limitMoment.sec += limitMoment.usec / 1000000;
limitMoment.usec %= 1000000;
- Tcl_LimitSetTime(childInterp, &limitMoment);
- Tcl_LimitTypeSet(childInterp, TCL_LIMIT_TIME);
+ Tcl_LimitSetTime(slaveInterp, &limitMoment);
+ Tcl_LimitTypeSet(slaveInterp, TCL_LIMIT_TIME);
} else {
- Tcl_LimitTypeReset(childInterp, TCL_LIMIT_TIME);
+ Tcl_LimitTypeReset(slaveInterp, TCL_LIMIT_TIME);
}
}
if (scriptObj != NULL) {
- SetScriptLimitCallback(interp, TCL_LIMIT_TIME, childInterp,
+ SetScriptLimitCallback(interp, TCL_LIMIT_TIME, slaveInterp,
(scriptLen > 0 ? scriptObj : NULL));
}
if (granObj != NULL) {
- Tcl_LimitSetGranularity(childInterp, TCL_LIMIT_TIME, gran);
+ Tcl_LimitSetGranularity(slaveInterp, TCL_LIMIT_TIME, gran);
}
return TCL_OK;
}