summaryrefslogtreecommitdiffstats
path: root/generic/tclDictObj.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclDictObj.c')
-rw-r--r--generic/tclDictObj.c65
1 files changed, 20 insertions, 45 deletions
diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c
index 44ab882..4088883 100644
--- a/generic/tclDictObj.c
+++ b/generic/tclDictObj.c
@@ -145,7 +145,7 @@ typedef struct Dict {
* the entries in the order that they are
* created. */
int epoch; /* Epoch counter */
- size_t refCount; /* Reference counter (see above) */
+ int refcount; /* Reference counter (see above) */
Tcl_Obj *chain; /* Linked list used for invalidating the
* string representations of updated nested
* dictionaries. */
@@ -395,7 +395,7 @@ DupDictInternalRep(
newDict->epoch = 0;
newDict->chain = NULL;
- newDict->refCount = 1;
+ newDict->refcount = 1;
/*
* Store in the object.
@@ -430,7 +430,8 @@ FreeDictInternalRep(
{
Dict *dict = DICT(dictPtr);
- if (dict->refCount-- <= 1) {
+ dict->refcount--;
+ if (dict->refcount <= 0) {
DeleteDict(dict);
}
dictPtr->typePtr = NULL;
@@ -509,7 +510,7 @@ UpdateStringOfDict(
/* Handle empty list case first, simplifies what follows */
if (numElems == 0) {
- dictPtr->bytes = &tclEmptyString;
+ dictPtr->bytes = tclEmptyStringRep;
dictPtr->length = 0;
return;
}
@@ -715,7 +716,7 @@ SetDictFromAny(
TclFreeIntRep(objPtr);
dict->epoch = 0;
dict->chain = NULL;
- dict->refCount = 1;
+ dict->refcount = 1;
DICT(objPtr) = dict;
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
objPtr->typePtr = &tclDictType;
@@ -1119,7 +1120,7 @@ Tcl_DictObjFirst(
searchPtr->dictionaryPtr = (Tcl_Dict) dict;
searchPtr->epoch = dict->epoch;
searchPtr->next = cPtr->nextPtr;
- dict->refCount++;
+ dict->refcount++;
if (keyPtrPtr != NULL) {
*keyPtrPtr = Tcl_GetHashKey(&dict->table, &cPtr->entry);
}
@@ -1233,7 +1234,8 @@ Tcl_DictObjDone(
if (searchPtr->epoch != -1) {
searchPtr->epoch = -1;
dict = (Dict *) searchPtr->dictionaryPtr;
- if (dict->refCount-- <= 1) {
+ dict->refcount--;
+ if (dict->refcount <= 0) {
DeleteDict(dict);
}
}
@@ -1385,7 +1387,7 @@ Tcl_NewDictObj(void)
InitChainTable(dict);
dict->epoch = 0;
dict->chain = NULL;
- dict->refCount = 1;
+ dict->refcount = 1;
DICT(dictPtr) = dict;
dictPtr->internalRep.twoPtrValue.ptr2 = NULL;
dictPtr->typePtr = &tclDictType;
@@ -1435,7 +1437,7 @@ Tcl_DbNewDictObj(
InitChainTable(dict);
dict->epoch = 0;
dict->chain = NULL;
- dict->refCount = 1;
+ dict->refcount = 1;
DICT(dictPtr) = dict;
dictPtr->internalRep.twoPtrValue.ptr2 = NULL;
dictPtr->typePtr = &tclDictType;
@@ -2379,7 +2381,7 @@ DictAppendCmd(
Tcl_Obj *const *objv)
{
Tcl_Obj *dictPtr, *valuePtr, *resultPtr;
- int allocatedDict = 0;
+ int i, allocatedDict = 0;
if (objc < 3) {
Tcl_WrongNumArgs(interp, 1, objv, "dictVarName key ?value ...?");
@@ -2402,44 +2404,17 @@ DictAppendCmd(
return TCL_ERROR;
}
- if ((objc > 3) || (valuePtr == NULL)) {
- /* Only go through append activites when something will change. */
- Tcl_Obj *appendObjPtr = NULL;
-
- if (objc > 3) {
- /* Something to append */
-
- if (objc == 4) {
- appendObjPtr = objv[3];
- } else if (TCL_OK != TclStringCatObjv(interp, /* inPlace */ 1,
- objc-3, objv+3, &appendObjPtr)) {
- return TCL_ERROR;
- }
- }
-
- if (appendObjPtr == NULL) {
- /* => (objc == 3) => (valuePtr == NULL) */
- TclNewObj(valuePtr);
- } else if (valuePtr == NULL) {
- valuePtr = appendObjPtr;
- appendObjPtr = NULL;
- }
-
- if (appendObjPtr) {
- if (Tcl_IsShared(valuePtr)) {
- valuePtr = Tcl_DuplicateObj(valuePtr);
- }
-
- Tcl_AppendObjToObj(valuePtr, appendObjPtr);
- }
+ if (valuePtr == NULL) {
+ TclNewObj(valuePtr);
+ } else if (Tcl_IsShared(valuePtr)) {
+ valuePtr = Tcl_DuplicateObj(valuePtr);
+ }
- Tcl_DictObjPut(NULL, dictPtr, objv[2], valuePtr);
+ for (i=3 ; i<objc ; i++) {
+ Tcl_AppendObjToObj(valuePtr, objv[i]);
}
- /*
- * Even if nothing changed, we still overwrite so that variable
- * trace expectations are met.
- */
+ Tcl_DictObjPut(NULL, dictPtr, objv[2], valuePtr);
resultPtr = Tcl_ObjSetVar2(interp, objv[1], NULL, dictPtr,
TCL_LEAVE_ERR_MSG);