mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-29 14:30:34 +02:00
refactors to load.c to support auto-compilation
* libguile/load.c (compiled_is_newer): Factored out of scm_primitive_load_path. (scm_try_autocompile): New stub, for autocompiling. Currently just returns false. (scm_primitive_load_path): Refactor, and call out to scm_try_autocompile if the .go is missing or not fresh.
This commit is contained in:
parent
f3130a2ecf
commit
1d022387c8
1 changed files with 45 additions and 32 deletions
|
@ -549,6 +549,43 @@ SCM_DEFINE (scm_sys_search_load_path, "%search-load-path", 1, 0, 0,
|
|||
#undef FUNC_NAME
|
||||
|
||||
|
||||
static int
|
||||
compiled_is_newer (SCM full_filename, SCM compiled_filename)
|
||||
{
|
||||
char *source, *compiled;
|
||||
struct stat stat_source, stat_compiled;
|
||||
int res;
|
||||
|
||||
source = scm_to_locale_string (full_filename);
|
||||
compiled = scm_to_locale_string (compiled_filename);
|
||||
|
||||
if (stat (source, &stat_source) == 0
|
||||
&& stat (compiled, &stat_compiled) == 0
|
||||
&& stat_source.st_mtime <= stat_compiled.st_mtime)
|
||||
{
|
||||
res = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
scm_puts (";;; note: source file ", scm_current_error_port ());
|
||||
scm_puts (source, scm_current_error_port ());
|
||||
scm_puts (" newer than compiled ", scm_current_error_port ());
|
||||
scm_puts (compiled, scm_current_error_port ());
|
||||
scm_puts ("\n", scm_current_error_port ());
|
||||
res = 0;
|
||||
|
||||
}
|
||||
free (source);
|
||||
free (compiled);
|
||||
return res;
|
||||
}
|
||||
|
||||
static SCM
|
||||
scm_try_autocompile (SCM source)
|
||||
{
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
SCM_DEFINE (scm_primitive_load_path, "primitive-load-path", 1, 0, 0,
|
||||
(SCM filename),
|
||||
"Search @var{%load-path} for the file named @var{filename} and\n"
|
||||
|
@ -569,40 +606,16 @@ SCM_DEFINE (scm_primitive_load_path, "primitive-load-path", 1, 0, 0,
|
|||
SCM_MISC_ERROR ("Unable to find file ~S in load path",
|
||||
scm_list_1 (filename));
|
||||
|
||||
if (scm_is_false (compiled_filename))
|
||||
/* FIXME: autocompile here */
|
||||
return scm_primitive_load (full_filename);
|
||||
|
||||
if (scm_is_false (full_filename))
|
||||
if (scm_is_false (full_filename)
|
||||
|| (scm_is_true (compiled_filename)
|
||||
&& compiled_is_newer (full_filename, compiled_filename)))
|
||||
return scm_load_compiled_with_vm (compiled_filename);
|
||||
|
||||
{
|
||||
char *source, *compiled;
|
||||
struct stat stat_source, stat_compiled;
|
||||
|
||||
source = scm_to_locale_string (full_filename);
|
||||
compiled = scm_to_locale_string (compiled_filename);
|
||||
|
||||
if (stat (source, &stat_source) == 0
|
||||
&& stat (compiled, &stat_compiled) == 0
|
||||
&& stat_source.st_mtime <= stat_compiled.st_mtime)
|
||||
{
|
||||
free (source);
|
||||
free (compiled);
|
||||
compiled_filename = scm_try_autocompile (full_filename);
|
||||
if (scm_is_true (compiled_filename))
|
||||
return scm_load_compiled_with_vm (compiled_filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
scm_puts (";;; note: source file ", scm_current_error_port ());
|
||||
scm_puts (source, scm_current_error_port ());
|
||||
scm_puts (" newer than compiled ", scm_current_error_port ());
|
||||
scm_puts (compiled, scm_current_error_port ());
|
||||
scm_puts ("\n", scm_current_error_port ());
|
||||
free (source);
|
||||
free (compiled);
|
||||
return scm_primitive_load (full_filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue