diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-08-03 08:51:17 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-08-03 09:02:25 +1000 |
commit | 7303b4685a2c3c04e41ba8a9c44c8416879fc380 (patch) | |
tree | a9b55884d8b376a266d253aba658fa2fec14957c | |
parent | cbeb3ea3fba64cca44600df912ea04656e0bf7f2 (diff) | |
download | jimtcl-7303b4685a2c3c04e41ba8a9c44c8416879fc380.zip jimtcl-7303b4685a2c3c04e41ba8a9c44c8416879fc380.tar.gz jimtcl-7303b4685a2c3c04e41ba8a9c44c8416879fc380.tar.bz2 |
Fix commit cbeb3ea: unset missing array element
Although [dict unset] should not complain about
being unable to unset a missing element, unset via array
syntax (dict sugar) should - to be compatible with Tcl.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim-array.c | 2 | ||||
-rw-r--r-- | jim-file.c | 4 | ||||
-rw-r--r-- | jim.c | 16 | ||||
-rw-r--r-- | jim.h | 2 |
4 files changed, 14 insertions, 10 deletions
diff --git a/jim-array.c b/jim-array.c index f2da480..1c601e4 100644 --- a/jim-array.c +++ b/jim-array.c @@ -211,7 +211,7 @@ static int array_cmd_set(Jim_Interp *interp, int argc, Jim_Obj *const *argv) Jim_ListIndex(interp, listObj, i, &nameObj, JIM_NONE); Jim_ListIndex(interp, listObj, i + 1, &valueObj, JIM_NONE); - rc = Jim_SetDictKeysVector(interp, argv[0], &nameObj, 1, valueObj); + rc = Jim_SetDictKeysVector(interp, argv[0], &nameObj, 1, valueObj, JIM_ERRMSG); } return rc; @@ -132,7 +132,7 @@ static int set_array_int_value(Jim_Interp *interp, Jim_Obj *container, const cha Jim_Obj *nameobj = Jim_NewStringObj(interp, key, -1); Jim_Obj *valobj = Jim_NewWideObj(interp, value); - if (Jim_SetDictKeysVector(interp, container, &nameobj, 1, valobj) != JIM_OK) { + if (Jim_SetDictKeysVector(interp, container, &nameobj, 1, valobj, JIM_ERRMSG) != JIM_OK) { Jim_FreeObj(interp, nameobj); Jim_FreeObj(interp, valobj); return JIM_ERR; @@ -146,7 +146,7 @@ static int set_array_string_value(Jim_Interp *interp, Jim_Obj *container, const Jim_Obj *nameobj = Jim_NewStringObj(interp, key, -1); Jim_Obj *valobj = Jim_NewStringObj(interp, value, -1); - if (Jim_SetDictKeysVector(interp, container, &nameobj, 1, valobj) != JIM_OK) { + if (Jim_SetDictKeysVector(interp, container, &nameobj, 1, valobj, JIM_ERRMSG) != JIM_OK) { Jim_FreeObj(interp, nameobj); Jim_FreeObj(interp, valobj); return JIM_ERR; @@ -4284,7 +4284,7 @@ static int JimDictSugarSet(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *valObjP SetDictSubstFromAny(interp, objPtr); err = Jim_SetDictKeysVector(interp, objPtr->internalRep.dictSubstValue.varNameObjPtr, - &objPtr->internalRep.dictSubstValue.indexObjPtr, 1, valObjPtr); + &objPtr->internalRep.dictSubstValue.indexObjPtr, 1, valObjPtr, JIM_ERRMSG); if (err == JIM_OK) { /* Don't keep an extra ref to the result */ @@ -6621,9 +6621,13 @@ int Jim_DictKeysVector(Jim_Interp *interp, Jim_Obj *dictPtr, * with the new value of the element 'newObjPtr'. * * If newObjPtr == NULL the operation is to remove the given key - * from the dictionary. */ + * from the dictionary. + * + * If flags & JIM_ERRMSG, then failure to remove the key is considered an error + * and JIM_ERR is returned. Otherwise it is ignored and JIM_OK is returned. + */ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr, - Jim_Obj *const *keyv, int keyc, Jim_Obj *newObjPtr) + Jim_Obj *const *keyv, int keyc, Jim_Obj *newObjPtr, int flags) { Jim_Obj *varObjPtr, *objPtr, *dictObjPtr; int shared, i; @@ -6677,7 +6681,7 @@ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr, } /* Note error on unset with missing last key is OK */ if (Jim_DictAddElement(interp, objPtr, keyv[keyc - 1], newObjPtr) != JIM_OK) { - if (newObjPtr) { + if (newObjPtr || (flags & JIM_ERRMSG)) { goto err; } } @@ -13322,7 +13326,7 @@ static int Jim_DictCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...? value"); return JIM_ERR; } - return Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc - 4, argv[argc - 1]); + return Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc - 4, argv[argc - 1], JIM_ERRMSG); case OPT_EXIST: if (argc < 3) { @@ -13338,7 +13342,7 @@ static int Jim_DictCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...?"); return JIM_ERR; } - return Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc - 3, NULL); + return Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc - 3, NULL, JIM_NONE); case OPT_KEYS: if (argc != 3 && argc != 4) { @@ -810,7 +810,7 @@ JIM_EXPORT int Jim_DictKeysVector (Jim_Interp *interp, Jim_Obj **objPtrPtr, int flags); JIM_EXPORT int Jim_SetDictKeysVector (Jim_Interp *interp, Jim_Obj *varNamePtr, Jim_Obj *const *keyv, int keyc, - Jim_Obj *newObjPtr); + Jim_Obj *newObjPtr, int flags); JIM_EXPORT int Jim_DictPairs(Jim_Interp *interp, Jim_Obj *dictPtr, Jim_Obj ***objPtrPtr, int *len); JIM_EXPORT int Jim_DictAddElement(Jim_Interp *interp, Jim_Obj *objPtr, |