emacs-bug-tracker
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debbugs-tracker] bug#12202: closed (psyntax defeats autoload)


From: GNU bug Tracking System
Subject: [debbugs-tracker] bug#12202: closed (psyntax defeats autoload)
Date: Wed, 13 Mar 2013 09:03:02 +0000

Your message dated Wed, 13 Mar 2013 10:01:29 +0100
with message-id <address@hidden>
and subject line Re: bug#12202: psyntax defeats autoload
has caused the debbugs.gnu.org bug report #12202,
regarding psyntax defeats autoload
to be marked as done.

(If you believe you have received this mail in error, please contact
address@hidden)


-- 
12202: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=12202
GNU Bug Tracking System
Contact address@hidden with problems
--- Begin Message --- Subject: psyntax defeats autoload Date: Tue, 14 Aug 2012 18:14:26 +0200 User-agent: Gnus/5.130005 (Ma Gnus v0.5) Emacs/24.1 (gnu/linux)
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)?

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)
Thanks,
Ludo’.

--- End Message ---
--- Begin Message --- Subject: Re: bug#12202: psyntax defeats autoload Date: Wed, 13 Mar 2013 10:01:29 +0100 User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2 (gnu/linux)
On Tue 05 Mar 2013 17:45, Andy Wingo <address@hidden> 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/


--- End Message ---

reply via email to

[Prev in Thread] Current Thread [Next in Thread]