Hi all!

It seems to me that a bug exists in handling so-extensions inside get-module-code. Imagine a situation when we want to use get-module-code on mzmimer.so file which is located inside /opt/dozor/racket/lib/racket/collects/jetinfo/compiled/native/i386-linux/3m and is specified by (lib "mzmimer" "jetinfo") module-spec. No, I don't really want to do some introspection on so-extension, but geiser (emacs extension for racket) does.

Going inside get-module-code (look for squre-bracketed line numbers in listing below), path = /opt/dozor/racket/lib/racket/collects/jetinfo/mzmimer ...
[1]: orig-path = /opt/dozor/racket/lib/racket/collects/jetinfo/mzmimer
[2]: base = /opt/dozor/racket/lib/racket/collects/jetinfo, orig-file = mzmimer
[3]: main-file = mzmimer, alt-file = #f
[4]: main-path = /opt/dozor/racket/lib/racket/collects/jetinfo/mzmimer
[5]: alt-path = #f
[6]: main-path-d = #f
[7]: alt-path-d = #f
[8]: try-alt? = #t
[9]: error!

main-path-d is #f because orig-path doesn't actually exist, but it is ok for so-extension. alt-file doesn't exist neither, but stiil we try to calculate path to it. The bug in my opinion resides in line [8]: [try-alt? (and (not alt-path-d) (not main-path-d))] so I've changed it to: [try-alt? (and alt-file (not alt-path-d) (not main-path-d))] and it has worked for me. I doubt whether that fix is good for everyone, but know for sure it should be fixed somehow.

(let*-values ([(orig-path) (resolve path)]                 [1]
                  [(base orig-file dir?) (split-path path)]   [2]
[(main-file alt-file) [3]
                   (if rkt-try-ss?
                       (let* ([b (path->bytes orig-file)]
                              [len (bytes-length b)])
                         (cond
                          [(and (len . >= . 4)
                                (bytes=? #".rkt" (subbytes b (- len 4))))
                           ;; .rkt => try .rkt then .ss
                           (values orig-file
(bytes->path (bytes-append (subbytes b 0 (- len 4)) #".ss")))]
                          [else
                           ;; No search path
                           (values orig-file #f)]))
                       (values orig-file #f))]
                  [(main-path) (if (eq? main-file orig-file)    [4]
                                   orig-path
                                   (build-path base main-file))]
                  [(alt-path) (and alt-file                             [5]
                                   (if (eq? alt-file orig-file)
                                       orig-path
                                       (build-path base alt-file)))]
                  [(base) (if (eq? base 'relative) 'same base)])
(let* ([main-path-d (file-or-directory-modify-seconds orig-path #f (lambda () #f))] [6] [alt-path-d (and alt-path [7]
                              (not main-path-d)
(file-or-directory-modify-seconds alt-path #f (lambda () #f)))]
             [path-d (or main-path-d alt-path-d)]
             [file (if alt-path-d alt-file main-file)]
             [path (if alt-path-d alt-path main-path)]
[try-alt? (and (not alt-path-d) (not main-path-d))] [8]
             [get-so (lambda (file)
                       (build-path
                        base sub-path "native"
                        (system-library-subpath)
                        (path-add-suffix file (system-type 'so-suffix))))]
             [zo (build-path base sub-path (path-add-suffix file #".zo"))]
             [alt-zo (and try-alt?
(build-path base sub-path (path-add-suffix alt-file #".zo")))] [9]



--
Best regards,
Timur

_________________________
 Racket Developers list:
 http://lists.racket-lang.org/dev

Reply via email to