unofficial mirror of bug-guile@gnu.org 
 help / color / mirror / Atom feed
* bug#12202: psyntax defeats autoload
@ 2012-08-14 16:14 Ludovic Courtès
  2013-03-05 16:45 ` Andy Wingo
  0 siblings, 1 reply; 4+ messages in thread
From: Ludovic Courtès @ 2012-08-14 16:14 UTC (permalink / raw)
  To: 12202

[-- Attachment #1: Type: text/plain, Size: 949 bytes --]

Hello!

Consider this module:

--8<---------------cut here---------------start------------->8---
(define-module (foo) #:autoload (does-not-exist) (baz))
(define (chbouib) (baz))
(pk 'hello)
--8<---------------cut here---------------end--------------->8---

Trying to evaluate it fails this way:

--8<---------------cut here---------------start------------->8---
$ guile --no-auto-compile t.scm 
Backtrace:
In ice-9/boot-9.scm:

[...]

 292: 3 [get-global-definition-hook baz (hygiene foo)]
In unknown file:
   ?: 2 [module-variable #<directory (foo) b3b510> baz]
In ice-9/boot-9.scm:
2732: 1 [b #<autoload (does-not-exist) b3b3f0> baz #f]
In unknown file:
   ?: 0 [scm-error misc-error #f ...]

ERROR: In procedure scm-error:
ERROR: missing interface for module (does-not-exist)
--8<---------------cut here---------------end--------------->8---

... which defeats the whole purpose of autoloads.

What about something along these lines (untested)?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 1217 bytes --]

diff --git a/module/ice-9/psyntax.scm b/module/ice-9/psyntax.scm
index 6c264a6..8a30f82 100644
--- a/module/ice-9/psyntax.scm
+++ b/module/ice-9/psyntax.scm
@@ -289,15 +289,20 @@
         (lambda (symbol module)
           (if (and (not module) (current-module))
               (warn "module system is booted, we should have a module" symbol))
-          (let ((v (module-variable (if module
+          (let ((m (if module
                        (resolve-module (cdr module))
-                                        (current-module))
-                                    symbol)))
+                       (current-module))))
+            (case (module-kind m)
+              ((autoload)
+               ;; don't try to actually load the module
+               #t)
+              (else
+               (let ((v (module-variable m symbol)))
                  (and v (variable-bound? v)
                       (let ((val (variable-ref v)))
                         (and (macro? val) (macro-type val)
                              (cons (macro-type val)
-                              (macro-binding val)))))))))
+                                   (macro-binding val))))))))))))
 
 
     (define (decorate-source e s)

[-- Attachment #3: Type: text/plain, Size: 21 bytes --]


Thanks,
Ludo’.

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* bug#12202: psyntax defeats autoload
  2012-08-14 16:14 bug#12202: psyntax defeats autoload Ludovic Courtès
@ 2013-03-05 16:45 ` Andy Wingo
  2013-03-13  9:01   ` Andy Wingo
  0 siblings, 1 reply; 4+ messages in thread
From: Andy Wingo @ 2013-03-05 16:45 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 12202

On Tue 14 Aug 2012 18:14, ludo@gnu.org (Ludovic Courtès) writes:

> (define-module (foo) #:autoload (does-not-exist) (baz))
> (define (chbouib) (baz))
> (pk 'hello)
>
> Trying to evaluate it fails this way:
>
> $ guile --no-auto-compile t.scm 
> Backtrace:
> In ice-9/boot-9.scm:
>
> [...]
>
>  292: 3 [get-global-definition-hook baz (hygiene foo)]
> In unknown file:
>    ?: 2 [module-variable #<directory (foo) b3b510> baz]
> In ice-9/boot-9.scm:
> 2732: 1 [b #<autoload (does-not-exist) b3b3f0> baz #f]
> In unknown file:
>    ?: 0 [scm-error misc-error #f ...]
>
> ERROR: In procedure scm-error:
> ERROR: missing interface for module (does-not-exist)
>
> ... which defeats the whole purpose of autoloads.
>
> What about something along these lines (untested)?

This is a great idea.  We should assume that autoloads are not macros.
Not sure we can change it in 2.0 though, because there could be uses of
autoloaded macros.

However your patch won't work:

> diff --git a/module/ice-9/psyntax.scm b/module/ice-9/psyntax.scm
> index 6c264a6..8a30f82 100644
> --- a/module/ice-9/psyntax.scm
> +++ b/module/ice-9/psyntax.scm
> @@ -289,15 +289,20 @@
>          (lambda (symbol module)
>            (if (and (not module) (current-module))
>                (warn "module system is booted, we should have a module" symbol))
> -          (let ((v (module-variable (if module
> +          (let ((m (if module
>                         (resolve-module (cdr module))
> -                                        (current-module))
> -                                    symbol)))
> +                       (current-module))))
> +            (case (module-kind m)
> +              ((autoload)
> +               ;; don't try to actually load the module
> +               #t)
> +              (else
> +               (let ((v (module-variable m symbol)))
>                   (and v (variable-bound? v)
>                        (let ((val (variable-ref v)))
>                          (and (macro? val) (macro-type val)
>                               (cons (macro-type val)
> -                              (macro-binding val)))))))))
> +                                   (macro-binding val))))))))))))
>  

because the module-kind of the module will never be `autoload' here.  As
you can see in your backtrace, the module-kind is `directory' -- the
autoload only ends up getting loaded while grovelling (foo)'s import
array.

Andy
-- 
http://wingolog.org/





^ permalink raw reply	[flat|nested] 4+ messages in thread

* bug#12202: psyntax defeats autoload
  2013-03-05 16:45 ` Andy Wingo
@ 2013-03-13  9:01   ` Andy Wingo
  2013-03-14 13:21     ` Ludovic Courtès
  0 siblings, 1 reply; 4+ messages in thread
From: Andy Wingo @ 2013-03-13  9:01 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 12202-done

On Tue 05 Mar 2013 17:45, Andy Wingo <wingo@pobox.com> writes:

>> ERROR: In procedure scm-error:
>> ERROR: missing interface for module (does-not-exist)
>>
>> ... which defeats the whole purpose of autoloads.

I pushed something that simply wraps the module binder in the autoload
with a false-if-exception (that also prints a warning).

Initially I wrapped the call to resolve-module / module-variable in
psyntax.scm's get-global-definition-hook with the false-if-exception,
but I ran into something interesting.  memoize-expression, written in
memoize.c, has the job of turning tree-il into something the evaluator
can deal with.  It has to specially recognize some toplevel
applications -- like @apply.  It does this... by looking up the
variable!  So that was another place autoloads could be defeated.

In the end I would have to wrap scm_module_variable
(scm_current_module(), sym) with a catch, and that's silly -- of course
resolving some other module can fail, but you don't expect
module-variable on a known module to throw an exception.  So for that
reason it made sense to me to prevent the autoload module binder from
propagating an exception.

Andy
-- 
http://wingolog.org/





^ permalink raw reply	[flat|nested] 4+ messages in thread

* bug#12202: psyntax defeats autoload
  2013-03-13  9:01   ` Andy Wingo
@ 2013-03-14 13:21     ` Ludovic Courtès
  0 siblings, 0 replies; 4+ messages in thread
From: Ludovic Courtès @ 2013-03-14 13:21 UTC (permalink / raw)
  To: Andy Wingo; +Cc: 12202-done

Andy Wingo <wingo@pobox.com> skribis:

> On Tue 05 Mar 2013 17:45, Andy Wingo <wingo@pobox.com> writes:
>
>>> ERROR: In procedure scm-error:
>>> ERROR: missing interface for module (does-not-exist)
>>>
>>> ... which defeats the whole purpose of autoloads.
>
> I pushed something that simply wraps the module binder in the autoload
> with a false-if-exception (that also prints a warning).

Great, thank you!

Ludo’.





^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-03-14 13:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-14 16:14 bug#12202: psyntax defeats autoload Ludovic Courtès
2013-03-05 16:45 ` Andy Wingo
2013-03-13  9:01   ` Andy Wingo
2013-03-14 13:21     ` Ludovic Courtès

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).