diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | generic/tclVar.c | 289 |
2 files changed, 196 insertions, 98 deletions
@@ -1,3 +1,8 @@ +2010-02-04 Donal K. Fellows <dkf@users.sf.net> + + * generic/tclVar.c: Added more use of error-codes and reduced the + stack overhead of older interfaces. + 2010-02-03 Donal K. Fellows <dkf@users.sf.net> * generic/tclVar.c (ArrayUnsetCmd): More corrections. diff --git a/generic/tclVar.c b/generic/tclVar.c index 287b03b..f39383d 100644 --- a/generic/tclVar.c +++ b/generic/tclVar.c @@ -16,7 +16,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclVar.c,v 1.190 2010/02/03 13:26:04 dkf Exp $ + * RCS: @(#) $Id: tclVar.c,v 1.191 2010/02/04 10:53:34 dkf Exp $ */ #include "tclInt.h" @@ -28,7 +28,7 @@ static Tcl_HashEntry * AllocVarEntry(Tcl_HashTable *tablePtr, void *keyPtr); static void FreeVarEntry(Tcl_HashEntry *hPtr); static int CompareVarKeys(void *keyPtr, Tcl_HashEntry *hPtr); -static unsigned int HashVarKey(Tcl_HashTable *tablePtr, void *keyPtr); +static unsigned HashVarKey(Tcl_HashTable *tablePtr, void *keyPtr); static const Tcl_HashKeyType tclVarHashKeyType = { TCL_HASH_KEY_TYPE_VERSION, /* version */ @@ -770,7 +770,7 @@ TclObjLookupVarEx( if (flags & TCL_LEAVE_ERR_MSG) { part1 = TclGetString(part1Ptr); TclObjVarErrMsg(interp, part1Ptr, part2Ptr, msg, - "Cached variable reference is NULL.", -1); + "cached variable reference is NULL.", -1); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "VARNAME", NULL); } return NULL; @@ -1012,10 +1012,10 @@ TclLookupSimpleVar( register Tcl_Obj *objPtr = *objPtrPtr; if (objPtr) { - const char *localName = TclGetString(objPtr); + const char *localNameStr = TclGetString(objPtr); - if ((varName[0] == localName[0]) - && (strcmp(varName, localName) == 0)) { + if ((varName[0] == localNameStr[0]) + && (strcmp(varName, localNameStr) == 0)) { *indexPtr = i; return (Var *) &varFramePtr->compiledLocals[i]; } @@ -1115,6 +1115,7 @@ TclLookupArrayElement( if (flags & TCL_LEAVE_ERR_MSG) { TclObjVarErrMsg(interp, arrayNamePtr, elNamePtr, msg, noSuchVar, index); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "VARNAME", NULL); } return NULL; } @@ -1206,7 +1207,17 @@ Tcl_GetVar( * TCL_NAMESPACE_ONLY or TCL_LEAVE_ERR_MSG * bits. */ { - return Tcl_GetVar2(interp, varName, NULL, flags); + Tcl_Obj *varNamePtr, *resultPtr; + + varNamePtr = Tcl_NewStringObj(varName, -1); + Tcl_IncrRefCount(varNamePtr); + resultPtr = Tcl_ObjGetVar2(interp, varNamePtr, NULL, flags); + TclDecrRefCount(varNamePtr); + + if (resultPtr == NULL) { + return NULL; + } + return TclGetString(resultPtr); } /* @@ -1244,13 +1255,27 @@ Tcl_GetVar2( * TCL_NAMESPACE_ONLY and TCL_LEAVE_ERR_MSG * * bits. */ { - Tcl_Obj *objPtr; + Tcl_Obj *resultPtr, *part1Ptr, *part2Ptr; + + part1Ptr = Tcl_NewStringObj(part1, -1); + Tcl_IncrRefCount(part1Ptr); + if (part2) { + part2Ptr = Tcl_NewStringObj(part2, -1); + Tcl_IncrRefCount(part2Ptr); + } else { + part2Ptr = NULL; + } - objPtr = Tcl_GetVar2Ex(interp, part1, part2, flags); - if (objPtr == NULL) { + resultPtr = Tcl_ObjGetVar2(interp, part1Ptr, part2Ptr, flags); + + Tcl_DecrRefCount(part1Ptr); + if (part2Ptr) { + Tcl_DecrRefCount(part2Ptr); + } + if (resultPtr == NULL) { return NULL; } - return TclGetString(objPtr); + return TclGetString(resultPtr); } /* @@ -1533,7 +1558,21 @@ Tcl_SetVar( * TCL_APPEND_VALUE, TCL_LIST_ELEMENT, * TCL_LEAVE_ERR_MSG. */ { - return Tcl_SetVar2(interp, varName, NULL, newValue, flags); + Tcl_Obj *valuePtr, *varNamePtr, *varValuePtr; + + varNamePtr = Tcl_NewStringObj(varName, -1); + Tcl_IncrRefCount(varNamePtr); + valuePtr = Tcl_NewStringObj(newValue, -1); + Tcl_IncrRefCount(valuePtr); + + varValuePtr = Tcl_ObjSetVar2(interp, varNamePtr, NULL, valuePtr, flags); + + Tcl_DecrRefCount(varNamePtr); + Tcl_DecrRefCount(valuePtr); + if (varValuePtr == NULL) { + return NULL; + } + return TclGetString(varValuePtr); } /* @@ -1577,19 +1616,27 @@ Tcl_SetVar2( * TCL_APPEND_VALUE, TCL_LIST_ELEMENT, or * TCL_LEAVE_ERR_MSG. */ { - register Tcl_Obj *valuePtr; + Tcl_Obj *valuePtr, *part1Ptr, *part2Ptr; Tcl_Obj *varValuePtr; - /* - * Create an object holding the variable's new value and use Tcl_SetVar2Ex - * to actually set the variable. - */ - + part1Ptr = Tcl_NewStringObj(part1, -1); + Tcl_IncrRefCount(part1Ptr); + if (part2 != NULL) { + part2Ptr = Tcl_NewStringObj(part2, -1); + Tcl_IncrRefCount(part2Ptr); + } else { + part2Ptr = NULL; + } valuePtr = Tcl_NewStringObj(newValue, -1); Tcl_IncrRefCount(valuePtr); - varValuePtr = Tcl_SetVar2Ex(interp, part1, part2, valuePtr, flags); - Tcl_DecrRefCount(valuePtr); + varValuePtr = Tcl_ObjSetVar2(interp, part1Ptr, part2Ptr, valuePtr, flags); + + Tcl_DecrRefCount(part1Ptr); + if (part2Ptr != NULL) { + Tcl_DecrRefCount(part2Ptr); + } + Tcl_DecrRefCount(valuePtr); if (varValuePtr == NULL) { return NULL; } @@ -1792,9 +1839,11 @@ TclPtrSetVar( if (TclIsVarArrayElement(varPtr)) { TclObjVarErrMsg(interp, part1Ptr, part2Ptr, "set", danglingElement, index); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ELEMENT", NULL); } else { TclObjVarErrMsg(interp, part1Ptr, part2Ptr, "set", danglingVar, index); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "VARNAME", NULL); } } goto earlyError; @@ -1807,6 +1856,7 @@ TclPtrSetVar( if (TclIsVarArray(varPtr)) { if (flags & TCL_LEAVE_ERR_MSG) { TclObjVarErrMsg(interp, part1Ptr, part2Ptr, "set", isArray,index); + Tcl_SetErrorCode(interp, "TCL", "WRITE", "ARRAY", NULL); } goto earlyError; } @@ -2115,7 +2165,21 @@ Tcl_UnsetVar( * TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY or * TCL_LEAVE_ERR_MSG. */ { - return Tcl_UnsetVar2(interp, varName, NULL, flags); + int result; + Tcl_Obj *varNamePtr; + + varNamePtr = Tcl_NewStringObj(varName, -1); + Tcl_IncrRefCount(varNamePtr); + + /* + * Filter to pass through only the flags this interface supports. + */ + + flags &= (TCL_GLOBAL_ONLY|TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG); + result = TclObjUnsetVar2(interp, varNamePtr, NULL, flags); + + Tcl_DecrRefCount(varNamePtr); + return result; } /* @@ -2799,6 +2863,7 @@ TclArraySet( if (arrayPtr) { CleanupVar(varPtr, arrayPtr); TclObjVarErrMsg(interp, arrayNameObj, NULL, "set", needArray, -1); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "VARNAME", NULL); return TCL_ERROR; } @@ -2868,6 +2933,7 @@ TclArraySet( if (elemLen & 1) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "list must have an even number of elements", -1)); + Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "FORMAT", NULL); return TCL_ERROR; } if (elemLen == 0) { @@ -2917,6 +2983,7 @@ TclArraySet( TclObjVarErrMsg(interp, arrayNameObj, NULL, "array set", needArray, -1); + Tcl_SetErrorCode(interp, "TCL", "WRITE", "ARRAY", NULL); return TCL_ERROR; } } @@ -2998,6 +3065,7 @@ ArrayStartSearchCmd( if ((varPtr == NULL) || !TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr)) { Tcl_AppendResult(interp, "\"", varName, "\" isn't an array", NULL); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY", NULL); return TCL_ERROR; } @@ -3095,6 +3163,7 @@ ArrayAnyMoreCmd( || TclIsVarUndefined(varPtr)) { Tcl_AppendResult(interp, "\"", TclGetString(varNamePtr), "\" isn't an array", NULL); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY", NULL); return TCL_ERROR; } @@ -3198,6 +3267,7 @@ ArrayNextElementCmd( || TclIsVarUndefined(varPtr)) { Tcl_AppendResult(interp, "\"", TclGetString(varNamePtr), "\" isn't an array", NULL); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY", NULL); return TCL_ERROR; } @@ -3305,6 +3375,7 @@ ArrayDoneSearchCmd( || TclIsVarUndefined(varPtr)) { Tcl_AppendResult(interp, "\"", TclGetString(varNamePtr), "\" isn't an array", NULL); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY", NULL); return TCL_ERROR; } @@ -3942,6 +4013,7 @@ ArrayStatsCmd( || TclIsVarUndefined(varPtr)) { Tcl_AppendResult(interp, "\"", TclGetString(varNamePtr), "\" isn't an array", NULL); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY", NULL); return TCL_ERROR; } @@ -4232,6 +4304,7 @@ ObjMakeUpvar( TclGetString(myNamePtr), "\": upvar won't create " "namespace variable that refers to procedure variable", NULL); + Tcl_SetErrorCode(interp, "TCL", "UPVAR", "INVERTED", NULL); return TCL_ERROR; } } @@ -4331,6 +4404,8 @@ TclPtrObjMakeUpvar( Tcl_AppendResult((Tcl_Interp *) iPtr, "bad variable name \"", myName, "\": upvar won't create a scalar variable " "that looks like an array element", NULL); + Tcl_SetErrorCode(interp, "TCL", "UPVAR", "LOCAL_ELEMENT", + NULL); return TCL_ERROR; } } @@ -4356,14 +4431,18 @@ TclPtrObjMakeUpvar( if (varPtr == otherPtr) { Tcl_SetResult((Tcl_Interp *) iPtr, "can't upvar from variable to itself", TCL_STATIC); + Tcl_SetErrorCode(interp, "TCL", "UPVAR", "SELF", NULL); return TCL_ERROR; } if (TclIsVarTraced(varPtr)) { Tcl_AppendResult((Tcl_Interp *) iPtr, "variable \"", myName, "\" has traces: can't use for upvar", NULL); + Tcl_SetErrorCode(interp, "TCL", "UPVAR", "TRACED", NULL); return TCL_ERROR; } else if (!TclIsVarUndefined(varPtr)) { + Var *linkPtr; + /* * The variable already existed. Make sure this variable "varPtr" * isn't the same as "otherPtr" (avoid circular links). Also, if it's @@ -4371,23 +4450,23 @@ TclPtrObjMakeUpvar( * disconnect it from the thing it currently refers to. */ - if (TclIsVarLink(varPtr)) { - Var *linkPtr = varPtr->value.linkPtr; - - if (linkPtr == otherPtr) { - return TCL_OK; - } - if (TclIsVarInHash(linkPtr)) { - VarHashRefCount(linkPtr)--; - if (TclIsVarUndefined(linkPtr)) { - CleanupVar(linkPtr, NULL); - } - } - } else { + if (!TclIsVarLink(varPtr)) { Tcl_AppendResult((Tcl_Interp *) iPtr, "variable \"", myName, "\" already exists", NULL); + Tcl_SetErrorCode(interp, "TCL", "UPVAR", "EXISTS", NULL); return TCL_ERROR; } + + linkPtr = varPtr->value.linkPtr; + if (linkPtr == otherPtr) { + return TCL_OK; + } + if (TclIsVarInHash(linkPtr)) { + VarHashRefCount(linkPtr)--; + if (TclIsVarUndefined(linkPtr)) { + CleanupVar(linkPtr, NULL); + } + } } TclSetVarLink(varPtr); varPtr->value.linkPtr = otherPtr; @@ -4411,8 +4490,9 @@ TclPtrObjMakeUpvar( * * Side effects: * The variable in frameName whose name is given by varName becomes - * accessible under the name localName, so that references to localName - * are redirected to the other variable like a symbolic link. + * accessible under the name localNameStr, so that references to + * localNameStr are redirected to the other variable like a symbolic + * link. * *---------------------------------------------------------------------- */ @@ -4426,11 +4506,28 @@ Tcl_UpVar( const char *varName, /* Name of a variable in interp to link to. * May be either a scalar name or an element * in an array. */ - const char *localName, /* Name of link variable. */ + const char *localNameStr, /* Name of link variable. */ int flags) /* 0, TCL_GLOBAL_ONLY or TCL_NAMESPACE_ONLY: - * indicates scope of localName. */ + * indicates scope of localNameStr. */ { - return Tcl_UpVar2(interp, frameName, varName, NULL, localName, flags); + int result; + CallFrame *framePtr; + Tcl_Obj *varNamePtr, *localNamePtr; + + if (TclGetFrame(interp, frameName, &framePtr) == -1) { + return TCL_ERROR; + } + + varNamePtr = Tcl_NewStringObj(varName, -1); + Tcl_IncrRefCount(varNamePtr); + localNamePtr = Tcl_NewStringObj(localNameStr, -1); + Tcl_IncrRefCount(localNamePtr); + + result = ObjMakeUpvar(interp, framePtr, varNamePtr, NULL, 0, + localNamePtr, flags, -1); + Tcl_DecrRefCount(varNamePtr); + Tcl_DecrRefCount(localNamePtr); + return result; } /* @@ -4447,8 +4544,9 @@ Tcl_UpVar( * * Side effects: * The variable in frameName whose name is given by part1 and part2 - * becomes accessible under the name localName, so that references to - * localName are redirected to the other variable like a symbolic link. + * becomes accessible under the name localNameStr, so that references to + * localNameStr are redirected to the other variable like a symbolic + * link. * *---------------------------------------------------------------------- */ @@ -4462,9 +4560,9 @@ Tcl_UpVar2( const char *part1, const char *part2, /* Two parts of source variable name to link * to. */ - const char *localName, /* Name of link variable. */ + const char *localNameStr, /* Name of link variable. */ int flags) /* 0, TCL_GLOBAL_ONLY or TCL_NAMESPACE_ONLY: - * indicates scope of localName. */ + * indicates scope of localNameStr. */ { int result; CallFrame *framePtr; @@ -4476,7 +4574,7 @@ Tcl_UpVar2( part1Ptr = Tcl_NewStringObj(part1, -1); Tcl_IncrRefCount(part1Ptr); - localNamePtr = Tcl_NewStringObj(localName, -1); + localNamePtr = Tcl_NewStringObj(localNameStr, -1); Tcl_IncrRefCount(localNamePtr); result = ObjMakeUpvar(interp, framePtr, part1Ptr, part2, 0, @@ -4518,33 +4616,33 @@ Tcl_GetVariableFullName( Tcl_Obj *namePtr; Namespace *nsPtr; + if (!varPtr || TclIsVarArrayElement(varPtr)) { + return; + } + /* * Add the full name of the containing namespace (if any), followed by the * "::" separator, then the variable name. */ - if (varPtr) { - if (!TclIsVarArrayElement(varPtr)) { - nsPtr = TclGetVarNsPtr(varPtr); - if (nsPtr) { - Tcl_AppendToObj(objPtr, nsPtr->fullName, -1); - if (nsPtr != iPtr->globalNsPtr) { - Tcl_AppendToObj(objPtr, "::", 2); - } - } - if (TclIsVarInHash(varPtr)) { - if (!TclIsVarDeadHash(varPtr)) { - namePtr = VarHashGetKey(varPtr); - Tcl_AppendObjToObj(objPtr, namePtr); - } - } else if (iPtr->varFramePtr->procPtr) { - int index = varPtr - iPtr->varFramePtr->compiledLocals; + nsPtr = TclGetVarNsPtr(varPtr); + if (nsPtr) { + Tcl_AppendToObj(objPtr, nsPtr->fullName, -1); + if (nsPtr != iPtr->globalNsPtr) { + Tcl_AppendToObj(objPtr, "::", 2); + } + } + if (TclIsVarInHash(varPtr)) { + if (!TclIsVarDeadHash(varPtr)) { + namePtr = VarHashGetKey(varPtr); + Tcl_AppendObjToObj(objPtr, namePtr); + } + } else if (iPtr->varFramePtr->procPtr) { + int index = varPtr - iPtr->varFramePtr->compiledLocals; - if (index < iPtr->varFramePtr->numCompiledLocals) { - namePtr = localName(iPtr->varFramePtr, index); - Tcl_AppendObjToObj(objPtr, namePtr); - } - } + if (index < iPtr->varFramePtr->numCompiledLocals) { + namePtr = localName(iPtr->varFramePtr, index); + Tcl_AppendObjToObj(objPtr, namePtr); } } } @@ -4704,6 +4802,7 @@ Tcl_VariableObjCmd( TclObjVarErrMsg(interp, varNamePtr, NULL, "define", isArrayElement, -1); + Tcl_SetErrorCode(interp, "TCL", "UPVAR", "LOCAL_ELEMENT", NULL); return TCL_ERROR; } @@ -4906,7 +5005,7 @@ SetArraySearchObj( Tcl_Obj *objPtr) { const char *string; - char *end; + char *end; /* Can't be const due to strtoul defn. */ int id; size_t offset; @@ -4943,7 +5042,9 @@ SetArraySearchObj( return TCL_OK; syntax: - Tcl_AppendResult(interp, "illegal search identifier \"",string,"\"",NULL); + Tcl_AppendResult(interp, "illegal search identifier \"", string, "\"", + NULL); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAYSEARCH", NULL); return TCL_ERROR; } @@ -4997,17 +5098,9 @@ ParseSearchId( * Extract the information out of the Tcl_Obj. */ -#if 1 id = PTR2INT(handleObj->internalRep.twoPtrValue.ptr1); string = TclGetString(handleObj); offset = PTR2INT(handleObj->internalRep.twoPtrValue.ptr2); -#else - id = (int)(((char *) handleObj->internalRep.twoPtrValue.ptr1) - - ((char *) NULL)); - string = TclGetString(handleObj); - offset = (((char *) handleObj->internalRep.twoPtrValue.ptr2) - - ((char *) NULL)); -#endif /* * This test cannot be placed inside the Tcl_Obj machinery, since it is @@ -5017,6 +5110,8 @@ ParseSearchId( if (strcmp(string+offset, varName) != 0) { Tcl_AppendResult(interp, "search identifier \"", string, "\" isn't for variable \"", varName, "\"", NULL); + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAYSEARCH", string, + NULL); goto badLookup; } @@ -5126,15 +5221,14 @@ TclDeleteNamespaceVars( for (varPtr = VarHashFirstVar(tablePtr, &search); varPtr != NULL; varPtr = VarHashFirstVar(tablePtr, &search)) { Tcl_Obj *objPtr = Tcl_NewObj(); - Tcl_IncrRefCount(objPtr); + Tcl_IncrRefCount(objPtr); VarHashRefCount(varPtr)++; /* Make sure we get to remove from * hash. */ Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, objPtr); - UnsetVarStruct(varPtr, NULL, iPtr, /* part1 */ objPtr, - NULL, flags, -1); - Tcl_DecrRefCount(objPtr); /* free no longer needed obj */ - + UnsetVarStruct(varPtr, NULL, iPtr, /* part1 */ objPtr, NULL, flags, + -1); + Tcl_DecrRefCount(objPtr); /* Free no longer needed obj */ /* * Remove the variable from the table and force it undefined in case @@ -5430,6 +5524,9 @@ TclObjVarErrMsg( * NULL. */ { if (!part1Ptr) { + if (index == -1) { + Tcl_Panic("invalid part1Ptr and invalid index together"); + } part1Ptr = localName(((Interp *)interp)->varFramePtr, index); } Tcl_SetObjResult(interp, Tcl_ObjPrintf("can't %s \"%s%s%s%s\": %s", @@ -5579,7 +5676,7 @@ DupParsedVarName( register Tcl_Obj *arrayPtr = srcPtr->internalRep.twoPtrValue.ptr1; register char *elem = srcPtr->internalRep.twoPtrValue.ptr2; char *elemCopy; - unsigned int elemLen; + unsigned elemLen; if (arrayPtr != NULL) { Tcl_IncrRefCount(arrayPtr); @@ -5617,14 +5714,14 @@ UpdateParsedVarName( len2 = strlen(part2); totalLen = len1 + len2 + 2; - p = ckalloc((unsigned int) totalLen + 1); + p = ckalloc((unsigned) totalLen + 1); objPtr->bytes = p; objPtr->length = totalLen; - memcpy(p, part1, (unsigned int) len1); + memcpy(p, part1, (unsigned) len1); p += len1; *p++ = '('; - memcpy(p, part2, (unsigned int) len2); + memcpy(p, part2, (unsigned) len2); p += len2; *p++ = ')'; *p = '\0'; @@ -5751,7 +5848,7 @@ ObjFindNamespaceVar( if (result == TCL_OK) { return var; } else if (result != TCL_CONTINUE) { - return (Tcl_Var) NULL; + return NULL; } } @@ -5824,16 +5921,15 @@ TclInfoVarsCmd( Tcl_Obj *const objv[]) /* Argument objects. */ { Interp *iPtr = (Interp *) interp; - const char *varName, *pattern; - const char *simplePattern; + const char *varName, *pattern, *simplePattern; Tcl_HashSearch search; Var *varPtr; Namespace *nsPtr; Namespace *globalNsPtr = (Namespace *) Tcl_GetGlobalNamespace(interp); Namespace *currNsPtr = (Namespace *) Tcl_GetCurrentNamespace(interp); - Tcl_Obj *listPtr, *elemObjPtr; + Tcl_Obj *listPtr, *elemObjPtr, *varNamePtr; int specificNsInPattern = 0;/* Init. to avoid compiler warning. */ - Tcl_Obj *simplePatternPtr = NULL, *varNamePtr; + Tcl_Obj *simplePatternPtr = NULL; /* * Get the pattern and find the "effective namespace" in which to list @@ -5857,9 +5953,8 @@ TclInfoVarsCmd( Namespace *dummy1NsPtr, *dummy2NsPtr; pattern = TclGetString(objv[1]); - TclGetNamespaceForQualName(interp, pattern, (Namespace *) NULL, - /*flags*/ 0, &nsPtr, &dummy1NsPtr, &dummy2NsPtr, - &simplePattern); + TclGetNamespaceForQualName(interp, pattern, NULL, /*flags*/ 0, + &nsPtr, &dummy1NsPtr, &dummy2NsPtr, &simplePattern); if (nsPtr != NULL) { /* We successfully found the pattern's ns. */ specificNsInPattern = (strcmp(simplePattern, pattern) != 0); @@ -6111,8 +6206,7 @@ TclInfoLocalsCmd( Tcl_Obj *const objv[]) /* Argument objects. */ { Interp *iPtr = (Interp *) interp; - Tcl_Obj *patternPtr; - Tcl_Obj *listPtr; + Tcl_Obj *patternPtr, *listPtr; if (objc == 1) { patternPtr = NULL; @@ -6166,12 +6260,11 @@ AppendLocals( Interp *iPtr = (Interp *) interp; Var *varPtr; int i, localVarCt; - Tcl_Obj **varNamePtr; + Tcl_Obj **varNamePtr, *objNamePtr; const char *varName; TclVarHashTable *localVarTablePtr; Tcl_HashSearch search; const char *pattern = patternPtr? TclGetString(patternPtr) : NULL; - Tcl_Obj *objNamePtr; localVarCt = iPtr->varFramePtr->numCompiledLocals; varPtr = iPtr->varFramePtr->compiledLocals; @@ -6335,7 +6428,7 @@ CompareVarKeys( return 0; } -static unsigned int +static unsigned HashVarKey( Tcl_HashTable *tablePtr, /* Hash table. */ void *keyPtr) /* Key from which to compute hash value. */ @@ -6343,7 +6436,7 @@ HashVarKey( Tcl_Obj *objPtr = keyPtr; const char *string = TclGetString(objPtr); int length = objPtr->length; - unsigned int result = 0; + register unsigned result = 0; int i; /* |