Index: generic/tclEncoding.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclEncoding.c,v
retrieving revision 1.22
diff -u -r1.22 tclEncoding.c
--- generic/tclEncoding.c	7 May 2004 20:01:23 -0000	1.22
+++ generic/tclEncoding.c	3 Jun 2004 20:26:32 -0000
@@ -236,7 +236,7 @@
 			    Tcl_EncodingState *statePtr, char *dst, int dstLen,
 			    int *srcReadPtr, int *dstWrotePtr,
 			    int *dstCharsPtr));
-static int		TclFindEncodings _ANSI_ARGS_((CONST char *argv0));
+static int		FindEncodings();
 
 
 /*
@@ -1142,7 +1142,7 @@
     /*
      * The value returned from TclpNameOfExecutable is a UTF string that
      * is possibly dirty depending on when it was initialized.
-     * TclFindEncodings will indicate whether we must "clean" the UTF (as
+     * FindEncodings will indicate whether we must "clean" the UTF (as
      * reported by the underlying system).  To assure that the UTF string
      * is a properly encoded native string for this system, convert the
      * UTF string to the default native encoding before the default
@@ -1151,7 +1151,7 @@
      */
     
     Tcl_UtfToExternalDString(NULL, name, -1, &buffer);
-    mustCleanUtf = TclFindEncodings(argv0);
+    mustCleanUtf = FindEncodings();
 
     /*
      * Now it is OK to convert the native string back to UTF and set
@@ -1174,7 +1174,7 @@
     return;
 	
     done:
-    (void) TclFindEncodings(argv0);
+    (void) FindEncodings();
 }
 
 /*
@@ -2942,7 +2942,7 @@
 /*
  *-------------------------------------------------------------------------
  *
- * TclFindEncodings --
+ * FindEncodings --
  *
  *	Find and load the encoding file for this operating system.
  *	Before this is called, Tcl makes assumptions about the
@@ -2959,10 +2959,8 @@
  *-------------------------------------------------------------------------
  */
 
-int
-TclFindEncodings(argv0)
-    CONST char *argv0;		/* Name of executable from argv[0] to main()
-				 * in native multi-byte encoding. */
+static int
+FindEncodings()
 {
     int mustCleanUtf = 0;
 
@@ -2974,7 +2972,6 @@
 
 	TclpInitLock();
 	if (encodingsInitialized == 0) {
-	    char *native;
 	    Tcl_Obj *pathPtr;
 	    Tcl_DString libPath, buffer;
 
@@ -2985,8 +2982,13 @@
 
 	    encodingsInitialized = 1;
 
-	    native = TclpFindExecutable(argv0);
-	    mustCleanUtf = TclpInitLibraryPath(native);
+	    /* 
+	     * NOTE: we can safely make direct use of tclNativeExecutableName
+	     * because we know all our callers ( Tcl_FindExecutable() is the
+	     * only one) have already called TclpFindExecutable().
+	     */
+
+	    mustCleanUtf = TclpInitLibraryPath(tclNativeExecutableName);
 
 	    /*
 	     * The library path was set in the TclpInitLibraryPath routine.
Index: generic/tclInt.h
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclInt.h,v
retrieving revision 1.162
diff -u -r1.162 tclInt.h
--- generic/tclInt.h	30 May 2004 12:18:25 -0000	1.162
+++ generic/tclInt.h	3 Jun 2004 20:26:33 -0000
@@ -1641,6 +1641,7 @@
 
 extern char *			tclExecutableName;
 extern char *			tclNativeExecutableName;
+extern int			tclFindExecutableSearchDone;
 extern char *			tclDefaultEncodingDir;
 extern char *			tclMemDumpFileName;
 extern TclPlatformType		tclPlatform;
Index: generic/tclUtil.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclUtil.c,v
retrieving revision 1.44
diff -u -r1.44 tclUtil.c
--- generic/tclUtil.c	6 Apr 2004 22:25:55 -0000	1.44
+++ generic/tclUtil.c	3 Jun 2004 20:26:33 -0000
@@ -25,6 +25,7 @@
 
 char *tclExecutableName = NULL;
 char *tclNativeExecutableName = NULL;
+int tclFindExecutableSearchDone = 0;
 
 /*
  * The following values are used in the flags returned by Tcl_ScanElement
Index: unix/tclUnixFile.c
===================================================================
RCS file: /cvsroot/tcl/tcl/unix/tclUnixFile.c,v
retrieving revision 1.39
diff -u -r1.39 tclUnixFile.c
--- unix/tclUnixFile.c	6 Apr 2004 22:25:57 -0000	1.39
+++ unix/tclUnixFile.c	3 Jun 2004 20:26:33 -0000
@@ -54,9 +54,10 @@
     if (argv0 == NULL) {
 	return NULL;
     }
-    if (tclNativeExecutableName != NULL) {
+    if (tclFindExecutableSearchDone) {
 	return tclNativeExecutableName;
     }
+    tclFindExecutableSearchDone = 1;
 
     Tcl_DStringInit(&buffer);
 
Index: unix/tclUnixTest.c
===================================================================
RCS file: /cvsroot/tcl/tcl/unix/tclUnixTest.c,v
retrieving revision 1.17
diff -u -r1.17 tclUnixTest.c
--- unix/tclUnixTest.c	27 May 2004 13:18:55 -0000	1.17
+++ unix/tclUnixTest.c	3 Jun 2004 20:26:33 -0000
@@ -446,6 +446,7 @@
 {
     char *oldName;
     char *oldNativeName;
+    int oldDone;
 
     if (argc != 2) {
 	Tcl_AppendResult(interp, "wrong # arguments: should be \"", argv[0],
@@ -455,9 +456,11 @@
 
     oldName       = tclExecutableName;
     oldNativeName = tclNativeExecutableName;
+    oldDone       = tclFindExecutableSearchDone;
 
     tclExecutableName       = NULL;
     tclNativeExecutableName = NULL;
+    tclFindExecutableSearchDone = 0;
 
     Tcl_FindExecutable(argv[1]);
     if (tclExecutableName != NULL) {
@@ -468,8 +471,9 @@
 	ckfree(tclNativeExecutableName);
     }
 
-    tclExecutableName       = oldName;
-    tclNativeExecutableName = oldNativeName;
+    tclExecutableName           = oldName;
+    tclNativeExecutableName     = oldNativeName;
+    tclFindExecutableSearchDone = oldDone;
 
     return TCL_OK;
 }
