aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-08-03 08:51:17 +1000
committerSteve Bennett <steveb@workware.net.au>2011-08-03 09:02:25 +1000
commit7303b4685a2c3c04e41ba8a9c44c8416879fc380 (patch)
treea9b55884d8b376a266d253aba658fa2fec14957c
parentcbeb3ea3fba64cca44600df912ea04656e0bf7f2 (diff)
downloadjimtcl-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.c2
-rw-r--r--jim-file.c4
-rw-r--r--jim.c16
-rw-r--r--jim.h2
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,