Tcl Source Code

Artifact [d07329d8b4]
Login

Artifact d07329d8b4e6b060f818236e7605e0d31ec2e6d0:

Attachment "nsChildTable.patch" to ticket [2694630fff] added by dkf 2009-03-19 22:05:20.
Index: generic/tclInt.h
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclInt.h,v
retrieving revision 1.418
diff -u -r1.418 tclInt.h
--- generic/tclInt.h	9 Mar 2009 09:12:39 -0000	1.418
+++ generic/tclInt.h	19 Mar 2009 14:56:40 -0000
@@ -236,8 +236,10 @@
     struct Namespace *parentPtr;/* Points to the namespace that contains this
 				 * one. NULL if this is the global
 				 * namespace. */
-    Tcl_HashTable childTable;	/* Contains any child namespaces. Indexed by
-				 * strings; values have type (Namespace *). */
+    Tcl_HashTable *childTablePtr;
+				/* Contains any child namespaces. Indexed by
+				 * strings; values have type (Namespace *). If
+				 * NULL, there are no children. */
     long nsId;			/* Unique id for the namespace. */
     Tcl_Interp *interp;		/* The interpreter containing this
 				 * namespace. */
Index: generic/tclNamesp.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclNamesp.c,v
retrieving revision 1.189
diff -u -r1.189 tclNamesp.c
--- generic/tclNamesp.c	10 Feb 2009 22:50:07 -0000	1.189
+++ generic/tclNamesp.c	19 Mar 2009 14:56:41 -0000
@@ -795,7 +795,8 @@
 	 * already exist in the parent namespace.
 	 */
 
-	if (Tcl_FindHashEntry(&parentPtr->childTable, simpleName) != NULL) {
+	if (parentPtr->childTablePtr != NULL &&
+		Tcl_FindHashEntry(parentPtr->childTablePtr,simpleName)!=NULL){
 	    Tcl_AppendResult(interp, "can't create namespace \"", name,
 		    "\": already exists", NULL);
 	    return NULL;
@@ -814,7 +815,7 @@
     nsPtr->clientData = clientData;
     nsPtr->deleteProc = deleteProc;
     nsPtr->parentPtr = parentPtr;
-    Tcl_InitHashTable(&nsPtr->childTable, TCL_STRING_KEYS);
+    nsPtr->childTablePtr = NULL;
     nsPtr->nsId = ++(tsdPtr->numNsCreated);
     nsPtr->interp = interp;
     nsPtr->flags = 0;
@@ -838,7 +839,12 @@
     nsPtr->commandPathSourceList = NULL;
 
     if (parentPtr != NULL) {
-	entryPtr = Tcl_CreateHashEntry(&parentPtr->childTable, simpleName,
+	if (parentPtr->childTablePtr == NULL) {
+	    parentPtr->childTablePtr = (Tcl_HashTable *)
+		    ckalloc(sizeof(Tcl_HashTable));
+	    Tcl_InitHashTable(parentPtr->childTablePtr, TCL_STRING_KEYS);
+	}
+	entryPtr = Tcl_CreateHashEntry(parentPtr->childTablePtr, simpleName,
 		&newEntry);
 	Tcl_SetHashValue(entryPtr, nsPtr);
     } else {
@@ -992,7 +998,7 @@
     if (nsPtr->activationCount - (nsPtr == globalNsPtr) > 0) {
 	nsPtr->flags |= NS_DYING;
 	if (nsPtr->parentPtr != NULL) {
-	    entryPtr = Tcl_FindHashEntry(&nsPtr->parentPtr->childTable,
+	    entryPtr = Tcl_FindHashEntry(nsPtr->parentPtr->childTablePtr,
 		    nsPtr->name);
 	    if (entryPtr != NULL) {
 		Tcl_DeleteHashEntry(entryPtr);
@@ -1022,7 +1028,10 @@
 
 	    TclDeleteNamespaceVars(nsPtr);
 
-	    Tcl_DeleteHashTable(&nsPtr->childTable);
+	    if (nsPtr->childTablePtr != NULL) {
+		Tcl_DeleteHashTable(nsPtr->childTablePtr);
+		ckfree((char *) nsPtr->childTablePtr);
+	    }
 	    Tcl_DeleteHashTable(&nsPtr->cmdTable);
 
 	    /*
@@ -1118,7 +1127,7 @@
      */
 
     if (nsPtr->parentPtr != NULL) {
-	entryPtr = Tcl_FindHashEntry(&nsPtr->parentPtr->childTable,
+	entryPtr = Tcl_FindHashEntry(nsPtr->parentPtr->childTablePtr,
 		nsPtr->name);
 	if (entryPtr != NULL) {
 	    Tcl_DeleteHashEntry(entryPtr);
@@ -1156,11 +1165,13 @@
      * Don't optimize to Tcl_NextHashEntry() because of traces.
      */
 
-    for (entryPtr = Tcl_FirstHashEntry(&nsPtr->childTable, &search);
-	    entryPtr != NULL;
-	    entryPtr = Tcl_FirstHashEntry(&nsPtr->childTable, &search)) {
-	childNsPtr = Tcl_GetHashValue(entryPtr);
-	Tcl_DeleteNamespace(childNsPtr);
+    if (nsPtr->childTablePtr != NULL) {
+	for (entryPtr = Tcl_FirstHashEntry(nsPtr->childTablePtr, &search);
+		entryPtr != NULL;
+		entryPtr = Tcl_FirstHashEntry(nsPtr->childTablePtr,&search)) {
+	    childNsPtr = Tcl_GetHashValue(entryPtr);
+	    Tcl_DeleteNamespace(childNsPtr);
+	}
     }
 
     /*
@@ -2218,7 +2229,11 @@
 	 */
 
 	if (nsPtr != NULL) {
-	    entryPtr = Tcl_FindHashEntry(&nsPtr->childTable, nsName);
+	    if (nsPtr->childTablePtr == NULL) {
+		entryPtr = NULL;
+	    } else {
+		entryPtr = Tcl_FindHashEntry(nsPtr->childTablePtr, nsName);
+	    }
 	    if (entryPtr != NULL) {
 		nsPtr = Tcl_GetHashValue(entryPtr);
 	    } else if (flags & TCL_CREATE_NS_IF_UNKNOWN) {
@@ -2227,8 +2242,8 @@
 		(void) TclPushStackFrame(interp, &framePtr,
 			(Tcl_Namespace *) nsPtr, /*isProcCallFrame*/ 0);
 
-		nsPtr = (Namespace *) Tcl_CreateNamespace(interp, nsName,
-			NULL, NULL);
+		nsPtr = (Namespace *)
+			Tcl_CreateNamespace(interp, nsName, NULL, NULL);
 		TclPopStackFrame(interp);
 
 		if (nsPtr == NULL) {
@@ -2245,7 +2260,11 @@
 	 */
 
 	if (altNsPtr != NULL) {
-	    entryPtr = Tcl_FindHashEntry(&altNsPtr->childTable, nsName);
+	    if (altNsPtr->childTablePtr != NULL) {
+		entryPtr = Tcl_FindHashEntry(altNsPtr->childTablePtr, nsName);
+	    } else {
+		entryPtr = NULL;
+	    }
 	    if (entryPtr != NULL) {
 		altNsPtr = Tcl_GetHashValue(entryPtr);
 	    } else {
@@ -2625,8 +2644,12 @@
 
 	for (i = trailFront;  i >= 0;  i--) {
 	    trailNsPtr = trailPtr[i];
-	    hPtr = Tcl_FindHashEntry(&shadowNsPtr->childTable,
-		    trailNsPtr->name);
+	    if (shadowNsPtr->childTablePtr != NULL) {
+		hPtr = Tcl_FindHashEntry(shadowNsPtr->childTablePtr,
+			trailNsPtr->name);
+	    } else {
+		hPtr = NULL;
+	    }
 	    if (hPtr != NULL) {
 		shadowNsPtr = Tcl_GetHashValue(hPtr);
 	    } else {
@@ -2996,13 +3019,17 @@
 	if (strncmp(pattern, nsPtr->fullName, length) != 0) {
 	    goto searchDone;
 	}
-	if (Tcl_FindHashEntry(&nsPtr->childTable, pattern+length) != NULL) {
+	if (nsPtr->childTablePtr != NULL &&
+		Tcl_FindHashEntry(nsPtr->childTablePtr,pattern+length)!=NULL){
 	    Tcl_ListObjAppendElement(interp, listPtr,
 		    Tcl_NewStringObj(pattern, -1));
 	}
 	goto searchDone;
     }
-    entryPtr = Tcl_FirstHashEntry(&nsPtr->childTable, &search);
+    if (nsPtr->childTablePtr == NULL) {
+	goto searchDone;
+    }
+    entryPtr = Tcl_FirstHashEntry(nsPtr->childTablePtr, &search);
     while (entryPtr != NULL) {
 	childNsPtr = Tcl_GetHashValue(entryPtr);
 	if ((pattern == NULL)
Index: generic/tclResolve.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclResolve.c,v
retrieving revision 1.10
diff -u -r1.10 tclResolve.c
--- generic/tclResolve.c	27 Apr 2008 22:21:32 -0000	1.10
+++ generic/tclResolve.c	19 Mar 2009 14:56:41 -0000
@@ -262,11 +262,13 @@
 
     nsPtr->cmdRefEpoch++;
 
-    for (entry = Tcl_FirstHashEntry(&nsPtr->childTable, &search);
-	    entry != NULL; entry = Tcl_NextHashEntry(&search)) {
-	Namespace *childNsPtr = Tcl_GetHashValue(entry);
+    if (nsPtr->childTablePtr != NULL) {
+	for (entry = Tcl_FirstHashEntry(nsPtr->childTablePtr, &search);
+		entry != NULL; entry = Tcl_NextHashEntry(&search)) {
+	    Namespace *childNsPtr = Tcl_GetHashValue(entry);
 
-	BumpCmdRefEpochs(childNsPtr);
+	    BumpCmdRefEpochs(childNsPtr);
+	}
     }
     TclInvalidateNsPath(nsPtr);
 }
Index: pkgs/itcl/generic/itclMigrate2TclCore.c
===================================================================
RCS file: /cvsroot/tcl/itcl/generic/itclMigrate2TclCore.c,v
retrieving revision 1.1.1.4
diff -u -r1.1.1.4 itclMigrate2TclCore.c
--- pkgs/itcl/generic/itclMigrate2TclCore.c	3 Feb 2009 20:35:00 -0000	1.1.1.4
+++ pkgs/itcl/generic/itclMigrate2TclCore.c	19 Mar 2009 14:56:41 -0000
@@ -47,7 +47,12 @@
 _Tcl_GetNamespaceChildTable(
     Tcl_Namespace *nsPtr)
 {
-    return &((Namespace *)nsPtr)->childTable;
+    Namespace *nPtr = (Namespace *) nsPtr;
+    if (nPtr->childTablePtr == NULL) {
+	nPtr->childTablePtr = (Tcl_HashTable*) ckalloc(sizeof(Tcl_HashTable));
+	Tcl_InitHashTable(nPtr->childTablePtr, TCL_STRING_KEYS);
+    }
+    return nPtr->childTablePtr;
 }
 
 int