GNU bug report logs - #29226
fresh-auto-compile doesn’t invalidate the compilation cache

Previous Next

Package: guile;

Reported by: ludovic.courtes <at> inria.fr (Ludovic Courtès)

Date: Thu, 9 Nov 2017 12:54:02 UTC

Severity: normal

Done: ludo <at> gnu.org (Ludovic Courtès)

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: ludovic.courtes <at> inria.fr (Ludovic Courtès)
Subject: bug#29226: closed (Re: bug#29226: fresh-auto-compile
 doesn’t invalidate the compilation cache)
Date: Mon, 15 Jan 2018 22:22:03 +0000
[Message part 1 (text/plain, inline)]
Your bug report

#29226: fresh-auto-compile doesn’t invalidate the compilation cache

which was filed against the guile package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to 29226 <at> debbugs.gnu.org.

-- 
29226: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=29226
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: ludo <at> gnu.org (Ludovic Courtès)
To: Andy Wingo <wingo <at> igalia.com>
Cc: 29226-done <at> debbugs.gnu.org
Subject: Re: bug#29226: fresh-auto-compile doesn’t
 invalidate the compilation cache
Date: Mon, 15 Jan 2018 23:21:19 +0100
Andy Wingo <wingo <at> igalia.com> skribis:

> On Mon 15 Jan 2018 15:33, ludo <at> gnu.org (Ludovic Courtès) writes:
>
>> Hello,
>>
>> ludovic.courtes <at> inria.fr (Ludovic Courtès) skribis:
>>
>>> ‘%fresh-auto-compile’ is documented as a way to “forcibly invalidate the
>>> auto-compilation cache” (info "(guile) Compilation"), but it seems that
>>> it doesn’t invalidate much.  Specifically, ‘primitive-load-path’ does:
>>>
>>>   compiled_thunk = load_thunk_from_path (filename, full_filename, &stat_source,
>>>                                          &found_stale_compiled_file);
>>>
>>>   if (scm_is_false (compiled_thunk)
>>>       && scm_is_false (*scm_loc_fresh_auto_compile)
>>>       …)
>>>     { … }
>>>
>>>   …
>>>
>>>   if (scm_is_true (compiled_thunk))
>>>     return scm_call_0 (compiled_thunk);
>>>   else
>>>     {
>>>       SCM freshly_compiled = scm_try_auto_compile (full_filename);
>>>       …
>>>     }
>>>
>>> So if there’s a .go file in the search path, it is *always* loaded, and
>>> there’s no way we reach ‘scm_try_auto_compile’.
>>>
>>> ‘load-absolute’ in boot-9.scm seems to have the same problem:
>>>
>>>   (and scmstat (or (pre-compiled) (fallback)))
>>>
>>> I believe the attached patch fixes it.
>>
>>> Pushed as 83d4c4d622b406ec0bc9d8139ec8182fa72b5720.
>>
>> As we’ve discussed since then, this patch was misguided:
>> ‘%fresh-auto-compile’ is about ~/.cache, so the fact that .go files
>> found elsewhere in the search path get loaded is expected.
>>
>> My apologies for breaking this!
>>
>> So I guess we should revert 83d4c4d622b406ec0bc9d8139ec8182fa72b5720 and
>> release 2.2.4 afterwards.  Does that make sense, Andy?
>
> Makes sense to me, yes!

OK, reverted in a1793bc904d947810d64175945218c2cdace38cc.

Thanks,
Ludo’.

[Message part 3 (message/rfc822, inline)]
From: ludovic.courtes <at> inria.fr (Ludovic Courtès)
To: bug-guile <at> gnu.org
Subject: fresh-auto-compile doesn’t invalidate the
 compilation cache
Date: Thu, 09 Nov 2017 13:53:22 +0100
[Message part 4 (text/plain, inline)]
Hello,

‘%fresh-auto-compile’ is documented as a way to “forcibly invalidate the
auto-compilation cache” (info "(guile) Compilation"), but it seems that
it doesn’t invalidate much.  Specifically, ‘primitive-load-path’ does:

  compiled_thunk = load_thunk_from_path (filename, full_filename, &stat_source,
                                         &found_stale_compiled_file);

  if (scm_is_false (compiled_thunk)
      && scm_is_false (*scm_loc_fresh_auto_compile)
      …)
    { … }

  …

  if (scm_is_true (compiled_thunk))
    return scm_call_0 (compiled_thunk);
  else
    {
      SCM freshly_compiled = scm_try_auto_compile (full_filename);
      …
    }

So if there’s a .go file in the search path, it is *always* loaded, and
there’s no way we reach ‘scm_try_auto_compile’.

‘load-absolute’ in boot-9.scm seems to have the same problem:

  (and scmstat (or (pre-compiled) (fallback)))

I believe the attached patch fixes it.

Thoughts?

Thanks,
Ludo’.

[Message part 5 (text/x-patch, inline)]
diff --git a/libguile/load.c b/libguile/load.c
index 7b8136af8..3747dd9ad 100644
--- a/libguile/load.c
+++ b/libguile/load.c
@@ -1,5 +1,5 @@
 /* Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2004, 2006, 2008,
- *   2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ *   2009, 2010, 2011, 2012, 2013, 2014, 2017 Free Software Foundation, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -1195,13 +1195,16 @@ SCM_DEFINE (scm_primitive_load_path, "primitive-load-path", 0, 0, 1,
                                *scm_loc_load_extensions, SCM_BOOL_F,
                                &stat_source);
 
-  compiled_thunk = load_thunk_from_path (filename, full_filename, &stat_source,
-                                         &found_stale_compiled_file);
+  if (scm_is_false (*scm_loc_fresh_auto_compile))
+    compiled_thunk = load_thunk_from_path (filename, full_filename,
+					   &stat_source,
+					   &found_stale_compiled_file);
+  else
+    compiled_thunk = SCM_BOOL_F;
 
   if (scm_is_false (compiled_thunk)
       && scm_is_true (full_filename)
       && scm_is_true (*scm_loc_compile_fallback_path)
-      && scm_is_false (*scm_loc_fresh_auto_compile)
       && scm_is_pair (*scm_loc_load_compiled_extensions)
       && scm_is_string (scm_car (*scm_loc_load_compiled_extensions)))
     {
diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm
index 7127d73f7..612040aa4 100644
--- a/module/ice-9/boot-9.scm
+++ b/module/ice-9/boot-9.scm
@@ -3812,7 +3812,10 @@ when none is available, reading FILE-NAME with READER."
                                               scmstat
                                               go-file-name))))))
 
-    (let ((compiled (and scmstat (or (pre-compiled) (fallback)))))
+    (let ((compiled (and scmstat
+                         (or (and (not %fresh-auto-compile)
+                                  (pre-compiled))
+                             (fallback)))))
       (if compiled
           (begin
             (if %load-hook

This bug report was last modified 7 years and 128 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.