Tcl Source Code

Artifact [f1395a0446]
Login

Artifact f1395a0446c23c27f7156dd260234b276a57ea9f:

Attachment "circ.patch" to ticket [1805928fff] added by dgp 2007-10-02 03:50:45.
Index: generic/tclPkg.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclPkg.c,v
retrieving revision 1.31
diff -u -r1.31 tclPkg.c
--- generic/tclPkg.c	19 Sep 2007 15:29:21 -0000	1.31
+++ generic/tclPkg.c	1 Oct 2007 20:47:16 -0000
@@ -374,6 +374,14 @@
 	 */
 
 	if (pkgPtr->clientData != NULL) {
+	    if (pkgPtr->clientData == (ClientData) tclEmptyStringRep) {
+		Tcl_AppendResult(interp, "circular package dependency: "
+			"attempt to find ", name, " requires ", name, NULL);
+		AddRequirementsToResult(interp, reqc, reqv);
+		Tcl_AppendResult(interp , "\n('package require {", name,
+			"}' in an index script?)", NULL);
+		return NULL;
+	    }
 	    Tcl_AppendResult(interp, "circular package dependency: "
 		    "attempt to provide ", name, " ",
 		    (char *) pkgPtr->clientData, " requires ", name, NULL);
@@ -575,8 +583,14 @@
 	    Tcl_DStringAppendElement(&command, name);
 	    AddRequirementsToDString(&command, reqc, reqv);
 
+	    pkgPtr->clientData = (ClientData) tclEmptyStringRep;
+
 	    code = Tcl_EvalEx(interp, Tcl_DStringValue(&command),
 		    Tcl_DStringLength(&command), TCL_EVAL_GLOBAL);
+
+	    if (pkgPtr->clientData == (ClientData) tclEmptyStringRep) {
+		pkgPtr->clientData = NULL;
+	    }
 	    Tcl_DStringFree(&command);
 
 	    if ((code != TCL_OK) && (code != TCL_ERROR)) {