~ chicken-core (chicken-5) fb2eb5260121db9a5c24fd37c881b83a0e4ae02b


commit fb2eb5260121db9a5c24fd37c881b83a0e4ae02b
Author:     Evan Hanson <evhan@foldling.org>
AuthorDate: Mon Apr 20 18:01:49 2015 +1200
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Mon Apr 20 18:01:49 2015 +1200

    Only resolve executable once when using a private repository
    
    Avoids resolving the current executable twice when a private repository
    is used on SEARCH_EXE_PATH platforms by moving the `C_main_exe`
    assignment into `C_main_entry_point`. (Previously, it would be resolved
    once by `C_private_repository` and once again when setting `C_main_exe`.)

diff --git a/chicken.h b/chicken.h
index a0af44a9..c4b3da20 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1587,9 +1587,9 @@ extern double trunc(double);
 #define C_ub_i_pointer_f64_set(p, n)    (*((double *)(p)) = (n))
 
 #ifdef C_PRIVATE_REPOSITORY
-# define C_private_repository(fname)     C_use_private_repository(C_path_to_executable(fname))
+# define C_private_repository()         C_use_private_repository(C_executable_dirname())
 #else
-# define C_private_repository(fname)
+# define C_private_repository()
 #endif
 
 /* left for backwards-compatibility */
@@ -1601,13 +1601,20 @@ extern double trunc(double);
 # define C_set_gui_mode
 #endif
 
+#ifdef SEARCH_EXE_PATH
+# define C_set_main_exe(fname)          C_main_exe = C_resolve_executable_pathname(fname)
+#else
+# define C_set_main_exe(fname)
+#endif
+
 #if !defined(C_EMBEDDED) && !defined(C_SHARED)
 # if (defined(C_WINDOWS_GUI) || defined(C_GUI)) && defined(_WIN32)
 #  define C_main_entry_point            \
   int WINAPI WinMain(HINSTANCE me, HINSTANCE you, LPSTR cmdline, int show) \
   { \
     C_gui_mode = 1; \
-    C_private_repository(NULL);		      \
+    C_set_main_exe(argv[0]);				\
+    C_private_repository();				\
     return CHICKEN_main(0, NULL, (void *)C_toplevel); \
   }
 # else
@@ -1615,7 +1622,8 @@ extern double trunc(double);
   int main(int argc, char *argv[]) \
   { \
     C_set_gui_mode; \
-    C_private_repository(argv[ 0 ]);			\
+    C_set_main_exe(argv[0]);				\
+    C_private_repository();				\
     return CHICKEN_main(argc, argv, (void*)C_toplevel); \
   }
 # endif
@@ -1840,8 +1848,8 @@ C_fctexport int C_do_unregister_finalizer(C_word x);
 C_fctexport C_word C_dbg_hook(C_word x);
 C_fctexport void C_use_private_repository(C_char *path);
 C_fctexport C_char *C_private_repository_path();
+C_fctexport C_char *C_executable_dirname();
 C_fctexport C_char *C_executable_pathname();
-C_fctexport C_char *C_path_to_executable(C_char *fname);
 C_fctexport C_char *C_resolve_executable_pathname(C_char *fname);
 
 C_fctimport void C_ccall C_toplevel(C_word c, C_word self, C_word k) C_noret;
diff --git a/runtime.c b/runtime.c
index e9ea0172..30f74d82 100644
--- a/runtime.c
+++ b/runtime.c
@@ -1223,10 +1223,6 @@ void CHICKEN_parse_command_line(int argc, char *argv[], C_word *heap, C_word *st
   C_main_argc = argc;
   C_main_argv = argv;
 
-#ifdef SEARCH_EXE_PATH
-  C_main_exe = C_resolve_executable_pathname(argv[0]);
-#endif
-
   *heap = DEFAULT_HEAP_SIZE;
   *stack = DEFAULT_STACK_SIZE;
   *symbols = DEFAULT_SYMBOL_TABLE_SIZE;
@@ -8968,16 +8964,16 @@ C_executable_pathname() {
 #ifdef SEARCH_EXE_PATH
   return C_main_exe == NULL ? NULL : C_strdup(C_main_exe);
 #else
-  return C_resolve_executable_pathname(C_main_argv[0]);
+  return C_resolve_executable_pathname(NULL);
 #endif
 }
 
 C_char *
-C_path_to_executable(C_char *fname) {
+C_executable_dirname() {
   int len;
   C_char *path;
 
-  if((path = C_resolve_executable_pathname(fname)) == NULL)
+  if((path = C_executable_pathname()) == NULL)
     return NULL;
 
 #if defined(_WIN32) && !defined(__CYGWIN__)
Trap