From 541fe7c30691ace08847a35280d9cc8bc02e9a72 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Sun, 24 Jan 2010 12:58:35 +1000 Subject: Allow incr on unset variable From Tcl 8.5, implicitly set variable to 0 --- jim.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'jim.c') 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; } -- cgit v1.1