diff options
-rw-r--r-- | jim.c | 17 | ||||
-rw-r--r-- | test.tcl | 4 | ||||
-rw-r--r-- | tests/errors.tcl | 2 | ||||
-rw-r--r-- | tests/misc.test | 21 |
4 files changed, 35 insertions, 9 deletions
@@ -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; } @@ -1180,7 +1180,7 @@ test incr-1.13 {TclCompileIncrCmd: simple but new (unknown) local name} { } catch {p} msg set msg -} {can't read "bar": no such variable} +} {1} test incr-1.14 {TclCompileIncrCmd: simple local name, >255 locals} { proc 260locals {} { # create 260 locals @@ -1399,7 +1399,7 @@ test incr-2.13 {incr command (not compiled): simple but new (unknown) local name } catch {p} msg set msg -} {can't read "bar": no such variable} +} {1} test incr-2.14 {incr command (not compiled): simple local name, >255 locals} { proc 260locals {} { set z incr diff --git a/tests/errors.tcl b/tests/errors.tcl index f6ecc32..a544faf 100644 --- a/tests/errors.tcl +++ b/tests/errors.tcl @@ -6,7 +6,7 @@ proc error_generator {type} { bogus command called } \ badvar { - incr bogus + set bogus } \ error { error bogus diff --git a/tests/misc.test b/tests/misc.test index 804e456..eda2879 100644 --- a/tests/misc.test +++ b/tests/misc.test @@ -216,4 +216,25 @@ test lindex-1.20 "unary plus" { lindex {a b c} +2 } c +test incr-1.1 "incr unset" { + unset -nocomplain a + incr a + set a +} 1 + +test incr-1.2 "incr, incr unset" { + incr a +} 2 + +test incr-1.3 "incr unset array element" { + unset -nocomplain a + incr a(2) + set a(2) +} 1 + +test incr-1.4 "incr array element - shimmering" { + set b "$a(2)-test" + incr a(2) +} 2 + testreport |