aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-10-14 09:48:11 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:58 +1000
commit8c30b0e5f55f67425c6b83109d28823eb8fa38f5 (patch)
tree1b2f2da6f9a536595d9e81e1794dcbea208c187f /jim.c
parentc5fd0d922c388f4d773ffcc1debc6541c15dc3ea (diff)
downloadjimtcl-8c30b0e5f55f67425c6b83109d28823eb8fa38f5.zip
jimtcl-8c30b0e5f55f67425c6b83109d28823eb8fa38f5.tar.gz
jimtcl-8c30b0e5f55f67425c6b83109d28823eb8fa38f5.tar.bz2
Fix some problems with global and upvar
Redefining a link with upvar or global gave an error. Trying to access a non-existent var via a link gave the wrong error message. Added Tcl upvar tests Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/jim.c b/jim.c
index a75a2f1..defaf54 100644
--- a/jim.c
+++ b/jim.c
@@ -3765,11 +3765,24 @@ int Jim_SetVariableLink(Jim_Interp *interp, Jim_Obj *nameObjPtr,
varName = Jim_GetString(nameObjPtr, &len);
- if (Jim_FindHashEntry(&interp->framePtr->vars, varName)) {
- Jim_SetResultFormatted(interp, "variable \"%#s\" already exists", nameObjPtr);
+ if (Jim_NameIsDictSugar(varName, len)) {
+ Jim_SetResultString(interp, "Dict key syntax invalid as link source", -1);
return JIM_ERR;
}
+ /* Check for an existing variable or link */
+ if (SetVariableFromAny(interp, nameObjPtr) == JIM_OK) {
+ Jim_Var *varPtr = nameObjPtr->internalRep.varValue.varPtr;
+
+ if (varPtr->linkFramePtr == NULL) {
+ Jim_SetResultFormatted(interp, "variable \"%#s\" already exists", nameObjPtr);
+ return JIM_ERR;
+ }
+
+ /* It exists, but is a link, so delete the link */
+ varPtr->linkFramePtr = NULL;
+ }
+
/* Check for cycles. */
if (interp->framePtr == targetCallFrame) {
Jim_Obj *objPtr = targetNameObjPtr;
@@ -3789,10 +3802,7 @@ int Jim_SetVariableLink(Jim_Interp *interp, Jim_Obj *nameObjPtr,
objPtr = varPtr->objPtr;
}
}
- if (Jim_NameIsDictSugar(varName, len)) {
- Jim_SetResultString(interp, "Dict key syntax invalid as link source", -1);
- return JIM_ERR;
- }
+
/* Perform the binding */
Jim_SetVariable(interp, nameObjPtr, targetNameObjPtr);
/* We are now sure 'nameObjPtr' type is variableObjType */
@@ -3822,20 +3832,22 @@ Jim_Obj *Jim_GetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags)
interp->framePtr = varPtr->linkFramePtr;
objPtr = Jim_GetVariable(interp, varPtr->objPtr, flags);
interp->framePtr = savedCallFrame;
- return objPtr;
+ if (objPtr) {
+ return objPtr;
+ }
+ /* Error, so fall through to the error message */
}
}
+ break;
case JIM_DICT_SUGAR:
/* [dict] syntax sugar. */
return JimDictSugarGet(interp, nameObjPtr);
-
- default:
- if (flags & JIM_ERRMSG) {
- Jim_SetResultFormatted(interp, "can't read \"%#s\": no such variable", nameObjPtr);
- }
- return NULL;
}
+ if (flags & JIM_ERRMSG) {
+ Jim_SetResultFormatted(interp, "can't read \"%#s\": no such variable", nameObjPtr);
+ }
+ return NULL;
}
Jim_Obj *Jim_GetGlobalVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags)