Tcl Source Code

Artifact [93323db475]
Login

Artifact 93323db4754d58a8e9dafb3d18b7d0975830988a:

Attachment "tclNamesp.c.patch" to ticket [1352382fff] added by nobody 2005-11-10 00:09:17.
--- orig\tclNamesp.c	2005-10-28 12:24:40.515898100 +0100
+++ tclNamesp.c	2005-11-09 16:28:25.781575800 +0000
@@ -767,7 +767,9 @@
     CONST char *simpleName;
     Tcl_HashEntry *entryPtr;
     Tcl_DString buffer1, buffer2;
+    Tcl_DString *name_dstrp, *buff_dstrp, *temp_dstrp;
     int newEntry;
+    int name_len;
     ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
 
     /*
@@ -874,21 +876,26 @@
 
     Tcl_DStringInit(&buffer1);
     Tcl_DStringInit(&buffer2);
+    name_dstrp = &buffer1;
+    buff_dstrp = &buffer2;
     for (ancestorPtr = nsPtr;  ancestorPtr != NULL;
 	    ancestorPtr = ancestorPtr->parentPtr) {
 	if (ancestorPtr != globalNsPtr) {
-	    Tcl_DStringAppend(&buffer1, "::", 2);
-	    Tcl_DStringAppend(&buffer1, ancestorPtr->name, -1);
+	    Tcl_DStringAppend(buff_dstrp, "::", 2);
+	    Tcl_DStringAppend(buff_dstrp, ancestorPtr->name, -1);
+	    Tcl_DStringAppend(buff_dstrp, Tcl_DStringValue(name_dstrp),
+		    Tcl_DStringLength(name_dstrp));
+	    /* Now swap the buffer pointers */
+	    temp_dstrp = name_dstrp;
+	    name_dstrp = buff_dstrp;
+	    buff_dstrp = temp_dstrp;
+	    Tcl_DStringSetLength(buff_dstrp, 0);
 	}
-	Tcl_DStringAppend(&buffer1, Tcl_DStringValue(&buffer2), -1);
-
-	Tcl_DStringSetLength(&buffer2, 0);
-	Tcl_DStringAppend(&buffer2, Tcl_DStringValue(&buffer1), -1);
-	Tcl_DStringSetLength(&buffer1, 0);
     }
 
-    name = Tcl_DStringValue(&buffer2);
-    nsPtr->fullName = (char *) ckalloc((unsigned) (strlen(name)+1));
+    name = Tcl_DStringValue(name_dstrp);
+    name_len = Tcl_DStringLength(name_dstrp);
+    nsPtr->fullName = (char *) ckalloc((unsigned) (name_len+1));
     strcpy(nsPtr->fullName, name);
 
     Tcl_DStringFree(&buffer1);
@@ -3182,7 +3189,7 @@
 
     currNsPtr = (Namespace *) Tcl_GetCurrentNamespace(interp);
     if (currNsPtr == (Namespace *) Tcl_GetGlobalNamespace(interp)) {
-	objPtr = Tcl_NewStringObj("::", -1);
+	objPtr = Tcl_NewStringObj("::", 2);
     } else {
 	objPtr = Tcl_NewStringObj(currNsPtr->fullName, -1);
     }
@@ -3223,6 +3230,7 @@
     Tcl_Obj *CONST objv[];	/* Argument objects. */
 {
     register Namespace *currNsPtr;
+    CONST char *name;
 
     if (objc != 2) {
 	Tcl_WrongNumArgs(interp, 2, objv, NULL);
@@ -3239,11 +3247,9 @@
      */
 
     currNsPtr = (Namespace *) Tcl_GetCurrentNamespace(interp);
-    if (currNsPtr == (Namespace *) Tcl_GetGlobalNamespace(interp)) {
-	Tcl_SetObjResult(interp, Tcl_NewStringObj("::", 2));
-    } else {
-	Tcl_SetObjResult(interp, Tcl_NewStringObj(currNsPtr->fullName, -1));
-    }
+    name = (currNsPtr == (Namespace *) Tcl_GetGlobalNamespace(interp))
+	    ? "::" : currNsPtr->fullName;
+    Tcl_SetObjResult(interp, Tcl_NewStringObj(name, -1));
     return TCL_OK;
 }
 
@@ -4627,18 +4633,15 @@
 {
     ResolvedNsName *resNamePtr =
 	    (ResolvedNsName *) objPtr->internalRep.otherValuePtr;
-    register Namespace *nsPtr;
     char *name = "";
-    int length;
+    int length = 0;
 
     if ((resNamePtr != NULL)
 	    && (resNamePtr->nsId == resNamePtr->nsPtr->nsId)) {
-	nsPtr = resNamePtr->nsPtr;
-	if (nsPtr->flags & NS_DEAD) {
-	    nsPtr = NULL;
-	}
-	if (nsPtr != NULL) {
+	Namespace *nsPtr = resNamePtr->nsPtr;
+	if (nsPtr != NULL && !(nsPtr->flags & NS_DEAD)) {
 	    name = nsPtr->fullName;
+	    length = strlen(name);
 	}
     }
 
@@ -4647,7 +4650,6 @@
      * if the internal rep is NULL.
      */
 
-    length = strlen(name);
     if (length == 0) {
 	objPtr->bytes = tclEmptyStringRep;
     } else {
@@ -4971,11 +4973,9 @@
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_MAP], -1));
 	    Tcl_GetEnsembleMappingDict(NULL, token, &tmpObj);
-	    if (tmpObj != NULL) {
-		Tcl_ListObjAppendElement(NULL, resultObj, tmpObj);
-	    } else {
-		Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewObj());
-	    }
+	    Tcl_ListObjAppendElement(NULL, resultObj,
+		    tmpObj ? tmpObj : Tcl_NewObj());
+
 	    /* -namespace option */
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_NAMESPACE], -1));
@@ -4993,20 +4993,16 @@
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_SUBCMDS], -1));
 	    Tcl_GetEnsembleSubcommandList(NULL, token, &tmpObj);
-	    if (tmpObj != NULL) {
-		Tcl_ListObjAppendElement(NULL, resultObj, tmpObj);
-	    } else {
-		Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewObj());
-	    }
+	    Tcl_ListObjAppendElement(NULL, resultObj,
+		    tmpObj ? tmpObj : Tcl_NewObj());
+
 	    /* -unknown option */
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_UNKNOWN], -1));
 	    Tcl_GetEnsembleUnknownHandler(NULL, token, &tmpObj);
-	    if (tmpObj != NULL) {
-		Tcl_ListObjAppendElement(NULL, resultObj, tmpObj);
-	    } else {
-		Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewObj());
-	    }
+	    Tcl_ListObjAppendElement(NULL, resultObj,
+		    tmpObj ? tmpObj : Tcl_NewObj());
+
 	    Tcl_SetObjResult(interp, resultObj);
 	    return TCL_OK;