aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-01-24 12:58:35 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:45 +1000
commit541fe7c30691ace08847a35280d9cc8bc02e9a72 (patch)
tree530be84682be78cc1e34b5feaa64ee388f725768 /jim.c
parent5dbbcf87423edb96cde7dfe59a2c8ef0a9d8ae2f (diff)
downloadjimtcl-541fe7c30691ace08847a35280d9cc8bc02e9a72.zip
jimtcl-541fe7c30691ace08847a35280d9cc8bc02e9a72.tar.gz
jimtcl-541fe7c30691ace08847a35280d9cc8bc02e9a72.tar.bz2
Allow incr on unset variable
From Tcl 8.5, implicitly set variable to 0
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/jim.c b/jim.c
index accadfc..8277bd3 100644
--- a/jim.c
+++ b/jim.c
@@ -8909,12 +8909,13 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
Jim_DecrRefCount(interp, scriptObjPtr);
return JIM_OK;
}
- if (script->len == 4 && script->token[0].type == JIM_TT_ESC && script->token[2].type == JIM_TT_ESC) {
+ if (script->len == 4 && script->token[0].type == JIM_TT_ESC && script->token[2].type == JIM_TT_ESC && script->token[2].objPtr->typePtr == &variableObjType) {
Jim_Cmd *cmdPtr = Jim_GetCommand(interp, script->token[0].objPtr, JIM_NONE);
if (cmdPtr && cmdPtr->cmdProc == Jim_IncrCoreCommand) {
Jim_Obj *objPtr = Jim_GetVariable(interp, script->token[2].objPtr, JIM_NONE);
if (objPtr && !Jim_IsShared(objPtr) && objPtr->typePtr == &intObjType) {
objPtr->internalRep.wideValue++;
+ Jim_InvalidateStringRep(objPtr);
Jim_DecrRefCount(interp, scriptObjPtr);
Jim_SetResult(interp, objPtr);
return JIM_OK;
@@ -9952,11 +9953,15 @@ static int Jim_IncrCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
if (Jim_GetWide(interp, argv[2], &increment) != JIM_OK)
return JIM_ERR;
}
- intObjPtr = Jim_GetVariable(interp, argv[1], JIM_ERRMSG);
- if (!intObjPtr) return JIM_ERR;
- if (Jim_GetWide(interp, intObjPtr, &wideValue) != JIM_OK)
+ intObjPtr = Jim_GetVariable(interp, argv[1], JIM_NONE);
+ if (!intObjPtr) {
+ /* Set missing variable to 0 */
+ wideValue = 0;
+ }
+ else if (Jim_GetWide(interp, intObjPtr, &wideValue) != JIM_OK) {
return JIM_ERR;
- if (Jim_IsShared(intObjPtr)) {
+ }
+ if (!intObjPtr || Jim_IsShared(intObjPtr)) {
intObjPtr = Jim_NewIntObj(interp, wideValue+increment);
if (Jim_SetVariable(interp, argv[1], intObjPtr) != JIM_OK) {
Jim_FreeNewObj(interp, intObjPtr);
@@ -9966,7 +9971,7 @@ static int Jim_IncrCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
Jim_SetWide(interp, intObjPtr, wideValue+increment);
/* The following step is required in order to invalidate the
* string repr of "FOO" if the var name is on the form of "FOO(IDX)" */
- if (argv[1]->typePtr == &dictSubstObjType) {
+ if (argv[1]->typePtr != &variableObjType) {
if (Jim_SetVariable(interp, argv[1], intObjPtr) != JIM_OK) {
return JIM_ERR;
}