From 7303b4685a2c3c04e41ba8a9c44c8416879fc380 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Wed, 3 Aug 2011 08:51:17 +1000 Subject: 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 --- jim-array.c | 2 +- jim-file.c | 4 ++-- jim.c | 16 ++++++++++------ 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; diff --git a/jim-file.c b/jim-file.c index 5c962ac..4e43430 100644 --- a/jim-file.c +++ b/jim-file.c @@ -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; diff --git a/jim.c b/jim.c index f4d7e1e..0f42303 100644 --- a/jim.c +++ b/jim.c @@ -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) { diff --git a/jim.h b/jim.h index a6138b5..667a05d 100644 --- a/jim.h +++ b/jim.h @@ -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, -- cgit v1.1