summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2016-05-12 20:23:23 (GMT)
committerdgp <dgp@users.sourceforge.net>2016-05-12 20:23:23 (GMT)
commit67801a78ad4a2571cbdb9f8358f88edc001776dc (patch)
tree05da34e1518abd99ef6c027ba46a1230a783f67d
parente0ed43c52629c283f02e749517e7fc83ace2942e (diff)
downloadtcl-67801a78ad4a2571cbdb9f8358f88edc001776dc.zip
tcl-67801a78ad4a2571cbdb9f8358f88edc001776dc.tar.gz
tcl-67801a78ad4a2571cbdb9f8358f88edc001776dc.tar.bz2
Don't see why the intrep should make and keep copies of things already
stored in the hash table.
-rw-r--r--generic/tclEnsemble.c37
-rw-r--r--generic/tclIndexObj.c6
-rw-r--r--generic/tclInt.h8
3 files changed, 17 insertions, 34 deletions
diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c
index ead96a3..986b7c1 100644
--- a/generic/tclEnsemble.c
+++ b/generic/tclEnsemble.c
@@ -30,8 +30,7 @@ static int NsEnsembleStringOrder(const void *strPtr1,
const void *strPtr2);
static void DeleteEnsembleConfig(ClientData clientData);
static void MakeCachedEnsembleCommand(Tcl_Obj *objPtr,
- EnsembleConfig *ensemblePtr,
- const char *subcmdName, Tcl_Obj *prefixObjPtr);
+ EnsembleConfig *ensemblePtr, Tcl_HashEntry *hPtr);
static void FreeEnsembleCmdRep(Tcl_Obj *objPtr);
static void DupEnsembleCmdRep(Tcl_Obj *objPtr, Tcl_Obj *copyPtr);
static void CompileToInvokedCommand(Tcl_Interp *interp,
@@ -1708,7 +1707,7 @@ NsEnsembleImplementationCmdNR(
if (ensembleCmd->epoch == ensemblePtr->epoch &&
ensembleCmd->token == ensemblePtr->token) {
- prefixObj = ensembleCmd->realPrefixObj;
+ prefixObj = Tcl_GetHashValue(ensembleCmd->hPtr);
Tcl_IncrRefCount(prefixObj);
goto runResultingSubcommand;
}
@@ -1726,16 +1725,13 @@ NsEnsembleImplementationCmdNR(
hPtr = Tcl_FindHashEntry(&ensemblePtr->subcommandTable,
TclGetString(objv[1 + ensemblePtr->numParameters]));
if (hPtr != NULL) {
- char *fullName = Tcl_GetHashKey(&ensemblePtr->subcommandTable, hPtr);
-
- prefixObj = Tcl_GetHashValue(hPtr);
/*
* Cache for later in the subcommand object.
*/
MakeCachedEnsembleCommand(objv[1 + ensemblePtr->numParameters],
- ensemblePtr, fullName, prefixObj);
+ ensemblePtr, hPtr);
} else if (!(ensemblePtr->flags & TCL_ENSEMBLE_PREFIX)) {
/*
* Could not map, no prefixing, go to unknown/error handling.
@@ -1797,16 +1793,16 @@ NsEnsembleImplementationCmdNR(
Tcl_Panic("full name %s not found in supposedly synchronized hash",
fullName);
}
- prefixObj = Tcl_GetHashValue(hPtr);
/*
* Cache for later in the subcommand object.
*/
MakeCachedEnsembleCommand(objv[1 + ensemblePtr->numParameters],
- ensemblePtr, fullName, prefixObj);
+ ensemblePtr, hPtr);
}
+ prefixObj = Tcl_GetHashValue(hPtr);
Tcl_IncrRefCount(prefixObj);
runResultingSubcommand:
@@ -2216,16 +2212,12 @@ static void
MakeCachedEnsembleCommand(
Tcl_Obj *objPtr,
EnsembleConfig *ensemblePtr,
- const char *subcommandName,
- Tcl_Obj *prefixObjPtr)
+ Tcl_HashEntry *hPtr)
{
register EnsembleCmdRep *ensembleCmd;
- int length;
if (objPtr->typePtr == &tclEnsembleCmdType) {
ensembleCmd = objPtr->internalRep.twoPtrValue.ptr1;
- Tcl_DecrRefCount(ensembleCmd->realPrefixObj);
- ckfree(ensembleCmd->fullSubcmdName);
} else {
/*
* Kill the old internal rep, and replace it with a brand new one of
@@ -2244,11 +2236,8 @@ MakeCachedEnsembleCommand(
ensembleCmd->epoch = ensemblePtr->epoch;
ensembleCmd->token = ensemblePtr->token;
- ensembleCmd->realPrefixObj = prefixObjPtr;
- length = strlen(subcommandName)+1;
- ensembleCmd->fullSubcmdName = ckalloc(length);
- memcpy(ensembleCmd->fullSubcmdName, subcommandName, (unsigned) length);
- Tcl_IncrRefCount(ensembleCmd->realPrefixObj);
+ ensembleCmd->tablePtr = &ensemblePtr->subcommandTable;
+ ensembleCmd->hPtr = hPtr;
}
/*
@@ -2629,8 +2618,6 @@ FreeEnsembleCmdRep(
{
EnsembleCmdRep *ensembleCmd = objPtr->internalRep.twoPtrValue.ptr1;
- Tcl_DecrRefCount(ensembleCmd->realPrefixObj);
- ckfree(ensembleCmd->fullSubcmdName);
ckfree(ensembleCmd);
objPtr->typePtr = NULL;
}
@@ -2660,17 +2647,13 @@ DupEnsembleCmdRep(
{
EnsembleCmdRep *ensembleCmd = objPtr->internalRep.twoPtrValue.ptr1;
EnsembleCmdRep *ensembleCopy = ckalloc(sizeof(EnsembleCmdRep));
- int length = strlen(ensembleCmd->fullSubcmdName);
copyPtr->typePtr = &tclEnsembleCmdType;
copyPtr->internalRep.twoPtrValue.ptr1 = ensembleCopy;
ensembleCopy->epoch = ensembleCmd->epoch;
ensembleCopy->token = ensembleCmd->token;
- ensembleCopy->realPrefixObj = ensembleCmd->realPrefixObj;
- Tcl_IncrRefCount(ensembleCopy->realPrefixObj);
- ensembleCopy->fullSubcmdName = ckalloc(length + 1);
- memcpy(ensembleCopy->fullSubcmdName, ensembleCmd->fullSubcmdName,
- (unsigned) length+1);
+ ensembleCopy->tablePtr = ensembleCmd->tablePtr;
+ ensembleCopy->hPtr = ensembleCmd->hPtr;
}
/*
diff --git a/generic/tclIndexObj.c b/generic/tclIndexObj.c
index ce8b9fb..d01e685 100644
--- a/generic/tclIndexObj.c
+++ b/generic/tclIndexObj.c
@@ -961,7 +961,7 @@ Tcl_WrongNumArgs(
register EnsembleCmdRep *ecrPtr =
origObjv[i]->internalRep.twoPtrValue.ptr1;
- elementStr = ecrPtr->fullSubcmdName;
+ elementStr = Tcl_GetHashKey(ecrPtr->tablePtr, ecrPtr->hPtr);
elemLen = strlen(elementStr);
} else {
elementStr = TclGetStringFromObj(origObjv[i], &elemLen);
@@ -1014,8 +1014,10 @@ Tcl_WrongNumArgs(
} else if (objv[i]->typePtr == &tclEnsembleCmdType) {
register EnsembleCmdRep *ecrPtr =
objv[i]->internalRep.twoPtrValue.ptr1;
+ const char *fullSubcmdName
+ = Tcl_GetHashKey(ecrPtr->tablePtr, ecrPtr->hPtr);
- Tcl_AppendStringsToObj(objPtr, ecrPtr->fullSubcmdName, NULL);
+ Tcl_AppendStringsToObj(objPtr, fullSubcmdName, NULL);
} else {
/*
* Quote the argument if it contains spaces (Bug 942757).
diff --git a/generic/tclInt.h b/generic/tclInt.h
index e00c392..48eecce 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -400,11 +400,9 @@ typedef struct {
* ensemble. */
Tcl_Command token; /* Reference to the comamnd for which this
* structure is a cache of the resolution. */
- char *fullSubcmdName; /* The full (local) name of the subcommand,
- * allocated with ckalloc(). */
- Tcl_Obj *realPrefixObj; /* Object containing the prefix words of the
- * command that implements this ensemble
- * subcommand. */
+ Tcl_HashTable *tablePtr; /* The subcommand hash table. */
+ Tcl_HashEntry *hPtr; /* Direct link to entry in the subcommand
+ * hash table. */
} EnsembleCmdRep;
/*