@@ -4689,15 +4689,18 @@ static Jim_VarVal *JimCreateVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, Ji
46894689 */
46904690int Jim_SetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, Jim_Obj *valObjPtr)
46914691{
4692- int err ;
4692+ int ret = JIM_OK ;
46934693 Jim_VarVal *vv;
46944694
46954695 switch (SetVariableFromAny(interp, nameObjPtr)) {
46964696 case JIM_DICT_SUGAR:
4697- return JimDictSugarSet(interp, nameObjPtr, valObjPtr);
4697+ ret = JimDictSugarSet(interp, nameObjPtr, valObjPtr);
4698+ break;
46984699
46994700 case JIM_ERR:
4700- JimCreateVariable(interp, nameObjPtr, valObjPtr);
4701+ if (JimCreateVariable(interp, nameObjPtr, valObjPtr) == NULL) {
4702+ ret = JIM_ERR;
4703+ }
47014704 break;
47024705
47034706 case JIM_OK:
@@ -4712,13 +4715,16 @@ int Jim_SetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, Jim_Obj *valObjPtr)
47124715
47134716 savedCallFrame = interp->framePtr;
47144717 interp->framePtr = vv->linkFramePtr;
4715- err = Jim_SetVariable(interp, vv->objPtr, valObjPtr);
4718+ ret = Jim_SetVariable(interp, vv->objPtr, valObjPtr);
47164719 interp->framePtr = savedCallFrame;
4717- if (err != JIM_OK)
4718- return err;
47194720 }
4721+ break;
47204722 }
4721- return JIM_OK;
4723+ if (ret != JIM_OK && valObjPtr->refCount == 0) {
4724+ /* Since we couldn't take ownership of the object, need to free it here */
4725+ Jim_FreeNewObj(interp, valObjPtr);
4726+ }
4727+ return ret;
47224728}
47234729
47244730int Jim_SetVariableStr(Jim_Interp *interp, const char *name, Jim_Obj *objPtr)
@@ -7403,8 +7409,9 @@ int Jim_ListSetIndex(Jim_Interp *interp, Jim_Obj *varNamePtr,
74037409 goto err;
74047410 Jim_InvalidateStringRep(objPtr);
74057411 Jim_InvalidateStringRep(varObjPtr);
7406- if (Jim_SetVariable(interp, varNamePtr, varObjPtr) != JIM_OK)
7407- goto err;
7412+ if (Jim_SetVariable(interp, varNamePtr, varObjPtr) != JIM_OK) {
7413+ return JIM_ERR;
7414+ }
74087415 Jim_SetResult(interp, varObjPtr);
74097416 return JIM_OK;
74107417 err:
@@ -8040,7 +8047,6 @@ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr,
80408047 }
80418048 varObjPtr = objPtr = Jim_NewDictObj(interp, NULL, 0);
80428049 if (Jim_SetVariable(interp, varNamePtr, objPtr) != JIM_OK) {
8043- Jim_FreeNewObj(interp, varObjPtr);
80448050 return JIM_ERR;
80458051 }
80468052 }
@@ -8095,7 +8101,7 @@ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr,
80958101 Jim_InvalidateStringRep(objPtr);
80968102 Jim_InvalidateStringRep(varObjPtr);
80978103 if (Jim_SetVariable(interp, varNamePtr, varObjPtr) != JIM_OK) {
8098- goto err ;
8104+ return JIM_ERR ;
80998105 }
81008106
81018107 if (!(flags & JIM_NORESULT)) {
@@ -10832,7 +10838,6 @@ static int Jim_IncrCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1083210838 if (!intObjPtr || Jim_IsShared(intObjPtr)) {
1083310839 intObjPtr = Jim_NewIntObj(interp, wideValue + increment);
1083410840 if (Jim_SetVariable(interp, argv[1], intObjPtr) != JIM_OK) {
10835- Jim_FreeNewObj(interp, intObjPtr);
1083610841 return JIM_ERR;
1083710842 }
1083810843 }
@@ -12929,9 +12934,6 @@ static int Jim_LoopCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1292912934 else {
1293012935 objPtr = Jim_NewIntObj(interp, i);
1293112936 retval = Jim_SetVariable(interp, argv[1], objPtr);
12932- if (retval != JIM_OK) {
12933- Jim_FreeNewObj(interp, objPtr);
12934- }
1293512937 }
1293612938 }
1293712939 }
@@ -13044,10 +13046,10 @@ static int JimForeachMapHelper(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1304413046 /* Ran out, so store the empty string */
1304513047 valObj = interp->emptyObj;
1304613048 }
13047- /* Avoid shimmering */
13048- Jim_IncrRefCount(valObj);
13049+ // XXX
13050+ // Jim_IncrRefCount(valObj);
1304913051 result = Jim_SetVariable(interp, varName, valObj);
13050- Jim_DecrRefCount(interp, valObj);
13052+ // Jim_DecrRefCount(interp, valObj);
1305113053 if (result != JIM_OK) {
1305213054 goto err;
1305313055 }
@@ -13572,24 +13574,19 @@ static int Jim_LsearchCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *
1357213574static int Jim_LappendCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
1357313575{
1357413576 Jim_Obj *listObjPtr;
13575- int new_obj = 0;
1357613577 int i;
1357713578
1357813579 listObjPtr = Jim_GetVariable(interp, argv[1], JIM_UNSHARED);
1357913580 if (!listObjPtr) {
1358013581 /* Create the list if it does not exist */
1358113582 listObjPtr = Jim_NewListObj(interp, NULL, 0);
13582- new_obj = 1;
1358313583 }
1358413584 else if (Jim_IsShared(listObjPtr)) {
1358513585 listObjPtr = Jim_DuplicateObj(interp, listObjPtr);
13586- new_obj = 1;
1358713586 }
1358813587 for (i = 2; i < argc; i++)
1358913588 Jim_ListAppendElement(interp, listObjPtr, argv[i]);
1359013589 if (Jim_SetVariable(interp, argv[1], listObjPtr) != JIM_OK) {
13591- if (new_obj)
13592- Jim_FreeNewObj(interp, listObjPtr);
1359313590 return JIM_ERR;
1359413591 }
1359513592 Jim_SetResult(interp, listObjPtr);
@@ -13832,24 +13829,18 @@ static int Jim_AppendCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *a
1383213829 return JIM_ERR;
1383313830 }
1383413831 else {
13835- int new_obj = 0;
1383613832 stringObjPtr = Jim_GetVariable(interp, argv[1], JIM_UNSHARED);
1383713833 if (!stringObjPtr) {
1383813834 /* Create the string if it doesn't exist */
1383913835 stringObjPtr = Jim_NewEmptyStringObj(interp);
13840- new_obj = 1;
1384113836 }
1384213837 else if (Jim_IsShared(stringObjPtr)) {
13843- new_obj = 1;
1384413838 stringObjPtr = Jim_DuplicateObj(interp, stringObjPtr);
1384513839 }
1384613840 for (i = 2; i < argc; i++) {
1384713841 Jim_AppendObj(interp, stringObjPtr, argv[i]);
1384813842 }
1384913843 if (Jim_SetVariable(interp, argv[1], stringObjPtr) != JIM_OK) {
13850- if (new_obj) {
13851- Jim_FreeNewObj(interp, stringObjPtr);
13852- }
1385313844 return JIM_ERR;
1385413845 }
1385513846 }
0 commit comments