diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-08-01 11:07:32 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-08-01 11:07:32 +1000 |
commit | cbeb3ea3fba64cca44600df912ea04656e0bf7f2 (patch) | |
tree | 903a8e1025a9bca520e23d9181a23a1504af3659 | |
parent | 511deea93dd23de9794c7e84ece07bad807db789 (diff) | |
download | jimtcl-cbeb3ea3fba64cca44600df912ea04656e0bf7f2.zip jimtcl-cbeb3ea3fba64cca44600df912ea04656e0bf7f2.tar.gz jimtcl-cbeb3ea3fba64cca44600df912ea04656e0bf7f2.tar.bz2 |
dict unset should not return error on missing last key
dict unset was returning an error with no message
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 18 | ||||
-rw-r--r-- | tests/dict.test | 5 |
2 files changed, 17 insertions, 6 deletions
@@ -5785,7 +5785,6 @@ int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) linenr = 1; } Jim_IncrRefCount(fileNameObj); - //printf("%s:%d incr %s\n", __FILE__, __LINE__, Jim_String(fileNameObj)); /* Get the string representation */ str = Jim_GetString(objPtr, &strLen); @@ -6632,8 +6631,9 @@ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr, varObjPtr = objPtr = Jim_GetVariable(interp, varNamePtr, newObjPtr == NULL ? JIM_ERRMSG : JIM_NONE); if (objPtr == NULL) { - if (newObjPtr == NULL) /* Cannot remove a key from non existing var */ + if (newObjPtr == NULL) /* Cannot remove a key from non existing var */ { return JIM_ERR; + } varObjPtr = objPtr = Jim_NewDictObj(interp, NULL, 0); if (Jim_SetVariable(interp, varNamePtr, objPtr) != JIM_OK) { Jim_FreeNewObj(interp, varObjPtr); @@ -6647,8 +6647,9 @@ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr, /* Check if it's a valid dictionary */ if (dictObjPtr->typePtr != &dictObjType) { - if (SetDictFromAny(interp, dictObjPtr) != JIM_OK) + if (SetDictFromAny(interp, dictObjPtr) != JIM_OK) { goto err; + } } /* Check if the given key exists. */ Jim_InvalidateStringRep(dictObjPtr); @@ -6665,21 +6666,26 @@ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr, /* Key not found. If it's an [unset] operation * this is an error. Only the last key may not * exist. */ - if (newObjPtr == NULL) + if (newObjPtr == NULL) { goto err; + } /* Otherwise set an empty dictionary * as key's value. */ objPtr = Jim_NewDictObj(interp, NULL, 0); DictAddElement(interp, dictObjPtr, keyv[i], objPtr); } } + /* Note error on unset with missing last key is OK */ if (Jim_DictAddElement(interp, objPtr, keyv[keyc - 1], newObjPtr) != JIM_OK) { - goto err; + if (newObjPtr) { + goto err; + } } Jim_InvalidateStringRep(objPtr); Jim_InvalidateStringRep(varObjPtr); - if (Jim_SetVariable(interp, varNamePtr, varObjPtr) != JIM_OK) + if (Jim_SetVariable(interp, varNamePtr, varObjPtr) != JIM_OK) { goto err; + } Jim_SetResult(interp, varObjPtr); return JIM_OK; err: diff --git a/tests/dict.test b/tests/dict.test index dc36b39..31250b1 100644 --- a/tests/dict.test +++ b/tests/dict.test @@ -197,5 +197,10 @@ test dict-22.11 {dict with command: no recursive structures [Bug 1786481]} { string range [append foo OK] end-1 end } OK +test dict-23.1 {dict unset missing last level} { + set a {b c d e} + dict unset a xyz + dict size $a +} 2 testreport |