summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jim.c17
-rw-r--r--test.tcl4
-rw-r--r--tests/errors.tcl2
-rw-r--r--tests/misc.test21
4 files changed, 35 insertions, 9 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;
}
diff --git a/test.tcl b/test.tcl
index c4d287f..b869f47 100644
--- a/test.tcl
+++ b/test.tcl
@@ -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