~ 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