;;; 7.ms ;;; Copyright 1984-2017 Cisco Systems, Inc. ;;; ;;; Licensed under the Apache License, Version 2.0 (the "License"); ;;; you may not use this file except in compliance with the License. ;;; You may obtain a copy of the License at ;;; ;;; http://www.apache.org/licenses/LICENSE-2.0 ;;; ;;; Unless required by applicable law or agreed to in writing, software ;;; distributed under the License is distributed on an "AS IS" BASIS, ;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ;;; See the License for the specific language governing permissions and ;;; limitations under the License. ;;; section 7-1: (mat load/compile-file (error? (load "/file/not/there")) (error? (compile-file "/file/not/there")) (error? ; abc is not a string (load-program 'abc)) (error? ; xxx is not a procedure (load-program "/file/not/there" 'xxx)) (error? ; 3 is not a string (parameterize ([source-directories '("/tmp" ".")]) (load-program 3))) (error? ; 3 is not a string (parameterize ([source-directories '("/tmp" ".")]) (load-program 3 values))) (not (top-level-bound? 'aaaaa)) (let ([p (open-output-file "testfile.ss" 'replace)]) (display "(let ((x 3) (y 4)) (set! aaaaa (+ x y)))" p) (close-output-port p) (load "testfile.ss") (eqv? aaaaa 7)) (call/cc (lambda (k) (load "testfile.ss" (lambda (x) (unless (equal? (annotation-stripped x) '(let ((x 3) (y 4)) (set! aaaaa (+ x y)))) (k #f)))) #t)) (begin (printf "***** expect \"compile-file\" message:~%") (compile-file "testfile") (set! aaaaa 0) (load "testfile.so") (eqv? aaaaa 7)) (parameterize ([fasl-compressed #f]) (printf "***** expect \"compile-file\" message:~%") (compile-file "testfile") (set! aaaaa 0) (load "testfile.so") (eqv? aaaaa 7)) (let ((ip (open-input-string "(let ((x -3) (y -4)) (set! aaaaa (+ x y)))")) (op (open-file-output-port "testfile.so" (file-options replace)))) (compile-port ip op) (close-input-port ip) (close-port op) (set! aaaaa 0) (load "testfile.so") (eqv? aaaaa -7)) (let ((ip (open-input-string "(let ((x -3) (y -4)) (set! aaaaa (+ x y)))")) (op (open-file-output-port "testfile.so" (file-options replace #;compressed)))) (compile-port ip op) (close-input-port ip) (close-port op) (set! aaaaa 0) (load "testfile.so") (eqv? aaaaa -7)) ; test compiling a file containing most-negative-fixnum (let ([p (open-output-file "testfile.ss" 'replace)]) (printf "***** expect \"compile-file\" message:~%") (display `(define $mnfixnum ,(most-negative-fixnum)) p) (close-output-port p) (compile-file "testfile") (load "testfile.so") (eqv? $mnfixnum (most-negative-fixnum))) ) (mat compile-to-port (eqv? (call-with-port (open-file-output-port "testfile.so" (file-options replace)) (lambda (op) (compile-to-port '((define ctp1 'hello) (set! ctp1 (cons 'goodbye ctp1))) op))) (void)) (begin (load "testfile.so") #t) (equal? ctp1 '(goodbye . hello)) (begin (with-output-to-file "testfile-ctp2a.ss" (lambda () (pretty-print '(library (testfile-ctp2a) (export fact) (import (chezscheme)) (define fact (lambda (x) (if (= x 0) 1 (* x (fact (- x 1))))))))) 'replace) #t) (equal? (call-with-port (open-file-output-port "testfile.so" (file-options replace #;compressed)) (lambda (op) (parameterize ([compile-imported-libraries #t]) (compile-to-port '((top-level-program (import (chezscheme) (testfile-ctp2a)) (pretty-print (fact 3)))) op)))) '((testfile-ctp2a))) (equal? (with-output-to-string (lambda () (load "testfile.so"))) "6\n") ) (mat load-compiled-from-port (begin (define-values (o get) (open-bytevector-output-port)) (compile-to-port '((define lcfp1 'worked) 'loaded) o) (eq? 'loaded (load-compiled-from-port (open-bytevector-input-port (get))))) (begin (define lcfp-bv (let-values ([(o get) (open-bytevector-output-port)]) (compile-to-port '((printf "revisit\n") (define-syntax $lcfp-a (begin (printf "visit\n") (lambda (x) 0))) (eval-when (visit revisit) (printf "visit-revisit\n")) (eval-when (visit) 'visit-return) 'revisit-return) o) (get))) #t) (equal? (with-output-to-string (lambda () (printf "result = ~s\n" (load-compiled-from-port (open-bytevector-input-port lcfp-bv))))) "revisit\nvisit\nvisit-revisit\nresult = revisit-return\n") (equal? (with-output-to-string (lambda () (printf "result = ~s\n" (visit-compiled-from-port (open-bytevector-input-port lcfp-bv))))) "visit\nvisit-revisit\nresult = visit-return\n") (equal? (with-output-to-string (lambda () (printf "result = ~s\n" (revisit-compiled-from-port (open-bytevector-input-port lcfp-bv))))) "revisit\nvisit-revisit\nresult = revisit-return\n") ) (mat compile-to-file (begin (delete-file (format "testfile.~s" (machine-type))) (compile-to-file '((define ctf1 'hello) (set! ctf1 (cons ctf1 'goodbye))) "testfile.so") #t) (begin (load "testfile.so") #t) ;; NB: should we protect the following in case we are actually cross compiling? (not (file-exists? (format "testfile.~s" (machine-type)))) (equal? ctf1 '(hello . goodbye)) (begin (with-output-to-file "testfile-ctf2a.ss" (lambda () (pretty-print '(library (testfile-ctf2a) (export fib) (import (chezscheme)) (define fib (lambda (x) (if (< x 2) x (+ (fib (- x 1)) (fib (- x 2))))))))) 'replace) #t) (equal? (parameterize ([compile-imported-libraries #t]) (compile-to-file '((top-level-program (import (chezscheme) (testfile-ctf2a)) (pretty-print (fib 11)))) "testfile.so")) '((testfile-ctf2a))) (not (file-exists? (format "testfile-ctf2a.~s" (machine-type)))) (not (file-exists? (format "testfile.~s" (machine-type)))) (equal? (with-output-to-string (lambda () (load "testfile.so"))) "89\n") (begin (compile-to-file '((library (testfile-ctf2a) (export fib) (import (chezscheme)) (define fib (lambda (x) (if (< x 2) x (+ (fib (- x 1)) (fib (- x 2)))))))) "testfile.so") #t) (not (file-exists? (format "testfile.~s" (machine-type)))) ) (mat compile-script (error? (compile-script "/file/not/there")) (begin (with-output-to-file "testfile.ss" (lambda () (display "#! /usr/bin/scheme --script\n") (pretty-print '(define $cs-x 14)) (pretty-print '(define $cs-y (lambda (q) (+ $cs-x q))))) 'replace) (compile-script "testfile") #t) (error? $cs-x) (error? $cs-y) (begin (load "testfile.so") #t) (eqv? $cs-x 14) (eqv? ($cs-y -17) -3) (eqv? (with-input-from-file "testfile.so" read-char) #\#) ; test visit/revisit of compiled script (begin (with-output-to-file "testfile.ss" (lambda () (printf "#! /usr/bin/scheme --script\n") (pretty-print '(eval-when (visit) (display "hello from testfile\n"))) (pretty-print '(display "hello again from testfile\n"))) 'replace) (compile-script "testfile") #t) (equal? (with-output-to-string (lambda () (visit "testfile.so"))) "hello from testfile\n") (equal? (with-output-to-string (lambda () (revisit "testfile.so"))) "hello again from testfile\n") (equal? (with-output-to-string (lambda () (load "testfile.so"))) "hello from testfile\nhello again from testfile\n") ) (mat load-program/compile-program (error? (compile-program "/file/not/there")) (error? (load-program "/file/not/there")) (error? ; abc is not a string (load-program 'abc)) (error? ; xxx is not a procedure (load-program "/file/not/there" 'xxx)) (error? ; 3 is not a string (parameterize ([source-directories '("/tmp" ".")]) (load-program 3))) (error? ; 3 is not a string (parameterize ([source-directories '("/tmp" ".")]) (load-program 3 values))) (begin (with-output-to-file "testfile.ss" (lambda () (display "#! /usr/bin/scheme --program\n") (pretty-print '(import (rnrs))) (pretty-print '(define $cp-x 14)) (pretty-print '(define $cp-y (lambda (q) (+ $cp-x q)))) (pretty-print '(begin (when (file-exists? "testfile-cp.ss") (delete-file "testfile-cp.ss")) (with-output-to-file "testfile-cp.ss" (lambda () (write (cons $cp-x ($cp-y 35)))))))) 'replace) (compile-program "testfile") #t) (begin (load-program "testfile.so") #t) (error? $cp-x) (error? $cp-y) (let ([p (with-input-from-file "testfile-cp.ss" read)]) (eqv? (car p) 14) (eqv? (cdr p) 49)) (eqv? (with-input-from-file "testfile.so" read-char) #\#) (begin (with-output-to-file "testfile.ss" (lambda () (display "#! /usr/bin/scheme --program\n") (pretty-print '(import (rnrs))) (pretty-print '(begin (when (file-exists? "testfile-cp.ss") (delete-file "testfile-cp.ss")) (with-output-to-file "testfile-cp.ss" (lambda () (write "hello from testfile")))))) 'replace) #t) (begin (load-program "testfile.ss") #t) (equal? (with-input-from-file "testfile-cp.ss" read) "hello from testfile") (begin (with-output-to-file "testfile.ss" (lambda () (display "#! /usr/bin/scheme --program\n") (pretty-print '(import (rnrs))) (pretty-print '(pretty-print 'hello))) 'replace) #t) (error? ; unbound variable pretty-print (compile-program "testfile")) (error? ; unbound variable pretty-print (load-program "testfile.ss")) (begin (with-output-to-file "testfile.ss" (lambda () (display "#! /usr/bin/scheme --program\n") (pretty-print '(import (rnrs))) (pretty-print '(#%write 'hello))) 'replace) #t) (error? ; invalid #% syntax in #!r6rs mode (compile-program "testfile")) (error? ; invalid #% syntax in #!r6rs mode (load-program "testfile.ss")) ) (mat maybe-compile (error? ; not a procedure (compile-program-handler 'ignore)) (procedure? (compile-program-handler)) (error? ; not a string (maybe-compile-file '(spam))) (error? ; not a string (maybe-compile-file "spam" 'spam)) (error? ; not a string (maybe-compile-file -2.5 "spam")) (error? ; .ss file does not exist (maybe-compile-file "probably-does-not-exist.ss")) (error? ; .ss file does not exist (maybe-compile-file "probably-does-not-exist.ss" "probably-does-not-exist.so")) (begin (with-output-to-file "testfile-mc.ss" (lambda () (for-each pretty-print '((import (chezscheme)) (pretty-print 'hello)))) 'replace) #t) (error? ; cannot create .so file (maybe-compile-file "testfile-mc.ss" "/probably/does/not/exist.so")) (error? ; not a string (maybe-compile-program '(spam))) (error? ; not a string (maybe-compile-program "spam" 'spam)) (error? ; not a string (maybe-compile-program -2.5 "spam")) (error? ; .ss file does not exist (maybe-compile-program "probably-does-not-exist.ss")) (error? ; .ss file does not exist (maybe-compile-program "probably-does-not-exist.ss" "probably-does-not-exist.so")) (begin (with-output-to-file "testfile-mc.ss" (lambda () (for-each pretty-print '((import (chezscheme)) (pretty-print 'hello)))) 'replace) #t) (error? ; cannot create .so file (maybe-compile-program "testfile-mc.ss" "/probably/does/not/exist.so")) (error? ; not a string (maybe-compile-library '(spam))) (error? ; not a string (maybe-compile-library "spam" 'spam)) (error? ; not a string (maybe-compile-library -2.5 "spam")) (error? ; .ss file does not exist (maybe-compile-library "probably-does-not-exist.ss")) (error? ; .ss file does not exist (maybe-compile-library "probably-does-not-exist.ss" "probably-does-not-exist.so")) (begin (with-output-to-file "testfile-mc.ss" (lambda () (pretty-print '(library (testfile-mc) (export) (import)))) 'replace) #t) (error? ; cannot create .so file (maybe-compile-library "testfile-mc.ss" "/probably/does/not/exist.so")) (begin (with-output-to-file "testfile-mc.ss" (lambda () (for-each pretty-print '((import (chezscheme)) (if)))) 'replace) #t) (error? ; syntax error (maybe-compile-file "testfile-mc.ss" "testfile-mc.so")) (not (file-exists? "testfile-mc.so")) (error? ; syntax error (maybe-compile-program "testfile-mc.ss" "testfile-mc.so")) (not (file-exists? "testfile-mc.so")) (begin (with-output-to-file "testfile-mc.ss" (lambda () (pretty-print '(library (testfile-mc) (export x) (import (chezscheme)) (define)))) 'replace) #t) (error? ; syntax error (maybe-compile-library "testfile-mc.ss" "testfile-mc.so")) (not (file-exists? "testfile-mc.so")) (begin (for-each delete-file '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) (with-output-to-file "testfile-mc-a.ss" (lambda () (pretty-print '(library (testfile-mc-a) (export a) (import (chezscheme)) (define a "a")))) 'replace) (with-output-to-file "testfile-mc-b.ss" (lambda () (pretty-print '(library (testfile-mc-b) (export a b) (import (chezscheme) (testfile-mc-a)) (define b "b")))) 'replace) (with-output-to-file "testfile-mc-c.ss" (lambda () (pretty-print '(define c "c"))) 'replace) (with-output-to-file "testfile-mc-foo.ss" (lambda () (for-each pretty-print '((import (chezscheme) (testfile-mc-b)) (include "testfile-mc-c.ss") (pretty-print (list a b c))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-foo) #t) (equal? (separate-eval '(load-program "testfile-mc-foo.so")) "(\"a\" \"b\" \"c\")\n") (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(= = =)) (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-library x))) 'mc-b) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(= = =)) (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-library x))) 'mc-a) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(= = =)) (touch "testfile-mc-foo.so" "testfile-mc-foo.ss") (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(= = >)) (equal? (separate-eval '(load-program "testfile-mc-foo.so")) "(\"a\" \"b\" \"c\")\n") (touch "testfile-mc-foo.so" "testfile-mc-c.ss") (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(= = >)) (equal? (separate-eval '(load-program "testfile-mc-foo.so")) "(\"a\" \"b\" \"c\")\n") (touch "testfile-mc-foo.so" "testfile-mc-b.ss") (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(= > >)) (equal? (separate-eval '(load-program "testfile-mc-foo.so")) "(\"a\" \"b\" \"c\")\n") (touch "testfile-mc-foo.so" "testfile-mc-a.ss") (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (let ([s (separate-compile '(lambda (x) (parameterize ([compile-program-handler (lambda (ifn ofn) (printf "yippee!\n") (compile-program ifn ofn))] [compile-imported-libraries #t] [compile-file-message #f]) (maybe-compile-program x))) 'mc-foo)]) (cons (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*) s))) '((> > >) . "yippee!\n")) (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (let ([s (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [compile-file-message #f]) (maybe-compile-program x))) 'mc-foo)]) (cons (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*) s))) '((= = =) . "")) (equal? (separate-eval '(load-program "testfile-mc-foo.so")) "(\"a\" \"b\" \"c\")\n") (touch "testfile-mc-foo.so" "testfile-mc-b.ss") (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-library x))) 'mc-b) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(= > =)) ; NB: create testfile-mc-a.ss newer than testfile-mc-1b.so, since testfile-mc-1b.so might be newer than testfile-mc-foo.so (touch "testfile-mc-b.so" "testfile-mc-a.ss") (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (let ([s (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f] [import-notify #t]) (maybe-compile-library x))) 'mc-b)]) (cons (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*) s))) '((= = =) . "maybe-compile-library: object file is not older\nmaybe-compile-library: did not find source file \"testfile-mc-a.chezscheme.sls\"\nmaybe-compile-library: found source file \"testfile-mc-a.ss\"\nmaybe-compile-library: found corresponding object file \"testfile-mc-a.so\"\n")) (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-library x))) 'mc-b) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(> > =)) (equal? (let ([mt* (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time (list "testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-foo.so")) mt*)) '(= = >)) (equal? (separate-eval '(load-program "testfile-mc-foo.so")) "(\"a\" \"b\" \"c\")\n") (begin (for-each delete-file '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) (with-output-to-file "testfile-mc-a.ss" (lambda () (pretty-print '(library (testfile-mc-a) (export a) (import (chezscheme)) (define a "a")))) 'replace) (with-output-to-file "testfile-mc-b.ss" (lambda () (pretty-print '(library (testfile-mc-b) (export a b) (import (chezscheme) (testfile-mc-a)) (define b "b")))) 'replace) (with-output-to-file "testfile-mc-c.ss" (lambda () (pretty-print '(define c "c"))) 'replace) (with-output-to-file "testfile-mc-d.ss" (lambda () (pretty-print '(module M (d) (import (testfile-mc-a) (testfile-mc-b) (chezscheme)) (define d (vector b a))))) 'replace) (with-output-to-file "testfile-mc-e.ss" (lambda () (pretty-print '(library (testfile-mc-e) (export e-str) (import (chezscheme)) (define e-str "e")))) 'replace) (with-output-to-file "testfile-mc-e-import.ss" (lambda () (pretty-print '(import (testfile-mc-e)))) 'replace) (with-output-to-file "testfile-mc-f.ss" (lambda () (pretty-print '(library (testfile-mc-f) (export f-str) (import (chezscheme)) (define f-str "f")))) 'replace) (with-output-to-file "testfile-mc-foo.ss" (lambda () (for-each pretty-print '((import (chezscheme) (testfile-mc-b)) (include "testfile-mc-c.ss") (include "testfile-mc-d.ss") (import M) (meta define build-something-f (lambda (k something) (import (testfile-mc-f)) (datum->syntax k (string->symbol (string-append something "-" f-str))))) (define-syntax e (lambda (x) (syntax-case x () [(k) (let () (include "testfile-mc-e-import.ss") #`'#,(build-something-f #'k e-str))]))) (pretty-print (list a b c d (e)))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-file x))) 'mc-foo) #t) (equal? (separate-eval '(load "testfile-mc-foo.so")) "(\"a\" \"b\" \"c\" #(\"b\" \"a\") e-f)\n") (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = = = =)) (touch "testfile-mc-foo.so" "testfile-mc-foo.ss") (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = = = >)) (touch "testfile-mc-foo.so" "testfile-mc-a.ss") (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = = = =)) (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(> > = = >)) (touch "testfile-mc-foo.so" "testfile-mc-c.ss") (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = = = >)) (touch "testfile-mc-foo.so" "testfile-mc-e.ss") (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = = = =)) (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = > = >)) (touch "testfile-mc-foo.so" "testfile-mc-e-import.ss") (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = = = >)) (touch "testfile-mc-foo.so" "testfile-mc-f.ss") (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = = = =)) (equal? (let ([mt* (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-file x))) 'mc-foo) (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testfile-mc-a.so" "testfile-mc-b.so" "testfile-mc-e.so" "testfile-mc-f.so" "testfile-mc-foo.so")) mt*)) '(= = = > >)) (begin (rm-rf "testdir") (mkdir "testdir") (mkfile "testdir/testfile-mc-1a.ss" '(define mcratfink 'abe)) (mkfile "testdir/testfile-mc-1b.ss" '(library (testdir testfile-mc-1b) (export mc-1b-x) (import (chezscheme)) (include "testfile-mc-1a.ss") (define mc-1b-x (lambda () (list mcratfink))))) (mkfile "testdir/testfile-mc-1c.ss" '(library (testdir testfile-mc-1c) (export mc-1b-x) (import (testdir testfile-mc-1b)))) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (compile-library x))) "testdir/testfile-mc-1c") #t) (equal? (separate-eval '(let () (import (testdir testfile-mc-1c)) (mc-1b-x))) "(abe)\n") (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-library x))) "testdir/testfile-mc-1c") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so")) mt*)) '(= =)) (touch "testdir/testfile-mc-1c.so" "testdir/testfile-mc-1a.ss") (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f]) (maybe-compile-library x))) "testdir/testfile-mc-1c") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so")) mt*)) '(= =)) (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-library x))) "testdir/testfile-mc-1c") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so")) mt*)) '(> >)) (touch "testdir/testfile-mc-1c.so" "testdir/testfile-mc-1b.ss") (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f]) (maybe-compile-library x))) "testdir/testfile-mc-1c") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so")) mt*)) '(= =)) (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-library x))) "testdir/testfile-mc-1c") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so")) mt*)) '(> >)) (touch "testdir/testfile-mc-1c.so" "testdir/testfile-mc-1c.ss") (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t]) (maybe-compile-library x))) "testdir/testfile-mc-1c") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so")) mt*)) '(= >)) (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so"))]) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #f]) (maybe-compile-library x))) "testdir/testfile-mc-1c") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so" "testdir/testfile-mc-1c.so")) mt*)) '(= =)) (error? ; can't find testfile-mc-1a.ss (separate-compile 'compile-library "testdir/testfile-mc-1b")) (begin (separate-compile '(lambda (x) (parameterize ([source-directories (cons "testdir" (source-directories))]) (maybe-compile-library x))) "testdir/testfile-mc-1b") #t) (error? ; can't find testfile-mc-1a.ss (separate-compile 'maybe-compile-library "testdir/testfile-mc-1b")) ; make sure maybe-compile-file wipes out b.so when it fails to find a.ss (or (= (optimize-level) 3) (not (file-exists? "testdir/testfile-mc-1b.so"))) (begin (separate-compile '(lambda (x) (parameterize ([source-directories (cons "testdir" (source-directories))]) (maybe-compile-library x))) "testdir/testfile-mc-1b") #t) (touch "testdir/testfile-mc-1b.so" "testdir/testfile-mc-1a.ss") (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so"))]) (separate-compile '(lambda (x) (parameterize ([source-directories (cons "testdir" (source-directories))]) (maybe-compile-library x))) "testdir/testfile-mc-1b") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so")) mt*)) '(>)) (touch "testdir/testfile-mc-1b.so" "testdir/testfile-mc-1b.ss") (equal? (let ([mt* (map file-modification-time '("testdir/testfile-mc-1b.so"))]) (separate-compile '(lambda (x) (parameterize ([source-directories (cons "testdir" (source-directories))]) (maybe-compile-library x))) "testdir/testfile-mc-1b") (map (lambda (x y) (if (time=? x y) '= (if (time))) (map file-modification-time '("testdir/testfile-mc-1b.so")) mt*)) '(>)) (delete-file "testdir/testfile-mc-1a.ss") (error? ; maybe-compile-library: can't find testfile-mc-1a.ss (separate-compile '(lambda (x) (parameterize ([source-directories (cons "testdir" (source-directories))]) (maybe-compile-library x))) "testdir/testfile-mc-1b")) ; make sure maybe-compile-file wipes out b.so when it fails to find a.ss (or (= (optimize-level) 3) (not (file-exists? "testdir/testfile-mc-1b.so"))) (begin (rm-rf "testdir") #t) ; make sure maybe-compile-file handles incomplete fasl files (begin (mkfile "testfile-mc-2a.ss" '(library (testfile-mc-2a) (export q) (import (chezscheme)) (define f (lambda () (printf "running f\n") "x")) (define-syntax q (begin (printf "expanding testfile-mc-2a\n") (lambda (x) (printf "expanding q\n") #'(f)))))) (mkfile "testfile-mc-2.ss" '(import (chezscheme) (testfile-mc-2a)) '(define-syntax qq (begin (printf "expanding testfile-mc-2\n") (lambda (x) (printf "expanding qq\n") #'q))) '(printf "qq => ~a\n" qq)) (delete-file "testfile-mc-2a.so") (delete-file "testfile-mc-2.so") (display-string (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t] [fasl-compressed #f]) (maybe-compile-program x))) 'mc-2)) #t) (begin (let ([p (open-file-input/output-port "testfile-mc-2a.so" (file-options no-create no-fail no-truncate))]) (set-port-length! p 73) (close-port p)) (display-string (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t] [fasl-compressed #f] [import-notify #t]) (maybe-compile-program x))) 'mc-2)) #t) (begin (let ([p (open-file-input/output-port "testfile-mc-2.so" (file-options no-create no-fail no-truncate))]) (set-port-length! p 87) (close-port p)) (display-string (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t] [fasl-compressed #f] [import-notify #t]) (maybe-compile-program x))) 'mc-2)) #t) ; make sure maybe-compile-file handles missing include files gracefully (begin (mkfile "testfile-mc-3a.ss" "hello from 3a!") (mkfile "testfile-mc-3b.ss" '(library (testfile-mc-3b) (export q) (import (chezscheme)) (define-syntax q (begin (printf "expanding testfile-mc-3b\n") (lambda (x) (printf "expanding q\n") (include "./testfile-mc-3a.ss")))))) (mkfile "testfile-mc-3.ss" '(import (chezscheme) (testfile-mc-3b)) '(define-syntax qq (begin (printf "expanding testfile-mc-3\n") (lambda (x) (printf "expanding qq\n") #'q))) '(printf "qq => ~a\n" qq)) (delete-file "testfile-mc-3b.so") (delete-file "testfile-mc-3.so") (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-3) #t) (begin (delete-file "testfile-mc-3a.ss") #t) (error? ; separate-compile: no such file or directory: testfile-mc-3a.ss (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-3)) ; make sure maybe-compile-file handles missing include files gracefully (begin (define-record-type hash-bang-chezscheme) (record-writer (type-descriptor hash-bang-chezscheme) (lambda (x p wr) (display-string "#!chezscheme"))) (mkfile "testfile-mc-4a.ss" "hello from 4a!") (mkfile "testfile-mc-4b.ss" (make-hash-bang-chezscheme) '(library (testfile-mc-4b) (export b) (import (chezscheme)) (define-syntax q (lambda (x) (if (file-exists? "testfile-mc-4a.ss") (begin (printf "HEY!\n") (#%$require-include "./testfile-mc-4a.ss") (call-with-input-file "testfile-mc-4a.ss" read)) (begin (printf "BARLEY!\n") "testfile-mc-4a is no more")))) (define (b) q))) (mkfile "testfile-mc-4.ss" '(import (chezscheme) (testfile-mc-4b)) '(printf "q => ~a\n" (b))) (delete-file "testfile-mc-4b.so") (delete-file "testfile-mc-4.so") (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-4) #t) (equal? (separate-eval '(load-program "testfile-mc-4.so")) "q => hello from 4a!\n") (begin (mkfile "testfile-mc-4a.ss" "goodbye from 4a!") (touch "testfile-mc-4.so" "testfile-mc-4a.ss") (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t] [import-notify #t]) (maybe-compile-program x))) 'mc-4) #t) (equal? (separate-eval '(load-program "testfile-mc-4.so")) "q => goodbye from 4a!\n") (begin (delete-file "testfile-mc-4a.ss") #t) (begin (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t] [import-notify #t]) (maybe-compile-program x))) 'mc-4) #t) (equal? (separate-eval '(load-program "testfile-mc-4.so")) "q => testfile-mc-4a is no more\n") ; make sure maybe-compile-file handles missing include files gracefully (begin (define-record-type hash-bang-chezscheme) (record-writer (type-descriptor hash-bang-chezscheme) (lambda (x p wr) (display-string "#!chezscheme"))) (mkfile "testfile-mc-5a.ss" "hello from 5a!") (mkfile "testfile-mc-5b.ss" (make-hash-bang-chezscheme) '(library (testfile-mc-5b) (export q) (import (chezscheme)) (define-syntax q (lambda (x) (if (file-exists? "testfile-mc-5a.ss") (begin (printf "HEY!\n") (#%$require-include "./testfile-mc-5a.ss") (call-with-input-file "testfile-mc-5a.ss" read)) (begin (printf "BARLEY!\n") "testfile-mc-5a is no more")))))) (mkfile "testfile-mc-5.ss" '(import (chezscheme) (testfile-mc-5b)) '(define-syntax qq (lambda (x) #'q)) '(printf "qq => ~a\n" qq)) (delete-file "testfile-mc-5b.so") (delete-file "testfile-mc-5.so") (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t]) (maybe-compile-program x))) 'mc-5) #t) (equal? (separate-eval '(load-program "testfile-mc-5.so")) "qq => hello from 5a!\n") (begin (mkfile "testfile-mc-5a.ss" "goodbye from 5a!") (touch "testfile-mc-5.so" "testfile-mc-5a.ss") (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t] [import-notify #t]) (maybe-compile-program x))) 'mc-5) #t) (equal? (separate-eval '(load-program "testfile-mc-5.so")) "qq => goodbye from 5a!\n") (begin (delete-file "testfile-mc-5a.ss") #t) (begin (separate-compile '(lambda (x) (parameterize ([compile-file-message #f] [compile-imported-libraries #t] [import-notify #t]) (maybe-compile-program x))) 'mc-5) #t) (equal? (separate-eval '(load-program "testfile-mc-5.so")) "qq => testfile-mc-5a is no more\n") ) (mat make-boot-file (eq? (begin (with-output-to-file "testfile-1.ss" (lambda () (pretty-print '(display "hello 1\n"))) 'replace) (with-output-to-file "testfile-2.ss" (lambda () (pretty-print '(display "hello 2\n"))) 'replace) (with-output-to-file "testfile-3.ss" (lambda () (pretty-print '(display "hello 3\n"))) 'replace) (with-output-to-file "testfile-4.ss" (lambda () (pretty-print '(display "hello 4\n"))) '(replace)) (with-output-to-file "testfile-5.ss" (lambda () (pretty-print '(display "hello 5\n"))) '(replace)) (parameterize ([optimize-level 2]) (compile-script "testfile-1") (compile-script "testfile-2") (compile-file "testfile-3") (compile-file "testfile-4") (compile-file "testfile-5"))) (void)) (equal? (begin (parameterize ([optimize-level 2]) (make-boot-file "testfile.boot" '("petite") "testfile-1.so" "testfile-2.ss" "testfile-3.so" "testfile-4.so" "testfile-5.ss")) (let-values ([(to-stdin from-stdout from-stderr pid) (open-process-ports (format "~a -b ./testfile.boot -q" (patch-exec-path *scheme*)) (buffer-mode block) (native-transcoder))]) (close-output-port to-stdin) (let ([out (get-string-all from-stdout)] [err (get-string-all from-stderr)]) (close-input-port from-stdout) (close-input-port from-stderr) (unless (eof-object? err) (error 'bootfile-test1 err)) out))) "hello 1\nhello 2\nhello 3\nhello 4\nhello 5\n") (equal? (begin (parameterize ([optimize-level 2]) (compile-to-file '((library (A) (export a) (import (scheme)) (define a 'aye)) (library (B) (export b) (import (A) (scheme)) (define b (list a 'captain)))) "testfile-libs.so") (make-boot-file "testfile.boot" '("petite") "testfile-libs.so")) (let-values ([(to-stdin from-stdout from-stderr pid) (open-process-ports (format "~a -b ./testfile.boot -q" (patch-exec-path *scheme*)) (buffer-mode block) (native-transcoder))]) (pretty-print '(let () (import (B)) (printf "~s\n" b)) to-stdin) (close-output-port to-stdin) (let ([out (get-string-all from-stdout)] [err (get-string-all from-stderr)]) (close-input-port from-stdout) (close-input-port from-stderr) (unless (eof-object? err) (error 'bootfile-test1 err)) out))) "(aye captain)\n") (equal? (begin (unless (or (embedded?) (equal? *scheme* (format "~a/bin/~a/scheme~a" (path-parent *mats-dir*) (machine-type) (if (windows?) ".exe" "")))) (errorf #f "not testing boot file based on ../boot/~a/petite.boot, since *scheme* isn't ../bin/~a/scheme~a" (machine-type) (machine-type) (if (windows?) ".exe" ""))) (parameterize ([optimize-level 2]) (make-boot-file "testfile.boot" '() (format "~a/boot/~a/petite.boot" (path-parent *mats-dir*) (machine-type)) "testfile-1.so" "testfile-2.so" "testfile-3.ss" "testfile-4.ss" "testfile-5.so")) (let-values ([(to-stdin from-stdout from-stderr pid) (open-process-ports (format "~a -b ./testfile.boot -q" (patch-exec-path *scheme*)) (buffer-mode block) (native-transcoder))]) (close-output-port to-stdin) (let ([out (get-string-all from-stdout)] [err (get-string-all from-stderr)]) (close-input-port from-stdout) (close-input-port from-stderr) (unless (eof-object? err) (error 'bootfile-test2 err)) out))) "hello 1\nhello 2\nhello 3\nhello 4\nhello 5\n") ; regression test to verify that we can evaluate a foreign-callable form inside the procedure to ; which scheme-start is set, which was failing because its relocation information was discarded ; by the static-generation collection. (equal? (begin (unless (or (embedded?) (equal? *scheme* (format "~a/bin/~a/scheme~a" (path-parent *mats-dir*) (machine-type) (if (windows?) ".exe" "")))) (errorf #f "not testing boot file based on ../boot/~a/petite.boot, since *scheme* isn't ../bin/~a/scheme~a" (machine-type) (machine-type) (if (windows?) ".exe" ""))) (mkfile "testfile.ss" '(scheme-start (lambda () (let ([x 0]) (printf "~s\n" (foreign-callable (lambda () (set! x (+ x 1)) x) () void)))))) (make-boot-file "testfile.boot" '("petite") "testfile.ss") (let-values ([(to-stdin from-stdout from-stderr pid) (open-process-ports (format "~a -b ./testfile.boot -q" (patch-exec-path *scheme*)) (buffer-mode block) (native-transcoder))]) (close-output-port to-stdin) (let ([out (get-string-all from-stdout)] [err (get-string-all from-stderr)]) (close-input-port from-stdout) (close-input-port from-stderr) (unless (eof-object? err) (error 'bootfile-test2 err)) out))) "#\n") ) (mat hostop (begin (separate-compile `(lambda (x) (call-with-port (open-file-output-port (format "~a.so" x) (file-options #;compressed replace)) (lambda (op) (call-with-port (open-file-output-port (format "~a.host" x) (file-options #;compressed replace)) (lambda (hostop) (compile-to-port '((library (testfile-hop1) (export a b c) (import (chezscheme)) (define-syntax a (identifier-syntax 17)) (module b (b1 b2) (define b1 "23.5") (define-syntax b2 (identifier-syntax (cons b1 b1)))) (define c (lambda (x) (import b) (vector b2 x))))) op #f #f #f ',(machine-type) hostop)))))) "testfile-hop1") (with-output-to-file "testfile-hop2.ss" (lambda () (pretty-print '(eval-when (compile) (load "testfile-hop1.so"))) (pretty-print '(eval-when (compile) (import (testfile-hop1)))) (pretty-print '(eval-when (compile) (import b))) (pretty-print '(pretty-print (list a b1 b2 (c 55))))) 'replace) (with-output-to-file "testfile-hop3.ss" (lambda () (pretty-print '(eval-when (compile) (load "testfile-hop1.host"))) (pretty-print '(eval-when (compile) (import (testfile-hop1)))) (pretty-print '(eval-when (compile) (import b))) (pretty-print '(pretty-print (list a b1 b2 (c 55))))) 'replace) (for-each separate-compile '(hop2 hop3)) #t) (equal? (separate-eval '(load "testfile-hop1.so") '(import (testfile-hop1)) 'a '(import b) 'b1 'b2 '(c 55)) "17\n\ \"23.5\"\n\ (\"23.5\" . \"23.5\")\n\ #((\"23.5\" . \"23.5\") 55)\n\ ") (equal? (separate-eval '(visit "testfile-hop1.so") ; visit now---$invoke-library will revisit later '(import (testfile-hop1)) 'a '(import b) 'b1 'b2 '(c 55)) "17\n\ \"23.5\"\n\ (\"23.5\" . \"23.5\")\n\ #((\"23.5\" . \"23.5\") 55)\n\ ") (equal? (separate-eval '(revisit "testfile-hop1.so") '(expand 'a) '(guard (c [else (display-condition c) (newline)]) (eval '(import b))) '(expand 'b1) '(expand 'b2) '(load "testfile-hop2.so")) "a\n\ Exception: unknown module b\n\ b1\n\ b2\n\ (17 \"23.5\" (\"23.5\" . \"23.5\") #((\"23.5\" . \"23.5\") 55))\n\ ") (equal? (separate-eval '(revisit "testfile-hop1.so") '(expand 'a) '(guard (c [else (display-condition c) (newline)]) (eval '(import b))) '(expand 'b1) '(expand 'b2) '(load "testfile-hop3.so")) "a\n\ Exception: unknown module b\n\ b1\n\ b2\n\ (17 \"23.5\" (\"23.5\" . \"23.5\") #((\"23.5\" . \"23.5\") 55))\n\ ") (equal? (separate-eval '(load "testfile-hop1.host") '(import (testfile-hop1)) 'a '(import b) 'b1 'b2 '(c 55)) "17\n\ \"23.5\"\n\ (\"23.5\" . \"23.5\")\n\ #((\"23.5\" . \"23.5\") 55)\n\ ") (equal? (separate-eval '(revisit "testfile-hop1.host") '(expand 'a) '(guard (c [else (display-condition c) (newline)]) (eval '(import b))) '(expand 'b1) '(expand 'b2) '(load "testfile-hop2.so")) "a\n\ Exception: unknown module b\n\ b1\n\ b2\n\ (17 \"23.5\" (\"23.5\" . \"23.5\") #((\"23.5\" . \"23.5\") 55))\n\ ") (equal? (separate-eval '(revisit "testfile-hop1.host") '(expand 'a) '(guard (c [else (display-condition c) (newline)]) (eval '(import b))) '(expand 'b1) '(expand 'b2) '(load "testfile-hop3.so")) "a\n\ Exception: unknown module b\n\ b1\n\ b2\n\ (17 \"23.5\" (\"23.5\" . \"23.5\") #((\"23.5\" . \"23.5\") 55))\n\ ") (begin (#%$compile-host-library 'moi "testfile-hop1.host") (define bv (call-with-port (open-file-input-port "testfile-hop1.host") get-bytevector-all)) #t) (begin ; doing it a second time should be a no-op (#%$compile-host-library 'moi "testfile-hop1.host") (bytevector=? (call-with-port (open-file-input-port "testfile-hop1.host") get-bytevector-all) bv)) (begin (set! bv #f) #t) (equal? (separate-eval '(load "testfile-hop1.host") '(import (testfile-hop1)) 'a '(import b) 'b1 'b2 '(c 55)) "17\n\ \"23.5\"\n\ (\"23.5\" . \"23.5\")\n\ #((\"23.5\" . \"23.5\") 55)\n\ ") (equal? (separate-eval '(revisit "testfile-hop1.host") '(expand 'a) '(guard (c [else (display-condition c) (newline)]) (eval '(import b))) '(expand 'b1) '(expand 'b2) '(load "testfile-hop2.so")) "a\n\ Exception: unknown module b\n\ b1\n\ b2\n\ (17 \"23.5\" (\"23.5\" . \"23.5\") #((\"23.5\" . \"23.5\") 55))\n\ ") (equal? (separate-eval '(revisit "testfile-hop1.host") '(expand 'a) '(guard (c [else (display-condition c) (newline)]) (eval '(import b))) '(expand 'b1) '(expand 'b2) '(load "testfile-hop3.so")) "a\n\ Exception: unknown module b\n\ b1\n\ b2\n\ (17 \"23.5\" (\"23.5\" . \"23.5\") #((\"23.5\" . \"23.5\") 55))\n\ ") (equal? (separate-eval '(visit "testfile-hop1.so") '(delete-file "testfile-hop1.so") ; prevent import from revisiting testfile-hop1.so '(import (testfile-hop1)) 'a '(import b) '(guard (c [else (display-condition c) (newline)]) (eval 'b1)) '(guard (c [else (display-condition c) (newline)]) (eval 'b2)) '(guard (c [else (display-condition c) (newline)]) (eval 'c))) "#t\n\ 17\n\ Exception: failed for testfile-hop1.so: no such file or directory\n\ Exception: failed for testfile-hop1.so: no such file or directory\n\ Exception: failed for testfile-hop1.so: no such file or directory\n\ ") ) (mat eval (error? ; 7 is not an environment (should be reported by compile or interpret) (eval 3 7)) (error? ; 7 is not an environment (interpret 3 7)) (error? ; 7 is not an environment (compile 3 7)) (eqv? (eval '(+ 3 4)) 7) (eq? (eval '(define foo (lambda (x) x))) (void)) (eval '(let ([x '(a b c)]) (eq? (foo x) x))) ) (mat expand ; tested in mats extend-syntax & with in 8.ms (error? ; 7 is not an environment (should be reported by sc-expand) (expand 3 7)) (error? ; 7 is not an environment (sc-expand 3 7)) (procedure? expand) ) (mat eval-when (let ([p (open-output-file "testfile.ss" 'replace)]) (display " (eval-when (eval) (set! aaa 'eval)) (eval-when (load) (set! aaa 'load)) (eval-when (compile) (set! aaa 'compile)) " p) (close-output-port p) #t) (begin (set! aaa #f) (load "testfile.ss") (eq? aaa 'eval)) (begin (printf "***** expect \"compile-file\" message:~%") (set! aaa #f) (compile-file "testfile") (eq? aaa 'compile)) (begin (set! aaa #f) (load "testfile.so") (eq? aaa 'load)) (let ([p (open-output-file "testfile.ss" 'replace)]) (display " (eval-when (eval) (eval-when (eval) (set! aaa 'eval@eval)) (eval-when (load) (set! aaa 'load@eval)) (eval-when (compile) (set! aaa 'compile@eval))) (eval-when (load) (eval-when (eval) (set! bbb 'eval@load)) (eval-when (load) (set! bbb 'load@load)) (eval-when (compile) (set! bbb 'compile@load))) (eval-when (compile) (eval-when (eval) (set! ccc 'eval@compile)) (eval-when (load) (set! ccc 'load@compile)) (eval-when (compile) (set! ccc 'compile@compile))) " p) (close-output-port p) #t) (begin (set! aaa #f) (set! bbb #f) (set! ccc #f) (load "testfile.ss") (equal? (list aaa bbb ccc) '(eval@eval #f #f))) (begin (printf "***** expect \"compile-file\" message:~%") (set! aaa #f) (set! bbb #f) (set! ccc #f) (compile-file "testfile") (equal? (list aaa bbb ccc) '(#f compile@load eval@compile))) (begin (set! aaa #f) (set! bbb #f) (set! ccc #f) (load "testfile.so") (equal? (list aaa bbb ccc) '(#f load@load #f))) (let ([p (open-output-file "testfile.ss" 'replace)]) (display " (eval-when (eval) (pretty-print 'evaluating)) (eval-when (compile) (pretty-print 'compiling)) (eval-when (load) (pretty-print 'loading)) (eval-when (visit) (pretty-print 'visiting)) (eval-when (revisit) (pretty-print 'revisiting)) (eval-when (visit revisit) (pretty-print 'visit/revisit)) (eval-when (compile) (eval-when (eval) (pretty-print 'oops))) (eval-when (load eval) (eval-when (compile) (pretty-print 'foo6))) " p) (close-output-port p) #t) (let () (define with-output-to-string (lambda (p) (parameterize ([current-output-port (open-output-string)]) (p) (get-output-string (current-output-port))))) (and (string=? (with-output-to-string (lambda () (compile-file "testfile"))) "compiling testfile.ss with output to testfile.so compiling oops foo6 " ) (string=? (with-output-to-string (lambda () (visit "testfile.so"))) "visiting visit/revisit " ) (string=? (with-output-to-string (lambda () (revisit "testfile.so"))) "loading revisiting visit/revisit " ) (string=? (with-output-to-string (lambda () (load "testfile.so"))) "loading visiting revisiting visit/revisit " ))) (let ([p (open-output-file "testfile.ss" 'replace)]) (display " (define-syntax $a (identifier-syntax 'b)) (define $foo) (eval-when (visit) (define visit-x 17)) (eval-when (revisit) (define-syntax revisit-x (identifier-syntax 23))) " p) (close-output-port p) #t) (begin (define-syntax $foo (syntax-rules ())) #t) (begin (define-syntax $a (syntax-rules ())) #t) (begin (define-syntax visit-x (syntax-rules ())) #t) (begin (define-syntax revisit-x (syntax-rules ())) #t) (error? $foo) (error? $a) (error? visit-x) (error? revisit-x) (begin (compile-file "testfile") #t) (eq? $a 'b) (error? $foo) (error? visit-x) (error? revisit-x) (begin (define-syntax $foo (syntax-rules ())) #t) (begin (define-syntax $a (syntax-rules ())) #t) (begin (define-syntax visit-x (syntax-rules ())) #t) (begin (define-syntax revisit-x (syntax-rules ())) #t) (begin (visit "testfile.so") #t) (eq? $a 'b) (error? $foo) (eq? visit-x 17) (error? revisit-x) (begin (revisit "testfile.so") #t) (eq? $a 'b) (eq? $foo (void)) (eq? visit-x 17) (eq? revisit-x 23) (begin (define get-$foo (lambda () $foo)) (eq? (get-$foo) (void))) (begin (define-syntax $foo (syntax-rules ())) #t) (begin (define-syntax $a (syntax-rules ())) #t) (begin (define-syntax visit-x (syntax-rules ())) #t) (begin (define-syntax revisit-x (syntax-rules ())) #t) (begin (revisit "testfile.so") #t) (error? $a) (error? $foo) (eq? (get-$foo) (void)) (error? visit-x) (eq? revisit-x 23) (begin (visit "testfile.so") #t) (eq? $a 'b) (eq? $foo (void)) (eq? (get-$foo) (void)) (eq? visit-x 17) (eq? revisit-x 23) (begin (define-syntax $foo (syntax-rules ())) #t) (begin (define-syntax $a (syntax-rules ())) #t) (begin (define-syntax visit-x (syntax-rules ())) #t) (begin (define-syntax revisit-x (syntax-rules ())) #t) (begin (load "testfile.so") #t) (eq? $a 'b) (eq? $foo (void)) (eq? (get-$foo) (void)) (eq? visit-x 17) (eq? revisit-x 23) (begin (define-syntax $foo (syntax-rules ())) #t) (begin (define-syntax $a (syntax-rules ())) #t) (begin (define-syntax visit-x (syntax-rules ())) #t) (begin (define-syntax revisit-x (syntax-rules ())) #t) (begin (load "testfile.ss") #t) (eq? $a 'b) (eq? $foo (void)) (error? visit-x) (error? revisit-x) (eqv? (let ((x 77)) (eval-when (eval) (define x 88)) x) 88) (eqv? (let ((x 77)) (eval-when (compile visit load revisit) (define x 88)) x) 77) (begin (define $qlist '()) (define-syntax $qdef (syntax-rules () [(_ x e) (begin (eval-when (compile) (set! $qlist (cons 'x $qlist))) (eval-when (load eval) (define x e)))])) ($qdef $bar 33) (and (null? $qlist) (eqv? $bar 33))) (let ([p (open-output-file "testfile.ss" 'replace)]) (pretty-print '($qdef $baz (lambda () ($qdef x 44) x)) p) (close-output-port p) #t) (begin (compile-file "testfile") #t) (equal? $qlist '($baz)) (begin (load "testfile.so") #t) (equal? $qlist '($baz)) (eq? ($baz) 44) ; regression: make sure that visit doesn't evaluate top-level module ; inits and definition right-hand-sides (let ([p (open-output-file "testfile.ss" 'replace)]) (display "(eval-when (visit) (printf \"visit A\\n\")) (eval-when (revisit) (printf \"revisit A\\n\")) (eval-when (load compile) (printf \"compile load A\\n\")) (define foo (printf \"evaluating top-level foo rhs\\n\")) (printf \"evaluating top-level init\\n\") (eval-when (visit) (printf \"visit B\\n\")) (eval-when (revisit) (printf \"revisit B\\n\")) (eval-when (load compile) (printf \"compile load B\\n\")) (module () (define foo (printf \"evaluating module foo rhs\\n\")) (printf \"evaluating module init\\n\")) " p) (close-output-port p) #t) (let () (define with-output-to-string (lambda (p) (parameterize ([current-output-port (open-output-string)]) (p) (get-output-string (current-output-port))))) (and (string=? (with-output-to-string (lambda () (compile-file "testfile"))) "compiling testfile.ss with output to testfile.so compile load A compile load B " ) (string=? (with-output-to-string (lambda () (visit "testfile.so"))) "visit A visit B ") (string=? (with-output-to-string (lambda () (revisit "testfile.so"))) "revisit A compile load A evaluating top-level foo rhs evaluating top-level init revisit B compile load B evaluating module foo rhs evaluating module init "))) ) (mat compile-whole-program (error? ; no such file or directory nosuchfile.wpo (compile-whole-program "nosuchfile.wpo" "testfile-wpo-ab-all.so")) (error? ; incorrect number of arguments (compile-whole-program "testfile-wpo-ab.wpo")) (begin (with-output-to-file "testfile-wpo-a.ss" (lambda () (pretty-print '(library (testfile-wpo-a) (export make-tree tree tree? tree-left tree-right tree-value) (import (chezscheme)) (define-record-type tree (nongenerative) (fields (mutable left) (mutable value) (mutable right))) (record-writer (record-type-descriptor tree) (lambda (r p wr) (display "#[tree " p) (wr (tree-left r) p) (display " " p) (wr (tree-value r) p) (display " " p) (wr (tree-right r) p) (display "]" p)))))) 'replace) (with-output-to-file "testfile-wpo-b.ss" (lambda () (pretty-print '(library (testfile-wpo-b) (export make-constant-tree make-tree tree? tree-left tree-right tree-value tree->list) (import (rnrs) (testfile-wpo-a)) (define-syntax make-constant-tree (lambda (x) (define build-tree (lambda (tree-desc) (syntax-case tree-desc () [(l v r) (make-tree (build-tree #'l) (syntax->datum #'v) (build-tree #'r))] [v (make-tree #f (syntax->datum #'v) #f)]))) (syntax-case x () [(_ tree-desc) #`'#,(build-tree #'tree-desc)]))) (define tree->list (lambda (t) (let f ([t t] [s '()]) (if (not t) s (f (tree-left t) (cons (tree-value t) (f (tree-right t) s)))))))))) 'replace) (with-output-to-file "testfile-wpo-ab.ss" (lambda () (pretty-print '(import (chezscheme) (testfile-wpo-b))) (pretty-print '(define a (make-constant-tree ((1 2 4) 5 (8 10 12))))) (pretty-print '(printf "constant tree: ~s~%" a)) (pretty-print '(printf "constant tree value: ~s~%" (tree-value a))) (pretty-print '(printf "constant tree walk: ~s~%" (tree->list a)))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) "testfile-wpo-ab") #t) (file-exists? "testfile-wpo-a.wpo") (file-exists? "testfile-wpo-b.wpo") (file-exists? "testfile-wpo-ab.wpo") (equal? (separate-eval '(load-program "testfile-wpo-ab.so")) "constant tree: #[tree #[tree #[tree #f 1 #f] 2 #[tree #f 4 #f]] 5 #[tree #[tree #f 8 #f] 10 #[tree #f 12 #f]]]\nconstant tree value: 5\nconstant tree walk: (1 2 4 5 8 10 12)\n") (equal? (separate-compile '(lambda (x) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x))) "testfile-wpo-ab") "()\n") (delete-file "testfile-wpo-a.so") (delete-file "testfile-wpo-b.so") (delete-file "testfile-wpo-ab.so") (equal? (separate-eval '(load-program "testfile-wpo-ab-all.so")) "constant tree: #[tree #[tree #[tree #f 1 #f] 2 #[tree #f 4 #f]] 5 #[tree #[tree #f 8 #f] 10 #[tree #f 12 #f]]]\nconstant tree value: 5\nconstant tree walk: (1 2 4 5 8 10 12)\n") (begin (load-program "testfile-wpo-ab-all.so") #t) (not (memq '(testfile-wpo-a) (library-list))) (not (memq '(testfile-wpo-b) (library-list))) (begin (with-output-to-file "testfile-wpo-lib.ss" (lambda () (pretty-print '(library (testfile-wpo-lib) (export f) (import (chezscheme)) (define (f n) (if (zero? n) 1 (* n (f (- n 1)))))))) 'replace) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-library x))) "testfile-wpo-lib") (file-exists? "testfile-wpo-lib.wpo")) (begin (with-output-to-file "testfile-wpo-prog.ss" (lambda () (pretty-print '(import (chezscheme))) (pretty-print '(pretty-print (let () (import (testfile-wpo-lib)) (f 10)))) (pretty-print '(pretty-print ((top-level-value 'f (environment '(testfile-wpo-lib))) 10)))) 'replace) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-program x))) "testfile-wpo-prog") (file-exists? "testfile-wpo-prog.wpo")) (equal? (separate-eval '(load-program "testfile-wpo-prog.so")) "3628800\n3628800\n") (equal? (separate-compile '(lambda (x) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x) #t)) "testfile-wpo-prog") "()\n") (equal? (separate-compile '(lambda (x) (compile-whole-program (format "~a.wpo" x) (format "~a-none.so" x) #f)) "testfile-wpo-prog") "()\n") (delete-file "testfile-wpo-lib.ss") (delete-file "testfile-wpo-lib.so") (delete-file "testfile-wpo-lib.wpo") (equal? (separate-eval '(load-program "testfile-wpo-prog-all.so")) "3628800\n3628800\n") (error? (separate-eval '(load-program "testfile-wpo-prog-none.so"))) (begin (with-output-to-file "testfile-wpo-a3.ss" (lambda () (pretty-print '(library (testfile-wpo-a3) (export ! z?) (import (rnrs)) (define (z? n) (= n 0)) (define (! n) (if (z? n) 1 (* n (! (- n 1)))))))) 'replace) (with-output-to-file "testfile-wpo-b3.ss" (lambda () (pretty-print '(library (testfile-wpo-b3) (export fib !) (import (rnrs) (testfile-wpo-a3)) (define (fib n) (cond [(z? n) 1] [(z? (- n 1)) 1] [else (+ (fib (- n 1)) (fib (- n 2)))]))))) 'replace) (with-output-to-file "testfile-wpo-c3.ss" (lambda () (pretty-print '(import (testfile-wpo-b3) (chezscheme))) (pretty-print '(pretty-print (list (fib 10) (! 10) ((top-level-value 'fib (environment '(testfile-wpo-b3))) 10) ((top-level-value '! (environment '(testfile-wpo-b3))) 10) ((top-level-value 'z? (environment '(testfile-wpo-a3))) 10))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) "testfile-wpo-c3") #t) (equal? (separate-eval '(load-program "testfile-wpo-c3.so")) "(89 3628800 89 3628800 #f)\n") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x) #t))) "testfile-wpo-c3") "()\n") (delete-file "testfile-wpo-a3.ss") (delete-file "testfile-wpo-a3.so") (delete-file "testfile-wpo-a3.wpo") (delete-file "testfile-wpo-b3.ss") (delete-file "testfile-wpo-b3.so") (delete-file "testfile-wpo-b3.wpo") (equal? (separate-eval '(load-program "testfile-wpo-c3-all.so")) "(89 3628800 89 3628800 #f)\n") (begin (with-output-to-file "testfile-wpo-a4.ss" (lambda () (pretty-print '(library (testfile-wpo-a4) (export !) (import (chezscheme)) (define (! n) (if (= n 0) 1 (* n (! (- n 1)))))))) 'replace) (with-output-to-file "testfile-wpo-b4.ss" (lambda () (pretty-print '(library (testfile-wpo-b4) (export fib) (import (chezscheme)) (define (fib n) (if (or (= n 0) (= n 1)) 1 (+ (fib (- n 1)) (fib (- n 2)))))))) 'replace) (with-output-to-file "testfile-wpo-c4.ss" (lambda () (pretty-print '(library (testfile-wpo-c4) (export !fib) (import (chezscheme) (testfile-wpo-a4) (testfile-wpo-b4)) (define (!fib n) (! (fib n)))))) 'replace) (with-output-to-file "testfile-wpo-prog4.ss" (lambda () (pretty-print '(import (chezscheme) (testfile-wpo-c4))) (pretty-print '(pretty-print (!fib 5)))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) "testfile-wpo-prog4") #t) (delete-file "testfile-wpo-a4.wpo") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x) #t))) 'wpo-prog4) "((testfile-wpo-a4))\n") (begin (rename-file "testfile-wpo-a4.ss" "testfile-wpo-a4.ss.spam") (rename-file "testfile-wpo-b4.ss" "testfile-wpo-b4.ss.spam") (rename-file "testfile-wpo-c4.ss" "testfile-wpo-c4.ss.spam") (rename-file "testfile-wpo-prog4.ss" "testfile-wpo-prog4.ss.spam") #t) (delete-file "testfile-wpo-b4.so") (delete-file "testfile-wpo-b4.wpo") (delete-file "testfile-wpo-c4.so") (delete-file "testfile-wpo-c4.wpo") (delete-file "testfile-wpo-prog4.so") (delete-file "testfile-wpo-prog4.wpo") (equal? (separate-eval '(load-program "testfile-wpo-prog4-all.so")) "40320\n") (delete-file "testfile-wpo-a4.so") (error? ; library (testfile-wpo-a4) not found (separate-eval '(load-program "testfile-wpo-prog4-all.so"))) (delete-file "testfile-wpo-prog4-all.so") (begin (rename-file "testfile-wpo-a4.ss.spam" "testfile-wpo-a4.ss") (rename-file "testfile-wpo-b4.ss.spam" "testfile-wpo-b4.ss") (rename-file "testfile-wpo-c4.ss.spam" "testfile-wpo-c4.ss") (rename-file "testfile-wpo-prog4.ss.spam" "testfile-wpo-prog4.ss") #t) (begin (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) "testfile-wpo-prog4") #t) (delete-file "testfile-wpo-c4.wpo") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x) #t))) 'wpo-prog4) "((testfile-wpo-c4))\n") (delete-file "testfile-wpo-a4.ss") (delete-file "testfile-wpo-b4.ss") (delete-file "testfile-wpo-c4.ss") (delete-file "testfile-wpo-prog4.ss") (delete-file "testfile-wpo-a4.so") (delete-file "testfile-wpo-a4.wpo") (delete-file "testfile-wpo-b4.so") (delete-file "testfile-wpo-b4.wpo") (delete-file "testfile-wpo-prog4.so") (delete-file "testfile-wpo-prog4.wpo") (equal? (separate-eval '(load-program "testfile-wpo-prog4-all.so")) "40320\n") (eqv? (separate-eval '(verify-loadability 'load "testfile-wpo-prog4-all.so")) "") (delete-file "testfile-wpo-c4.so") (error? ; library (testfile-wpo-c4) not found (separate-eval '(load-program "testfile-wpo-prog4-all.so"))) (begin (with-output-to-file "testfile-wpo-a5.ss" (lambda () (pretty-print '(library (testfile-wpo-a5) (export a) (import (chezscheme)) (define a (lambda (n) (+ ((top-level-value 'c (environment '(testfile-wpo-c5)))) n)))))) 'replace) (with-output-to-file "testfile-wpo-b5.ss" (lambda () (pretty-print '(library (testfile-wpo-b5) (export b) (import (chezscheme) (testfile-wpo-a5)) (define b (a 10))))) 'replace) (with-output-to-file "testfile-wpo-c5.ss" (lambda () (pretty-print '(library (testfile-wpo-c5) (export c) (import (chezscheme) (testfile-wpo-a5) (testfile-wpo-b5)) (define c (lambda () (+ (a 10) b)))))) 'replace) (with-output-to-file "testfile-wpo-prog5.ss" (lambda () (pretty-print '(import (chezscheme) (testfile-wpo-b5) (testfile-wpo-c5))) (pretty-print '(pretty-print (cons (b) c)))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) "testfile-wpo-prog5") #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x) #t))) 'wpo-prog5) "()\n") (error? ; attempt to invoke library (testfile-wpo-c5) while it is still being loaded (separate-eval '(load-program "testfile-wpo-prog5-all.so"))) (begin (with-output-to-file "testfile-wpo-a6.ss" (lambda () (pretty-print '(library (testfile-wpo-a6) (export x a) (import (rnrs)) (define x 3) (define z 17) (define-syntax a (identifier-syntax z)) (display "invoke a\n")))) 'replace) (with-output-to-file "testfile-wpo-b6.ss" (lambda () (pretty-print '(library (testfile-wpo-b6) (export y) (import (rnrs) (testfile-wpo-a6)) (define counter 9) (define (y) (set! counter (+ counter 5)) (list x counter a)) (display "invoke b\n")))) 'replace) (with-output-to-file "testfile-wpo-prog6.ss" (lambda () (pretty-print '(import (testfile-wpo-b6) (rnrs) (only (chezscheme) printf))) (pretty-print '(printf "==== ~s ====" (y))) (pretty-print '(printf "==== ~s ====" (y)))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) 'wpo-prog6) #t) (equal? (separate-eval '(load-program "testfile-wpo-prog6.so")) "invoke a\ninvoke b\n==== (3 14 17) ======== (3 19 17) ====") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x)))) 'wpo-prog6) "()\n") (delete-file "testfile-wpo-a6.ss") (delete-file "testfile-wpo-a6.so") (delete-file "testfile-wpo-a6.wpo") (delete-file "testfile-wpo-b6.ss") (delete-file "testfile-wpo-b6.so") (delete-file "testfile-wpo-b6.wpo") (equal? (separate-eval '(load-program "testfile-wpo-prog6-all.so")) "invoke a\ninvoke b\n==== (3 14 17) ======== (3 19 17) ====") (eqv? (separate-eval '(verify-loadability 'load "testfile-wpo-prog6-all.so")) "") (begin (with-output-to-file "testfile-wpo-aa7.ss" (lambda () (pretty-print '(library (testfile-wpo-aa7) (export ax) (import (chezscheme)) (define ax (gensym)) (printf "invoking aa\n")))) 'replace) (with-output-to-file "testfile-wpo-a7.ss" (lambda () (pretty-print '(library (testfile-wpo-a7) (export x) (import (chezscheme) (testfile-wpo-aa7)) (define x (cons ax (gensym))) (printf "invoking a\n")))) 'replace) (with-output-to-file "testfile-wpo-b7.ss" (lambda () (pretty-print '(library (testfile-wpo-b7) (export z) (import (chezscheme) (testfile-wpo-c7)) (define z (cons 'b y)) (printf "invoking b\n")))) 'replace) (with-output-to-file "testfile-wpo-c7.ss" (lambda () (pretty-print '(library (testfile-wpo-c7) (export y) (import (chezscheme) (testfile-wpo-a7)) (define y (cons 'c x)) (printf "invoking c\n")))) 'replace) (with-output-to-file "testfile-wpo-ab7.ss" (lambda () (for-each pretty-print '((import (chezscheme) (testfile-wpo-c7) (testfile-wpo-a7) (testfile-wpo-b7)) (pretty-print (eq? (cdr y) x)) (pretty-print (eq? (cdr z) y)) (pretty-print (and (eq? (car y) 'c) (eq? (car z) 'b)))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) 'wpo-ab7) #t) (equal? (separate-eval '(load "testfile-wpo-ab7.so")) "invoking aa\ninvoking a\ninvoking c\ninvoking b\n#t\n#t\n#t\n") (delete-file "testfile-wpo-c7.ss") (delete-file "testfile-wpo-c7.wpo") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x)))) 'wpo-ab7) "((testfile-wpo-c7))\n") (equal? (separate-eval '(load "testfile-wpo-ab7-all.so")) "invoking aa\ninvoking a\ninvoking c\ninvoking b\n#t\n#t\n#t\n") (begin (with-output-to-file "testfile-wpo-extlib.chezscheme.sls" (lambda () (pretty-print '(library (testfile-wpo-extlib) (export magic) (import (rnrs)) (define magic (cons 9 5))))) 'replace) (with-output-to-file "testfile-wpo-ext.ss" (lambda () (pretty-print '(import (chezscheme) (testfile-wpo-extlib))) (pretty-print '(pretty-print magic))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) 'wpo-ext) #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x)))) 'wpo-ext) "()\n") (equal? (separate-eval '(load "testfile-wpo-ext-all.so")) "(9 . 5)\n") ; test propagation of #! shell-script line (begin (define $hash-bang-line "#! /usr/bin/scheme --program\n") (delete-file "testfile-wpo-c8.so") (delete-file "testfile-wpo-c8-all.so") (delete-file "testfile-wpo-c8.wpo") (with-output-to-file "testfile-wpo-c8.ss" (lambda () (display-string $hash-bang-line) (for-each pretty-print '((import (chezscheme)) (printf "hello\n")))) 'replace) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-program x))) 'wpo-c8) (separate-compile '(lambda (x) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x))) 'wpo-c8) #t) (equal? (separate-eval '(load "testfile-wpo-c8.so")) "hello\n") (equal? (separate-eval '(load "testfile-wpo-c8-all.so")) "hello\n") (equal? (call-with-port (open-file-input-port "testfile-wpo-c8-all.so") (lambda (ip) (get-bytevector-n ip (string-length $hash-bang-line)))) (string->utf8 $hash-bang-line)) (eqv? (separate-eval '(verify-loadability 'load "testfile-wpo-c8-all.so")) "") (begin (mkfile "testfile-wpo-a9.ss" '(library (testfile-wpo-a9) (export x) (import (chezscheme)) (define x (eval 'x (environment '(testfile-wpo-a9)))))) (mkfile "testfile-wpo-b9.ss" '(import (chezscheme) (testfile-wpo-a9)) '(printf "x = ~s\n" x)) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t] [compile-imported-libraries #t]) (compile-program x))) 'wpo-b9) (separate-compile '(lambda (x) (compile-whole-program (format "~a.wpo" x) (format "~a-all.so" x) #t)) 'wpo-b9) (separate-compile '(lambda (x) (compile-whole-library (format "~a.wpo" x) (format "~a-all.so" x))) 'wpo-a9) #t) (error? ; invoke cycle (separate-eval '(load-library "testfile-wpo-a9.so") '(let () (import (testfile-wpo-a9)) x))) (error? ; invoke cycle (separate-eval '(load-library "testfile-wpo-a9-all.so") '(let () (import (testfile-wpo-a9)) x))) (error? ; invoke cycle (separate-eval '(load-program "testfile-wpo-b9.so"))) (error? ; invoke cycle (separate-eval '(load-program "testfile-wpo-b9-all.so"))) (begin (mkfile "testfile-wpo-a10.ss" '(library (testfile-wpo-a10) (export ax) (import (chezscheme)) (define ax (cons 'a '())))) (mkfile "testfile-wpo-b10.ss" '(library (testfile-wpo-b10) (export bx) (import (chezscheme) (testfile-wpo-a10)) (define bx (cons 'b ax)))) (mkfile "testfile-wpo-c10.ss" '(library (testfile-wpo-c10) (export cx) (import (chezscheme) (testfile-wpo-b10)) (define cx (cons 'c bx)))) (mkfile "testfile-wpo-d10.ss" '(import (chezscheme) (testfile-wpo-c10)) '(printf "d: cx = ~s\n" cx)) (mkfile "testfile-wpo-e10.ss" '(import (chezscheme) (testfile-wpo-a10)) '(printf "e: ax = ~s\n" ax)) (mkfile "testfile-wpo-f10.ss" '(import (chezscheme) (testfile-wpo-c10)) '(printf "f: cx = ~s\n" cx)) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t] [compile-imported-libraries #t]) (compile-program x))) 'wpo-d10) (separate-compile 'compile-program 'wpo-e10) (separate-compile 'compile-program 'wpo-f10) #t) ; cause b10 to be excluded from the whole program (delete-file "testfile-wpo-b10.wpo") (equal? (separate-eval '(compile-whole-program "testfile-wpo-d10.wpo" "testfile-wpo-d10-all.so" #f)) "((testfile-wpo-b10))\n") (equal? (separate-eval '(verify-loadability 'visit "testfile-wpo-d10-all.so")) "") (equal? (separate-eval '(verify-loadability 'revisit "testfile-wpo-d10-all.so")) "") (equal? (separate-eval '(verify-loadability 'load "testfile-wpo-d10-all.so")) "") (equal? (separate-eval '(load-program "testfile-wpo-d10-all.so")) "d: cx = (c b a)\n") ; library a10 must be visible for (excluded library) ; b10's benefit, so e10 can reference its export (equal? (separate-eval '(load-program "testfile-wpo-d10-all.so") '(load-program "testfile-wpo-e10.so")) "d: cx = (c b a)\ne: ax = (a)\n") ; library c10 need not and should not be visible, so f10 ; shouldn't be able to reference its export. (error? (separate-eval '(load-program "testfile-wpo-d10-all.so") '(load-program "testfile-wpo-f10.so"))) (error? ; testfile-wpo-c10 is not visible (separate-eval '(load-program "testfile-wpo-d10-all.so") '(import (testfile-wpo-c10)))) (equal? (separate-eval '(load-program "testfile-wpo-d10-all.so") '(verify-loadability 'visit "testfile-wpo-f10.so")) "d: cx = (c b a)\n") ; verify-loadability should error out trying to invoke ; c10 because c10 is not visible (error? ; not visible (separate-eval '(load-program "testfile-wpo-d10-all.so") '(verify-loadability 'revisit "testfile-wpo-f10.so"))) (error? ; not visible (separate-eval '(load-program "testfile-wpo-d10-all.so") '(verify-loadability 'load "testfile-wpo-f10.so"))) (begin (mkfile "testfile-wpo-a11.ss" '(library (testfile-wpo-a11) (export ax) (import (chezscheme)) (define ax (cons 'a '())) (printf "invoking a\n"))) (parameterize ([generate-wpo-files #t]) (compile-library "testfile-wpo-a11")) #t) (equal? (compile-whole-library "testfile-wpo-a11.wpo" "testfile-wpo-a11-all.so") '()) (equal? (separate-eval '(load-library "testfile-wpo-a11.so")) "") (equal? (separate-eval '(load-library "testfile-wpo-a11.so") '(let () (import (testfile-wpo-a11)) ax)) "invoking a\n(a)\n") (equal? (separate-eval '(load-library "testfile-wpo-a11-all.so")) "") (equal? (separate-eval '(load-library "testfile-wpo-a11-all.so") '(let () (import (testfile-wpo-a11)) ax)) "invoking a\n(a)\n") (begin (mkfile "testfile-wpo-a12.ss" '(library (testfile-wpo-a12) (export ax) (import (chezscheme)) (define ax (cons 'a '())))) (mkfile "testfile-wpo-b12.ss" '(library (testfile-wpo-b12) (export bx) (import (chezscheme) (testfile-wpo-a12)) (define bx (eval 'cx (environment '(testfile-wpo-c12)))))) (mkfile "testfile-wpo-c12.ss" '(library (testfile-wpo-c12) (export cx) (import (chezscheme) (testfile-wpo-b12)) (define cx (cons 'c bx)))) (mkfile "testfile-wpo-d12.ss" '(import (chezscheme) (testfile-wpo-c12)) '(printf "d: cx = ~s\n" cx)) (parameterize ([generate-wpo-files #t] [compile-imported-libraries #t]) (compile-program "testfile-wpo-d12")) #t) (error? ; cyclc (separate-eval '(load-program "testfile-wpo-d12.so"))) ; cause b12 to be excluded from the whole library and program (delete-file "testfile-wpo-b12.wpo") (equal? (separate-eval '(compile-whole-library "testfile-wpo-c12.wpo" "testfile-wpo-c12-all.so")) "((testfile-wpo-b12))\n") (equal? (separate-eval '(compile-whole-program "testfile-wpo-d12.wpo" "testfile-wpo-d12-all.so" #t)) "((testfile-wpo-b12))\n") (equal? (separate-eval '(load-library "testfile-wpo-c12-all.so")) "") (error? ; cycle (separate-eval '(load-library "testfile-wpo-c12-all.so") '(let () (import (testfile-wpo-c12)) cx))) (error? ; cycle (separate-eval '(load-program "testfile-wpo-d12-all.so"))) ; verify-loadability doesn't catch (dynamic) cycles (equal? (separate-eval '(verify-loadability 'visit "testfile-wpo-c12.so")) "") (equal? (separate-eval '(verify-loadability 'revisit "testfile-wpo-c12.so")) "") (equal? (separate-eval '(verify-loadability 'load "testfile-wpo-c12.so")) "") ; verify-loadability doesn't catch (dynamic) cycles (equal? (separate-eval '(verify-loadability 'visit "testfile-wpo-d12.so")) "") (equal? (separate-eval '(verify-loadability 'revisit "testfile-wpo-d12.so")) "") (equal? (separate-eval '(verify-loadability 'load "testfile-wpo-d12.so")) "") ) (mat compile-whole-library (begin (with-output-to-file "testfile-cwl-a1.ss" (lambda () (pretty-print '(library (testfile-cwl-a1) (export x a) (import (rnrs)) (define x 3) (define z 17) (define-syntax a (identifier-syntax z)) (display "invoke a\n")))) 'replace) (with-output-to-file "testfile-cwl-b1.ss" (lambda () (pretty-print '(library (testfile-cwl-b1) (export y) (import (rnrs) (testfile-cwl-a1)) (define counter 9) (define (y) (set! counter (+ counter 5)) (list x counter a)) (display "invoke b\n")))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) "testfile-cwl-b1") #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'cwl-b1) "()\n") (begin (rename-file "testfile-cwl-a1.ss" "testfile-cwl-a1.ss.spam") #t) (delete-file "testfile-cwl-a1.so") (delete-file "testfile-cwl-a1.wpo") (equal? (separate-eval '(let () (import (testfile-cwl-b1)) (printf ">~s\n" (y)) (printf ">~s\n" (y)))) "invoke a\ninvoke b\n>(3 14 17)\n>(3 19 17)\n") (eqv? (separate-eval '(verify-loadability 'load "testfile-cwl-b1.so")) "") (error? ; library (testfile-cwl-a1) not found (separate-eval '(begin (import (testfile-cwl-a1)) (import (testfile-cwl-b1))))) (equal? (separate-eval '(let () (import (testfile-cwl-b1)) (import (testfile-cwl-a1)) (printf ">~s\n" (y)) (printf ">~s\n" (list a x)))) "invoke a\ninvoke b\n>(3 14 17)\n>(17 3)\n") (begin (rename-file "testfile-cwl-a1.ss.spam" "testfile-cwl-a1.ss") (with-output-to-file "testfile-cwl-d1.ss" (lambda () (pretty-print '(library (testfile-cwl-d1) (export z) (import (rnrs) (testfile-cwl-a1)) (define counter 7) (define (z) (set! counter (+ counter 5)) (list x counter a)) (display "invoke d\n")))) 'replace) #t) (equal? (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) 'cwl-d1) "compiling testfile-cwl-d1.ss with output to testfile-cwl-d1.so\ncompiling testfile-cwl-a1.ss with output to testfile-cwl-a1.so\n") (begin (with-output-to-file "testfile-cwl-a2.ss" (lambda () (pretty-print '(library (testfile-cwl-a2) (export f) (import (chezscheme)) (define (f n) (if (zero? n) 1 (* n (f (- n 1)))))))) 'replace) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-library x))) 'cwl-a2) (file-exists? "testfile-cwl-a2.wpo")) (begin (with-output-to-file "testfile-cwl-b2.ss" (lambda () (pretty-print '(library (testfile-cwl-b2) (export main) (import (chezscheme)) (define (main) (import (testfile-cwl-a2)) ((top-level-value 'f (environment '(testfile-cwl-a2))) 10))))) 'replace) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-library x))) "testfile-cwl-b2") (file-exists? "testfile-cwl-b2.wpo")) (equal? (separate-eval '(let () (import (testfile-cwl-b2)) (main))) "3628800\n") (eqv? (separate-eval '(verify-loadability 'load "testfile-cwl-b2.so")) "") (equal? (separate-compile '(lambda (x) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x))) "testfile-cwl-b2") "()\n") (delete-file "testfile-cwl-a2.ss") (delete-file "testfile-cwl-a2.so") (equal? (separate-eval '(let () (import (testfile-cwl-b2)) (main))) "3628800\n") (begin (with-output-to-file "testfile-cwl-c1.ss" (lambda () (pretty-print '(library (testfile-cwl-c1) (export main) (import (chezscheme)) (define (main) (import (testfile-cwl-b1)) (printf ">~s\n" ((top-level-value 'y (environment '(testfile-cwl-b1))))) (printf ">~s\n" ((top-level-value 'y (environment '(testfile-cwl-b1))))))))) 'replace) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-library x))) "testfile-cwl-c1") #t) (equal? (separate-eval '(let () (import (testfile-cwl-c1)) (main))) "invoke a\ninvoke b\n>(3 14 17)\n>(3 19 17)\n") (equal? (separate-compile '(lambda (x) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x))) "testfile-cwl-c1") "()\n") (delete-file "testfile-cwl-a1.so") (delete-file "testfile-cwl-a1.ss") (delete-file "testfile-cwl-b1.so") (delete-file "testfile-cwl-b1.ss") (equal? (separate-eval '(let () (import (testfile-cwl-c1)) (main))) "invoke a\ninvoke b\n>(3 14 17)\n>(3 19 17)\n") (begin (with-output-to-file "testfile-cwl-a3.ss" (lambda () (pretty-print '(library (testfile-cwl-a3) (export ! z?) (import (rnrs)) (define (z? n) (= n 0)) (define (! n) (if (z? n) 1 (* n (! (- n 1)))))))) 'replace) (with-output-to-file "testfile-cwl-b3.ss" (lambda () (pretty-print '(library (testfile-cwl-b3) (export fib !) (import (rnrs) (testfile-cwl-a3)) (define (fib n) (cond [(z? n) 1] [(z? (- n 1)) 1] [else (+ (fib (- n 1)) (fib (- n 2)))]))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) "testfile-cwl-b3") #t) (equal? (separate-eval '(let () (import (testfile-cwl-b3)) (import (testfile-cwl-a3)) (pretty-print (list (! 10) (fib 10) (z? 10))))) "(3628800 89 #f)\n") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) "testfile-cwl-b3") "()\n") (delete-file "testfile-cwl-a3.so") (delete-file "testfile-cwl-a3.wpo") (equal? (separate-eval '(let () (import (testfile-cwl-b3)) (import (testfile-cwl-a3)) (pretty-print (list (! 10) (fib 10) (z? 10))))) "(3628800 89 #f)\n") (begin (with-output-to-file "testfile-cwl-x4.ss" (lambda () (pretty-print '(library (testfile-cwl-x4) (export ack) (import (rnrs)) (define (ack m n) (if (= m 0) (+ n 1) (if (= n 0) (ack (- m 1) 1) (ack (- m 1) (ack m (- n 1))))))))) 'replace) (with-output-to-file "testfile-cwl-y4.ss" (lambda () (pretty-print '(library (testfile-cwl-y4) (export fact) (import (rnrs)) (define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))))) 'replace) (with-output-to-file "testfile-cwl-z4.ss" (lambda () (pretty-print '(library (testfile-cwl-z4) (export fib) (import (rnrs)) (define (fib n) (cond [(= n 0) 1] [(= n 1) 1] [else (+ (fib (- n 1)) (fib (- n 2)))]))))) 'replace) (with-output-to-file "testfile-cwl-w4.ss" (lambda () (pretty-print '(library (testfile-cwl-w4) (export mult) (import (rnrs)) (define (mult n m) (if (= n 1) m (+ m (mult (- n 1) m))))))) 'replace) (with-output-to-file "testfile-cwl-a4.ss" (lambda () (pretty-print '(library (testfile-cwl-a4) (export a-stuff) (import (rnrs) (testfile-cwl-x4) (testfile-cwl-y4) (testfile-cwl-z4) (testfile-cwl-b4) (testfile-cwl-c4)) (define (a-stuff) (list (ack 3 4) (fib 5) (fact 10)))))) 'replace) (with-output-to-file "testfile-cwl-b4.ss" (lambda () (pretty-print '(library (testfile-cwl-b4) (export b-stuff) (import (rnrs) (testfile-cwl-x4) (testfile-cwl-w4)) (define (b-stuff) (mult 3 (ack 3 4)))))) 'replace) (with-output-to-file "testfile-cwl-c4.ss" (lambda () (pretty-print '(library (testfile-cwl-c4) (export c-stuff) (import (rnrs) (testfile-cwl-y4) (testfile-cwl-w4)) (define (c-stuff) (mult 5 (fact 10)))))) 'replace) #t) (begin (define (separate-compile-cwl4) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) "testfile-cwl-b4") (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) "testfile-cwl-c4") (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) "testfile-cwl-a4") (andmap (lambda (n) (and (file-exists? (format "testfile-cwl-~s4.wpo" n)) (file-exists? (format "testfile-cwl-~s4.so" n)))) '(a b c x y z w))) #t) (begin (define (clear-cwl4-output) (andmap (lambda (n) (and (delete (format "testfile-cwl-~s4.wpo" n)) (delete (format "testfile-cwl-~s4.so" n)))) '(a b c x y z w))) #t) (separate-compile-cwl4) (equal? (separate-eval '(let () (import (testfile-cwl-a4)) (import (testfile-cwl-b4) (testfile-cwl-c4)) (pretty-print (a-stuff)) (pretty-print (b-stuff)) (pretty-print (c-stuff)))) "(125 8 3628800)\n375\n18144000\n") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) "testfile-cwl-a4") "()\n") (andmap (lambda (name) (andmap (lambda (ext) (delete-file (format "testfile-cwl-~s4.~s" name ext))) '(so ss wpo))) '(b c x y z w)) (equal? (separate-eval '(let () (import (testfile-cwl-a4)) (import (testfile-cwl-b4) (testfile-cwl-c4)) (pretty-print (a-stuff)) (pretty-print (b-stuff)) (pretty-print (c-stuff)))) "(125 8 3628800)\n375\n18144000\n") (begin (with-output-to-file "testfile-cwl-a5.ss" (lambda () (pretty-print '(library (testfile-cwl-a5) (export fact) (import (rnrs)) (define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))))) 'replace) (with-output-to-file "testfile-cwl-b5.ss" (lambda () (pretty-print '(library (testfile-cwl-b5) (export fib+fact) (import (rnrs) (testfile-cwl-a5)) (define (fib n) (if (or (= n 0) (= n 1)) 1 (+ (fib (- n 1)) (fib (- n 2))))) (define (fib+fact n) (+ (fib n) (fact n)))))) 'replace) (with-output-to-file "testfile-cwl-c5.ss" (lambda () (pretty-print `(library (testfile-cwl-c5) (export ack+fact) (import (rnrs) (testfile-cwl-a5)) (define (ack m n) (cond [(= m 0) (+ n 1)] [(= n 0) (ack (- m 1) 1)] [else (ack (- m 1) (ack m (- n 1)))])) (define (ack+fact m n) (+ (ack m n) (fact m) (fact n)))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (for-each compile-library x))) '(quote ("testfile-cwl-b5" "testfile-cwl-c5"))) #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) "testfile-cwl-b5") "()\n") (delete-file "testfile-cwl-a5.ss") (delete-file "testfile-cwl-a5.so") (delete-file "testfile-cwl-a5.wpo") (equal? (separate-eval '(let () (import (testfile-cwl-b5)) (import (testfile-cwl-c5)) (list (fib+fact 10) (ack+fact 3 4)))) "(3628889 155)\n") (begin (with-output-to-file "testfile-cwl-a5.ss" (lambda () (pretty-print '(library (testfile-cwl-a5) (export fact) (import (rnrs)) (define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (for-each compile-library x))) '(quote ("testfile-cwl-b5" "testfile-cwl-c5"))) #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) "testfile-cwl-b5") "()\n") (error? ; attempting to re-install compile-time (or run-time) part of library (testfile-cwl-a5) (separate-eval '(let () (import (testfile-cwl-c5)) (import (testfile-cwl-b5)) (list (fib+fact 10) (ack+fact 3 4))))) (error? ; attempting to re-install compile-time (or run-time) part of library (testfile-cwl-a5) (separate-eval '(eval '(list (fib+fact 10) (ack+fact 3 4)) (environment '(chezscheme) '(testfile-cwl-c5) '(testfile-cwl-b5))))) (equal? (separate-eval '(eval '(list (fib+fact 10) (ack+fact 3 4)) (environment '(chezscheme) '(testfile-cwl-b5) '(testfile-cwl-c5)))) "(3628889 155)\n") (begin (with-output-to-file "testfile-cwl-d5.ss" (lambda () (pretty-print '(eval '(list (fib+fact 10) (ack+fact 3 4)) (environment '(chezscheme) '(testfile-cwl-c5) '(testfile-cwl-b5))))) 'replace) (separate-compile 'cwl-d5) #t) (error? ; attempting to re-install compile-time (or run-time) part of library (testfile-cwl-a5) (separate-eval '(load "testfile-cwl-d5.so"))) (begin (with-output-to-file "testfile-cwl-d5.ss" (lambda () (pretty-print '(eval '(list (fib+fact 10) (ack+fact 3 4)) (environment '(chezscheme) '(testfile-cwl-b5) '(testfile-cwl-c5))))) 'replace) (separate-compile 'cwl-d5) #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) "testfile-cwl-c5") "()\n") (delete-file "testfile-cwl-a5.ss") (delete-file "testfile-cwl-a5.so") (delete-file "testfile-cwl-a5.wpo") (error? ; attempting to re-install compile-time (or run-time) part of library (testfile-cwl-a5) (separate-eval '(let () (import (testfile-cwl-c5)) (import (testfile-cwl-b5)) (list (fib+fact 10) (ack+fact 3 4))))) (error? ; attempting to re-install compile-time (or run-time) part of library (testfile-cwl-a5) (separate-eval '(let () (import (testfile-cwl-b5)) (import (testfile-cwl-c5)) (list (fib+fact 10) (ack+fact 3 4))))) (begin (with-output-to-file "testfile-cwl-a6.ss" (lambda () (pretty-print '(library (testfile-cwl-a6) (export !) (import (chezscheme)) (define (! n) (if (= n 0) 1 (* n (! (- n 1)))))))) 'replace) (with-output-to-file "testfile-cwl-b6.ss" (lambda () (pretty-print '(library (testfile-cwl-b6) (export fib) (import (chezscheme)) (define (fib n) (if (or (= n 0) (= n 1)) 1 (+ (fib (- n 1)) (fib (- n 2)))))))) 'replace) (with-output-to-file "testfile-cwl-c6.ss" (lambda () (pretty-print '(library (testfile-cwl-c6) (export !fib) (import (chezscheme) (testfile-cwl-a6) (testfile-cwl-b6)) (define (!fib n) (! (fib n)))))) 'replace) (with-output-to-file "testfile-cwl-d6.ss" (lambda () (pretty-print '(library (testfile-cwl-d6) (export runit) (import (chezscheme) (testfile-cwl-c6)) (define (runit) (pretty-print (!fib 5))) (display "invoking d6\n")))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) "testfile-cwl-d6") #t) (delete-file "testfile-cwl-a6.wpo") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'cwl-d6) "((testfile-cwl-a6))\n") (begin (rename-file "testfile-cwl-a6.ss" "testfile-cwl-a6.ss.spam") (rename-file "testfile-cwl-b6.ss" "testfile-cwl-b6.ss.spam") (rename-file "testfile-cwl-c6.ss" "testfile-cwl-c6.ss.spam") (rename-file "testfile-cwl-d6.ss" "testfile-cwl-d6.ss.spam") #t) (delete-file "testfile-cwl-b6.so") (delete-file "testfile-cwl-b6.wpo") (delete-file "testfile-cwl-c6.so") (delete-file "testfile-cwl-c6.wpo") (delete-file "testfile-cwl-d6.wpo") (equal? (separate-eval '(begin (import (testfile-cwl-d6)) (runit))) "invoking d6\n40320\n") (delete-file "testfile-cwl-a6.so") (error? ; cannot find a6 (separate-eval '(begin (import (testfile-cwl-d6)) (runit)))) (delete-file "testfile-cwl-d6.so") (begin (rename-file "testfile-cwl-a6.ss.spam" "testfile-cwl-a6.ss") (rename-file "testfile-cwl-b6.ss.spam" "testfile-cwl-b6.ss") (rename-file "testfile-cwl-c6.ss.spam" "testfile-cwl-c6.ss") (rename-file "testfile-cwl-d6.ss.spam" "testfile-cwl-d6.ss") #t) (begin (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) "testfile-cwl-d6") #t) (delete-file "testfile-cwl-c6.wpo") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'cwl-d6) "((testfile-cwl-c6))\n") (delete-file "testfile-cwl-a6.so") (delete-file "testfile-cwl-a6.wpo") (delete-file "testfile-cwl-b6.so") (delete-file "testfile-cwl-b6.wpo") (delete-file "testfile-cwl-d6.wpo") (delete-file "testfile-cwl-a6.ss") (delete-file "testfile-cwl-b6.ss") (delete-file "testfile-cwl-c6.ss") (delete-file "testfile-cwl-d6.ss") (equal? (separate-eval '(begin (import (testfile-cwl-d6)) (runit))) "invoking d6\n40320\n") (delete-file "testfile-cwl-c6.so") (error? ; cannot find c6 (separate-eval '(begin (import (testfile-cwl-d6)) (runit)))) (begin (with-output-to-file "testfile-cwl-a7.ss" (lambda () (pretty-print '(library (testfile-cwl-a7) (export x) (import (chezscheme)) (define $x (make-parameter 1)) (define-syntax x (identifier-syntax ($x))) (printf "invoking a\n")))) 'replace) (with-output-to-file "testfile-cwl-b7.ss" (lambda () (pretty-print '(library (testfile-cwl-b7) (export z) (import (chezscheme) (testfile-cwl-c7)) (define $z (make-parameter (+ y 1))) (define-syntax z (identifier-syntax ($z))) (printf "invoking b\n")))) 'replace) (with-output-to-file "testfile-cwl-c7.ss" (lambda () (pretty-print '(library (testfile-cwl-c7) (export y) (import (chezscheme) (testfile-cwl-a7)) (define $y (make-parameter (+ x 1))) (define-syntax y (identifier-syntax ($y))) (printf "invoking c\n")))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) 'cwl-b7) #t) (delete-file "testfile-cwl-c7.wpo") (delete-file "testfile-cwl-c7.ss") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) "testfile-cwl-ab7.so"))) 'cwl-b7) "((testfile-cwl-c7))\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-a7)) '(write x) '(newline) '(import (testfile-cwl-b7)) '(write z) '(newline) '(import (testfile-cwl-c7)) '(write y) '(newline)) "invoking a\n1\ninvoking c\ninvoking b\n3\n2\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-a7)) '(write x) '(newline) '(import (testfile-cwl-c7)) '(write y) '(newline) '(import (testfile-cwl-b7)) '(write z) '(newline)) "invoking a\n1\ninvoking c\n2\ninvoking b\n3\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-a7)) '(write x) '(newline) '(import (testfile-cwl-c7)) '(write y) '(newline)) "invoking a\n1\ninvoking c\n2\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-b7)) '(write z) '(newline) '(import (testfile-cwl-c7)) '(write y) '(newline)) "invoking a\ninvoking c\ninvoking b\n3\n2\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-a7)) '(import (testfile-cwl-c7)) '(write y) '(newline)) "invoking a\ninvoking c\n2\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-b7)) '(import (testfile-cwl-c7)) '(write y) '(newline)) "invoking a\ninvoking c\n2\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-a7) (testfile-cwl-c7)) '(write y) '(newline)) "invoking a\ninvoking c\n2\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-c7) (testfile-cwl-b7)) '(write y) '(newline)) "invoking a\ninvoking c\n2\n") (equal? (separate-eval '(load "testfile-cwl-ab7.so") '(import (testfile-cwl-c7)) '(write y) '(newline)) "invoking a\ninvoking c\n2\n") (begin (with-output-to-file "testfile-cwl-a8.ss" (lambda () (pretty-print '(library (testfile-cwl-a8) (export x) (import (chezscheme)) (define x (gensym)) (printf "invoking a\n")))) 'replace) (with-output-to-file "testfile-cwl-b8.ss" (lambda () (pretty-print '(library (testfile-cwl-b8) (export z) (import (chezscheme) (testfile-cwl-c8)) (define z (cons 'b y)) (printf "invoking b\n")))) 'replace) (with-output-to-file "testfile-cwl-c8.ss" (lambda () (pretty-print '(library (testfile-cwl-c8) (export y) (import (chezscheme) (testfile-cwl-a8)) (define y (cons 'c x)) (printf "invoking c\n")))) 'replace) (with-output-to-file "testfile-cwl-d8.ss" (lambda () (pretty-print '(library (testfile-cwl-d8) (export runit) (import (chezscheme) (testfile-cwl-c8) (testfile-cwl-a8) (testfile-cwl-b8)) (define (runit yes?) (pretty-print (eq? (cdr y) x)) (pretty-print (eq? (cdr z) y)) (pretty-print (and (eq? (car y) 'c) (eq? (car z) 'b))) (when yes? (eq? (eval 'x (environment '(testfile-cwl-a8))) x)))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) 'cwl-d8) #t) (equal? (separate-eval '(begin (import (testfile-cwl-d8)) (runit #f))) "invoking a\ninvoking c\ninvoking b\n#t\n#t\n#t\n") (equal? (separate-eval '(begin (import (testfile-cwl-d8)) (runit #t))) "invoking a\ninvoking c\ninvoking b\n#t\n#t\n#t\n#t\n") (delete-file "testfile-cwl-c8.ss") (delete-file "testfile-cwl-c8.wpo") (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'cwl-d8) "((testfile-cwl-c8))\n") (equal? (separate-eval '(begin (import (testfile-cwl-d8)) (runit #f))) "invoking a\ninvoking c\ninvoking b\n#t\n#t\n#t\n") (equal? (separate-eval '(begin (import (testfile-cwl-d8)) (runit #t))) "invoking a\ninvoking c\ninvoking b\n#t\n#t\n#t\n#t\n") (begin (with-output-to-file "testfile-cwl-a9.ss" (lambda () (pretty-print '(eval-when (visit) (library (testfile-cwl-a9) (export x) (import (chezscheme)) (define x 5))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) 'cwl-a9) #t) (error? ; found visit-only run-time library (testfile-cwl-a9) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'cwl-a9)) (begin (with-output-to-file "testfile-cwl-a10.ss" (lambda () (pretty-print '(library (testfile-cwl-a10) (export f x) (import (chezscheme) (testfile-cwl-b10)) (define f (lambda (x) (* x 17))) (define x 5)))) 'replace) (with-output-to-file "testfile-cwl-b10.ss" (lambda () (pretty-print '(library (testfile-cwl-b10) (export g y) (import (chezscheme)) (define g (lambda (x) (+ x 23))) (define y 37)))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) 'cwl-a10) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'cwl-a10) #t) (delete-file "testfile-cwl-a10.ss") (delete-file "testfile-cwl-a10.wpo") (delete-file "testfile-cwl-b10.ss") (delete-file "testfile-cwl-b10.so") (delete-file "testfile-cwl-b10.wpo") (test-cp0-expansion `(let () (import (testfile-cwl-a10) (testfile-cwl-b10)) (+ (f (g y)) x)) `(begin (#3%$invoke-library '(testfile-cwl-b10) '() ',gensym?) (#3%$invoke-library '(testfile-cwl-a10) '() ',gensym?) 1025)) (begin (with-output-to-file "testfile-cwl-a11.ss" (lambda () (pretty-print '(library (testfile-cwl-a11) (export f x) (import (chezscheme) (testfile-cwl-b11)) (define f (lambda (x) (* x 17))) (define x 5)))) 'replace) (with-output-to-file "testfile-cwl-b11.ss" (lambda () (pretty-print '(library (testfile-cwl-b11) (export g y) (import (chezscheme)) (define g (lambda (x) (+ x 23))) (define y 37)))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) 'cwl-a11) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t] [run-cp0 (lambda (cp0 x) x)]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'cwl-a11) #t) (delete-file "testfile-cwl-a11.ss") (delete-file "testfile-cwl-a11.wpo") (delete-file "testfile-cwl-b11.ss") (delete-file "testfile-cwl-b11.so") (delete-file "testfile-cwl-b11.wpo") (test-cp0-expansion `(let () (import (testfile-cwl-a11) (testfile-cwl-b11)) (+ (f (g y)) x)) `(begin (#3%$invoke-library '(testfile-cwl-b11) '() ',gensym?) (#3%$invoke-library '(testfile-cwl-a11) '() ',gensym?) ,(lambda (x) (not (eqv? x 1025))))) (begin (delete-file "testfile-cwl-a12.so") (delete-file "testfile-cwl-a12.wpo") (delete-file "testfile-cwl-b12.so") (delete-file "testfile-cwl-b12.wpo") (with-output-to-file "testfile-cwl-a12.ss" (lambda () (pretty-print '(library (testfile-cwl-a12) (export f) (import (chezscheme)) (define f (lambda (x) (* x 17)))))) 'replace) (with-output-to-file "testfile-cwl-b12.ss" (lambda () (pretty-print '(library (testfile-cwl-b12) (export g f) (import (chezscheme) (testfile-cwl-a12)) (define g (lambda (x) (+ x 23)))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) 'cwl-b12) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'cwl-b12) #t) (equal? (separate-eval '(let () (import (testfile-cwl-b12)) (list (f 3) (g 5)))) "(51 28)\n") (begin (delete-file "testfile-cwl-a13.so") (delete-file "testfile-cwl-a13.wpo") (delete-file "testfile-cwl-b13.so") (delete-file "testfile-cwl-b13.wpo") (delete-file "testfile-cwl-c13.so") (delete-file "testfile-cwl-c13.wpo") (with-output-to-file "testfile-cwl-a13.ss" (lambda () (pretty-print '(library (testfile-cwl-a13) (export a) (import (chezscheme)) (define-syntax a (identifier-syntax f)) (define f (lambda (x) (* x 17)))))) 'replace) (with-output-to-file "testfile-cwl-b13.ss" (lambda () (pretty-print '(library (testfile-cwl-b13) (export g a) (import (chezscheme) (testfile-cwl-a13)) (define g (lambda (x) (a x)))))) 'replace) (with-output-to-file "testfile-cwl-c13.ss" (lambda () (for-each pretty-print '((import (chezscheme) (testfile-cwl-b13)) (pretty-print (list (g 3) (a 5) (eval '(a 7) (environment '(testfile-cwl-a13)))))))) 'replace) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-library x))) 'cwl-a13) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #f]) (compile-library x))) 'cwl-b13) (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-program x))) 'cwl-c13) (separate-compile '(lambda (x) (compile-whole-program (format "~a.wpo" x) (format "~a.so" x))) 'cwl-c13) #t) (equal? (separate-eval '(load-program "testfile-cwl-c13.so")) "(51 85 119)\n") (begin (with-output-to-file "testfile-wpo-extlib-1.chezscheme.sls" (lambda () (pretty-print '(library (testfile-wpo-extlib-1) (export magic) (import (rnrs)) (define magic (cons 9 5))))) 'replace) (with-output-to-file "testfile-wpo-extlib-2.ss" (lambda () (pretty-print '(library (testfile-wpo-extlib-2) (export p) (import (chezscheme) (testfile-wpo-extlib)) (define p (lambda () (pretty-print magic)))))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-library x))) 'wpo-extlib-2) #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #t]) (compile-whole-library (format "~a.wpo" x) (format "~a-all.so" x)))) 'wpo-extlib-2) "()\n") (equal? (separate-eval '(let () (import (testfile-wpo-extlib-2)) (p))) "(9 . 5)\n") ;; regression tests from @owaddell generated to fix problems he encountered ;; with compile-whole-library from a test generator. (begin (with-output-to-file "testfile-wpo-coconut.ss" (lambda () (pretty-print '(library (testfile-wpo-coconut) (export coconut apple->coconut) (import (scheme)) (define $init (list '_)) (define apple->coconut (cons 'apple->coconut $init)) (define coconut (list 'coconut apple->coconut $init))))) 'replace) (with-output-to-file "testfile-wpo-banana.ss" (lambda () (pretty-print '(library (testfile-wpo-banana) (export banana apple->banana) (import (scheme)) (define $init (list '_)) (define apple->banana (cons 'apple->banana $init)) (define banana (list 'banana apple->banana $init))))) 'replace) (with-output-to-file "testfile-wpo-apple.ss" (lambda () (pretty-print '(library (testfile-wpo-apple) (export apple) (import (scheme) (testfile-wpo-banana) (testfile-wpo-coconut)) (define $init (list '_ (cons 'apple->banana apple->banana) (cons 'apple->coconut apple->coconut))) (define apple (list 'apple $init))))) 'replace) (with-output-to-file "testfile-wpo-main.ss" (lambda () (pretty-print '(import (scheme) (testfile-wpo-banana) (testfile-wpo-coconut) (testfile-wpo-apple))) (pretty-print '(pretty-print banana)) (pretty-print '(pretty-print coconut)) (pretty-print '(pretty-print apple))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) 'wpo-main) #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #f]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-coconut) "()\n") (begin (delete-file "testfile-wpo-coconut.wpo") #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #f]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-apple) "((testfile-wpo-coconut))\n") (begin (delete-file "testfile-wpo-banana.wpo") (delete-file "testfile-wpo-apple.wpo") (delete-file "testfile-wpo-banana.so") #t) (equal? (separate-compile '(lambda (x) (parameterize ([library-search-handler (let ([lsh (library-search-handler)]) (lambda (who name dirs exts) (lsh who (if (equal? name '(testfile-wpo-banana)) '(testfile-wpo-apple) name) dirs exts)))]) (compile-whole-program (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-main) "((testfile-wpo-apple)\n (testfile-wpo-banana)\n (testfile-wpo-coconut))\n") (equal? (separate-eval '(parameterize ([library-search-handler (let ([lsh (library-search-handler)]) (lambda (who name dirs exts) (lsh who (if (equal? name '(testfile-wpo-banana)) '(testfile-wpo-apple) name) dirs exts)))]) (load-program "testfile-wpo-main.so"))) (string-append "(banana (apple->banana _) (_))\n" "(coconut (apple->coconut _) (_))\n" "(apple\n (_ (apple->banana apple->banana _)\n (apple->coconut apple->coconut _)))\n")) (begin ;; clean-up to make sure previous builds don't get in the way. (delete-file "testfile-wpo-coconut.ss") (delete-file "testfile-wpo-coconut.so") (delete-file "testfile-wpo-coconut.wpo") (delete-file "testfile-wpo-banana.ss") (delete-file "testfile-wpo-banana.so") (delete-file "testfile-wpo-banana.wpo") (delete-file "testfile-wpo-apple.ss") (delete-file "testfile-wpo-apple.so") (delete-file "testfile-wpo-apple.wpo") (delete-file "testfile-wpo-main.ss") (delete-file "testfile-wpo-main.so") (delete-file "testfile-wpo-main.wpo") #t) (begin (with-output-to-file "testfile-wpo-coconut.ss" (lambda () (pretty-print '(library (testfile-wpo-coconut) (export coconut banana->coconut apple->coconut) (import (scheme)) (define $init (list '_)) (define banana->coconut (cons 'banana->coconut $init)) (define apple->coconut (cons 'apple->coconut $init)) (define coconut (list 'coconut banana->coconut apple->coconut $init))))) 'replace) (with-output-to-file "testfile-wpo-date.ss" (lambda () (pretty-print '(library (testfile-wpo-date) (export date apple->date) (import (scheme)) (define $init (list '_)) (define apple->date (cons 'apple->date $init)) (define date (list 'date apple->date $init))))) 'replace) (with-output-to-file "testfile-wpo-apple.ss" (lambda () (pretty-print '(library (testfile-wpo-apple) (export apple) (import (scheme) (testfile-wpo-date) (testfile-wpo-coconut)) (define $init (list '_ (cons 'apple->date apple->date) (cons 'apple->coconut apple->coconut))) (define apple (list 'apple $init))))) 'replace) (with-output-to-file "testfile-wpo-banana.ss" (lambda () (pretty-print '(library (testfile-wpo-banana) (export banana) (import (scheme) (testfile-wpo-coconut)) (define $init (list '_ (cons 'banana->coconut banana->coconut))) (define banana (list 'banana $init))))) 'replace) (with-output-to-file "testfile-wpo-main.ss" (lambda () (pretty-print '(import (scheme) (testfile-wpo-date) (testfile-wpo-banana) (testfile-wpo-coconut) (testfile-wpo-apple))) (pretty-print '(pretty-print date)) (pretty-print '(pretty-print banana)) (pretty-print '(pretty-print coconut)) (pretty-print '(pretty-print apple))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) 'wpo-main) #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #f]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-coconut) "()\n") (begin (delete-file "testfile-wpo-coconut.wpo") #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #f]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-apple) "((testfile-wpo-coconut))\n") (begin (delete-file "testfile-wpo-date.wpo") (delete-file "testfile-wpo-apple.wpo") (delete-file "testfile-wpo-date.so") #t) (equal? (separate-compile '(lambda (x) (parameterize ([library-search-handler (let ([lsh (library-search-handler)]) (lambda (who name dirs exts) (lsh who (if (equal? name '(testfile-wpo-date)) '(testfile-wpo-apple) name) dirs exts)))]) (compile-whole-program (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-main) "((testfile-wpo-apple)\n (testfile-wpo-date)\n (testfile-wpo-coconut))\n") (equal? (separate-eval '(parameterize ([library-search-handler (let ([lsh (library-search-handler)]) (lambda (who name dirs exts) (lsh who (if (equal? name '(testfile-wpo-date)) '(testfile-wpo-apple) name) dirs exts)))]) (load-program "testfile-wpo-main.so"))) (string-append "(date (apple->date _) (_))\n" "(banana (_ (banana->coconut banana->coconut _)))\n" "(coconut (banana->coconut _) (apple->coconut _) (_))\n" "(apple\n" " (_ (apple->date apple->date _)\n" " (apple->coconut apple->coconut _)))\n")) (begin ;; clean-up to make sure previous builds don't get in the way. (delete-file "testfile-wpo-coconut.ss") (delete-file "testfile-wpo-coconut.so") (delete-file "testfile-wpo-coconut.wpo") (delete-file "testfile-wpo-date.ss") (delete-file "testfile-wpo-date.so") (delete-file "testfile-wpo-date.wpo") (delete-file "testfile-wpo-banana.ss") (delete-file "testfile-wpo-banana.so") (delete-file "testfile-wpo-banana.wpo") (delete-file "testfile-wpo-apple.ss") (delete-file "testfile-wpo-apple.so") (delete-file "testfile-wpo-apple.wpo") (delete-file "testfile-wpo-main.ss") (delete-file "testfile-wpo-main.so") (delete-file "testfile-wpo-main.wpo") #t) (begin (with-output-to-file "testfile-wpo-date.ss" (lambda () (pretty-print '(library (testfile-wpo-date) (export date apple->date) (import (scheme)) (define $init (list '_)) (define apple->date (cons 'apple->date $init)) (define date (list 'date apple->date $init))))) 'replace) (with-output-to-file "testfile-wpo-eel.ss" (lambda () (pretty-print '(library (testfile-wpo-eel) (export eel coconut->eel apple->eel) (import (scheme)) (define $init (list '_)) (define coconut->eel (cons 'coconut->eel $init)) (define apple->eel (cons 'apple->eel $init)) (define eel (list 'eel coconut->eel apple->eel $init))))) 'replace) (with-output-to-file "testfile-wpo-coconut.ss" (lambda () (pretty-print '(library (testfile-wpo-coconut) (export coconut banana->coconut apple->coconut) (import (scheme) (testfile-wpo-eel)) (define $init (list '_ (cons 'coconut->eel coconut->eel))) (define banana->coconut (cons 'banana->coconut $init)) (define apple->coconut (cons 'apple->coconut $init)) (define coconut (list 'coconut banana->coconut apple->coconut $init))))) 'replace) (with-output-to-file "testfile-wpo-apple.ss" (lambda () (pretty-print '(library (testfile-wpo-apple) (export apple) (import (scheme) (testfile-wpo-date) (testfile-wpo-coconut) (testfile-wpo-eel)) (define $init (list '_ (cons 'apple->date apple->date) (cons 'apple->coconut apple->coconut) (cons 'apple->eel apple->eel))) (define apple (list 'apple $init))))) 'replace) (with-output-to-file "testfile-wpo-banana.ss" (lambda () (pretty-print '(library (testfile-wpo-banana) (export banana) (import (scheme) (testfile-wpo-coconut)) (define $init (list '_ (cons 'banana->coconut banana->coconut))) (define banana (list 'banana $init))))) 'replace) (with-output-to-file "testfile-wpo-main.ss" (lambda () (pretty-print '(import (scheme) (testfile-wpo-date) (testfile-wpo-banana) (testfile-wpo-coconut) (testfile-wpo-apple) (testfile-wpo-eel))) (pretty-print '(pretty-print date)) (pretty-print '(pretty-print banana)) (pretty-print '(pretty-print coconut)) (pretty-print '(pretty-print apple)) (pretty-print '(pretty-print eel))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) 'wpo-main) #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #f]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-coconut) "()\n") (begin (delete-file "testfile-wpo-eel.wpo") (delete-file "testfile-wpo-coconut.wpo") (delete-file "testfile-wpo-eel.so") #t) (equal? (separate-compile '(lambda (x) (parameterize ([generate-wpo-files #f] [library-search-handler (let ([lsh (library-search-handler)]) (lambda (who name dirs exts) (lsh who (if (equal? name '(testfile-wpo-eel)) '(testfile-wpo-coconut) name) dirs exts)))]) (compile-whole-library (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-apple) "((testfile-wpo-coconut) (testfile-wpo-eel))\n") (begin (delete-file "testfile-wpo-date.wpo") (delete-file "testfile-wpo-apple.wpo") (delete-file "testfile-wpo-date.so") #t) (equal? (separate-compile '(lambda (x) (parameterize ([library-search-handler (let ([lsh (library-search-handler)]) (lambda (who name dirs exts) (lsh who (cond [(equal? name '(testfile-wpo-date)) '(testfile-wpo-apple)] [(equal? name '(testfile-wpo-eel)) '(testfile-wpo-coconut)] [else name]) dirs exts)))]) (compile-whole-program (format "~a.wpo" x) (format "~a.so" x)))) 'wpo-main) "((testfile-wpo-apple)\n (testfile-wpo-date)\n (testfile-wpo-coconut)\n (testfile-wpo-eel))\n") (equal? (separate-eval '(parameterize ([library-search-handler (let ([lsh (library-search-handler)]) (lambda (who name dirs exts) (lsh who (cond [(equal? name '(testfile-wpo-date)) '(testfile-wpo-apple)] [(equal? name '(testfile-wpo-eel)) '(testfile-wpo-coconut)] [else name]) dirs exts)))]) (load-program "testfile-wpo-main.so"))) (string-append "(date (apple->date _) (_))\n" "(banana\n" " (_ (banana->coconut\n" " banana->coconut\n" " _\n" " (coconut->eel coconut->eel _))))\n" "(coconut\n" " (banana->coconut _ (coconut->eel coconut->eel _))\n" " (apple->coconut _ (coconut->eel coconut->eel _))\n" " (_ (coconut->eel coconut->eel _)))\n" "(apple\n" " (_ (apple->date apple->date _)\n" " (apple->coconut\n" " apple->coconut\n" " _\n" " (coconut->eel coconut->eel _))\n" " (apple->eel apple->eel _)))\n" "(eel (coconut->eel _) (apple->eel _) (_))\n")) (begin ;; clean-up to make sure previous builds don't get in the way. (delete-file "testfile-wpo-coconut.ss") (delete-file "testfile-wpo-coconut.so") (delete-file "testfile-wpo-coconut.wpo") (delete-file "testfile-wpo-eel.ss") (delete-file "testfile-wpo-eel.so") (delete-file "testfile-wpo-eel.wpo") (delete-file "testfile-wpo-date.ss") (delete-file "testfile-wpo-date.so") (delete-file "testfile-wpo-date.wpo") (delete-file "testfile-wpo-banana.ss") (delete-file "testfile-wpo-banana.so") (delete-file "testfile-wpo-banana.wpo") (delete-file "testfile-wpo-apple.ss") (delete-file "testfile-wpo-apple.so") (delete-file "testfile-wpo-apple.wpo") (delete-file "testfile-wpo-main.ss") (delete-file "testfile-wpo-main.so") (delete-file "testfile-wpo-main.wpo") #t) (begin (with-output-to-file "testfile-deja-vu-one.ss" (lambda () (pretty-print '(library (testfile-deja-vu-one) (export a) (import (scheme)) (define a 3)))) 'replace) (with-output-to-file "testfile-deja-vu-two.ss" (lambda () (pretty-print '(library (testfile-deja-vu-two) (export b) (import (scheme) (testfile-deja-vu-one)) (define b (list 'b a))))) 'replace) (with-output-to-file "testfile-deja-vu-dup.ss" (lambda () (pretty-print '(library (testfile-deja-vu-dup) (export d) (import (scheme) (testfile-deja-vu-one)) (define d (list a 'd))))) 'replace) (with-output-to-file "testfile-deja-vu-main.ss" (lambda () (for-each pretty-print '((import (scheme) (testfile-deja-vu-one) (testfile-deja-vu-two) (testfile-deja-vu-dup)) (pretty-print (list a b d))))) 'replace) (separate-eval '(parameterize ([generate-wpo-files #t]) (compile-library "testfile-deja-vu-one") (compile-library "testfile-deja-vu-two") (compile-library "testfile-deja-vu-dup") (compile-program "testfile-deja-vu-main") (compile-whole-library "testfile-deja-vu-one.wpo" "testfile-deja-vu-one.done") (compile-whole-library "testfile-deja-vu-two.wpo" "testfile-deja-vu-two.done") (compile-whole-library "testfile-deja-vu-dup.wpo" "testfile-deja-vu-dup.done"))) #t) (error? (separate-eval '(compile-whole-program "testfile-deja-vu-main.wpo" "testfile-deja-vu-main.done"))) (begin (do ([stem '("one" "two" "dup" "main") (cdr stem)]) ((null? stem)) (do ([ext '("ss" "so" "wpo" "done") (cdr ext)]) ((null? ext)) (delete-file (format "testfile-deja-vu-~a.~a" (car stem) (car ext))))) #t) ; verify compatibility of generate-covin-files and generate-wpo-files (begin (mkfile "testfile-cwl-a14.ss" '(library (testfile-cwl-a14) (export a) (import (scheme)) (define a 123))) (parameterize ([generate-covin-files #t] [generate-wpo-files #t]) (compile-library "testfile-cwl-a14") (compile-whole-library "testfile-cwl-a14.wpo" "testfile-cwl-a14.library")) #t) (file-exists? "testfile-cwl-a14.covin") (eqv? (let () (import (testfile-cwl-a14)) a) 123) (eqv? (separate-eval '(verify-loadability 'load "testfile-cwl-a14.library")) "") ) (mat maybe-compile-whole (begin (delete-file "testfile-mcw-a1.so") (delete-file "testfile-mcw-a1.wpo") (delete-file "testfile-mcw-b1.so") (delete-file "testfile-mcw-b1.wpo") (delete-file "testfile-mcw-c1.so") (delete-file "testfile-mcw-c1.wpo") (with-output-to-file "testfile-mcw-ha1.ss" (lambda () (pretty-print '(define minor-msg-number 97))) 'replace) (with-output-to-file "testfile-mcw-hb1.ss" (lambda () (pretty-print '(define major-msg-number 113))) 'replace) (with-output-to-file "testfile-mcw-a1.ss" (lambda () (pretty-print '(library (testfile-mcw-a1) (export a) (import (chezscheme)) (define a "hello from a")))) 'replace) (with-output-to-file "testfile-mcw-b1.ss" (lambda () (pretty-print '(library (testfile-mcw-b1) (export b) (import (chezscheme) (testfile-mcw-a1)) (include "testfile-mcw-ha1.ss") (define b (lambda () (format "~a and b [~s]" a minor-msg-number)))))) 'replace) (with-output-to-file "testfile-mcw-c1.ss" (lambda () (for-each pretty-print '((import (chezscheme) (testfile-mcw-b1)) (include "testfile-mcw-hb1.ss") (printf "~a and c [~s]\n" (b) major-msg-number)))) 'replace) (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program x))) 'mcw-c1) #t) (equal? (separate-eval '(load-program "testfile-mcw-c1.so")) "hello from a and b [97] and c [113]\n") (begin (with-output-to-file "testfile-mcw-a1.ss" (lambda () (pretty-print '(library (testfile-mcw-a1) (export a) (import (chezscheme)) (define a "greetings from a")))) 'replace) (touch "testfile-mcw-a1.so" "testfile-mcw-a1.ss") (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (maybe-compile-program x))) 'mcw-c1) #t) (equal? (separate-eval '(load-program "testfile-mcw-c1.so")) "greetings from a and b [97] and c [113]\n") (begin (separate-compile '(lambda (x) (compile-whole-program (format "~a.wpo" x) (format "~a.so" x)) #f) 'mcw-c1) #t) (equal? (separate-eval '(load-program "testfile-mcw-c1.so")) "greetings from a and b [97] and c [113]\n") (begin (with-output-to-file "testfile-mcw-a1.ss" (lambda () (pretty-print '(library (testfile-mcw-a1) (export a) (import (chezscheme)) (define a "salutations from a")))) 'replace) (touch "testfile-mcw-a1.so" "testfile-mcw-a1.ss") (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (parameterize ([compile-program-handler (lambda (ifn ofn) (compile-program ifn ofn) (compile-whole-program (format "~a.wpo" (path-root ofn)) ofn #t))]) (maybe-compile-program x)))) 'mcw-c1) #t) (equal? (separate-eval '(load-program "testfile-mcw-c1.so")) "salutations from a and b [97] and c [113]\n") (begin (with-output-to-file "testfile-mcw-a1.ss" (lambda () (pretty-print '(library (testfile-mcw-a1) (export a) (import (chezscheme)) (define a "goodbye from a")))) 'replace) (touch "testfile-mcw-a1.so" "testfile-mcw-a1.ss") (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (parameterize ([compile-program-handler (lambda (ifn ofn) (compile-program ifn ofn) (compile-whole-program (format "~a.wpo" (path-root ofn)) ofn #t))]) (maybe-compile-program x)))) 'mcw-c1) #t) (equal? (separate-eval '(load-program "testfile-mcw-c1.so")) "goodbye from a and b [97] and c [113]\n") (begin (with-output-to-file "testfile-mcw-hb1.ss" (lambda () (pretty-print '(define major-msg-number 773))) 'replace) (touch "testfile-mcw-c1.so" "testfile-mcw-hb1.ss") (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (parameterize ([compile-program-handler (lambda (ifn ofn) (compile-program ifn ofn) (compile-whole-program (format "~a.wpo" (path-root ofn)) ofn #t))]) (maybe-compile-program x)))) 'mcw-c1) #t) (equal? (separate-eval '(load-program "testfile-mcw-c1.so")) "goodbye from a and b [97] and c [773]\n") (begin (with-output-to-file "testfile-mcw-a1.ss" (lambda () (pretty-print '(library (testfile-mcw-a1) (export a) (import (chezscheme)) (define a "hello again from a")))) 'replace) (touch "testfile-mcw-a1.so" "testfile-mcw-a1.ss") (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (parameterize ([compile-library-handler (lambda (ifn ofn) (compile-library ifn ofn) (compile-whole-library (format "~a.wpo" (path-root ofn)) ofn))]) (maybe-compile-library x)))) 'mcw-b1) #t) (equal? (separate-eval '(let () (import (testfile-mcw-b1)) (printf "~a\n" (b)))) "hello again from a and b [97]\n") (begin (with-output-to-file "testfile-mcw-ha1.ss" (lambda () (pretty-print '(define minor-msg-number -53))) 'replace) (touch "testfile-mcw-a1.so" "testfile-mcw-a1.ss") (separate-compile '(lambda (x) (parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (parameterize ([compile-library-handler (lambda (ifn ofn) (compile-library ifn ofn) (compile-whole-library (format "~a.wpo" (path-root ofn)) ofn))]) (maybe-compile-library x)))) 'mcw-b1) #t) (equal? (separate-eval '(let () (import (testfile-mcw-b1)) (printf "~a\n" (b)))) "hello again from a and b [-53]\n") ) (mat library-manager (begin (with-output-to-file "testfile-lm-a.ss" (lambda () (pretty-print '(library (testfile-lm-a) (export ct-a rt-a) (import (scheme)) (meta define ct-a (begin (display "ct-a rhs\n") 123)) (define rt-a (begin (display "rt-a rhs\n") 456))))) 'replace) (with-output-to-file "testfile-lm-b.ss" (lambda () (pretty-print '(library (testfile-lm-b) (export b) (import (scheme) (testfile-lm-a)) (define-syntax (use-ct-val x) (if (odd? ct-a) #'"odd" #'"even")) (define b use-ct-val)))) 'replace) (with-output-to-file "testfile-lm-c.ss" (lambda () (pretty-print '(library (testfile-lm-c) (export c) (import (scheme) (testfile-lm-a)) (define use-rt-val rt-a) (define c use-rt-val)))) 'replace) (with-output-to-file "testfile-lm-combined.ss" (lambda () (pretty-print '(begin (include "testfile-lm-a.ss") (include "testfile-lm-b.ss") (include "testfile-lm-c.ss")))) 'replace) (with-output-to-file "testfile-lm-use-b.ss" (lambda () (pretty-print '(library (testfile-lm-use-b) (export x) (import (scheme) (testfile-lm-b)) (meta define x b)))) 'replace) (with-output-to-file "testfile-lm-use-c.ss" (lambda () (pretty-print '(library (testfile-lm-use-c) (export x) (import (scheme) (testfile-lm-c)) (define-syntax (x x) c)))) 'replace) #t) (equal? (separate-eval '(import-notify #t) '(compile-library "testfile-lm-a")) (string-append "compiling testfile-lm-a.ss with output to testfile-lm-a.so\n" "ct-a rhs\n")) (equal? (separate-eval '(import-notify #t) '(library-extensions '((".ss" . ".so"))) '(compile-library "testfile-lm-b") '(printf "b = ~s\n" (let () (import (testfile-lm-b)) b))) (string-append "compiling testfile-lm-b.ss with output to testfile-lm-b.so\n" "import: found source file \"testfile-lm-a.ss\"\n" "import: found corresponding object file \"testfile-lm-a.so\"\n" "import: object file is not older\n" "import: visiting object file \"testfile-lm-a.so\"\n" "ct-a rhs\n" "b = \"odd\"\n")) (equal? (separate-eval '(import-notify #t) '(library-extensions '((".ss" . ".so"))) '(compile-library "testfile-lm-c") '(printf "c = ~s\n" (let () (import (testfile-lm-c)) c))) (string-append "compiling testfile-lm-c.ss with output to testfile-lm-c.so\n" "import: found source file \"testfile-lm-a.ss\"\n" "import: found corresponding object file \"testfile-lm-a.so\"\n" "import: object file is not older\n" "import: visiting object file \"testfile-lm-a.so\"\n" "attempting to 'revisit' previously 'visited' \"testfile-lm-a.so\" for library (testfile-lm-a) run-time info\n" "rt-a rhs\n" "c = 456\n")) (equal? ;; library manager revisits object file containing a single library ;; to resolve dependencies after earlier visit (separate-eval '(import-notify #t) '(library-extensions '((".ss" . ".so"))) '(visit "testfile-lm-a.so") '(let () (import (testfile-lm-c)) c)) (string-append "import: found source file \"testfile-lm-c.ss\"\n" "import: found corresponding object file \"testfile-lm-c.so\"\n" "import: object file is not older\n" "import: visiting object file \"testfile-lm-c.so\"\n" "import: attempting to 'revisit' previously 'visited' \"testfile-lm-c.so\" for library (testfile-lm-c) run-time info\n" "import: attempting to 'revisit' previously 'visited' \"testfile-lm-a.so\" for library (testfile-lm-a) run-time info\n" "rt-a rhs\n" "456\n")) (equal? ;; library manager visits object file containing a single library ;; to resolve dependencies after earlier revisit (separate-eval '(import-notify #t) '(library-extensions '((".ss" . ".so"))) '(revisit "testfile-lm-a.so") '(let () (import (testfile-lm-b)) b)) (string-append "import: found source file \"testfile-lm-b.ss\"\n" "import: found corresponding object file \"testfile-lm-b.so\"\n" "import: object file is not older\n" "import: visiting object file \"testfile-lm-b.so\"\n" "import: attempting to 'visit' previously 'revisited' \"testfile-lm-a.so\" for library (testfile-lm-a) compile-time info\n" "import: attempting to 'revisit' previously 'visited' \"testfile-lm-b.so\" for library (testfile-lm-b) run-time info\n" "\"odd\"\n")) (equal? (separate-eval '(import-notify #t) '(library-extensions '((".ss" . ".so"))) '(compile-file "testfile-lm-combined")) (string-append "compiling testfile-lm-combined.ss with output to testfile-lm-combined.so\n" "ct-a rhs\n")) (equal? ;; library manager revisits object file containing related libraries ;; to resolve dependencies after earlier visit (separate-eval '(import-notify #t) '(visit "testfile-lm-combined.so") '(let () (import (testfile-lm-a)) (define-syntax (foo x) ct-a) (printf "foo = ~s\n" foo)) '(let () (import (testfile-lm-c)) c)) (string-append "ct-a rhs\n" "foo = 123\n" "import: attempting to 'revisit' previously 'visited' \"testfile-lm-combined.so\" for library (testfile-lm-c) run-time info\n" "rt-a rhs\n" "456\n")) (equal? ;; library manager visits object file containing related libraries ;; to resolve dependencies after earlier revisit (separate-eval '(import-notify #t) '(revisit "testfile-lm-combined.so") '(let () (import (testfile-lm-a)) (define foo rt-a) (printf "foo = ~s\n" foo)) '(let () (import (testfile-lm-b)) b)) (string-append "import: attempting to 'visit' previously 'revisited' \"testfile-lm-combined.so\" for library (testfile-lm-a) compile-time info\n" "rt-a rhs\n" "foo = 456\n" "\"odd\"\n")) (equal? ;; library manager does not revisit due to earlier load (separate-eval '(import-notify #t) '(load "testfile-lm-combined.so") '(let () (import (testfile-lm-a)) (define-syntax (foo x) ct-a) (printf "foo = ~s\n" foo)) '(let () (import (testfile-lm-c)) c)) (string-append "ct-a rhs\n" "foo = 123\n" "rt-a rhs\n" "456\n")) (equal? ;; library manager does not revisit due to earlier load (separate-eval '(import-notify #t) '(load "testfile-lm-combined.so") '(let () (import (testfile-lm-a)) (define foo rt-a) (printf "foo = ~s\n" foo)) '(let () (import (testfile-lm-b)) b)) (string-append "rt-a rhs\n" "foo = 456\n" "\"odd\"\n")) ) (mat verify-loadability (error? ; invalid argument (verify-loadability 'never)) (error? ; invalid argument (verify-loadability 'never "hello.so")) (error? ; invalid argument (verify-loadability #f "hello.so" "goodbye.so")) (error? ; invalid argument (verify-loadability 'load 'hello)) (error? ; invalid argument (verify-loadability 'load '(a . "testdir"))) (error? ; invalid argument (verify-loadability 'load '#("a" "testdir"))) (error? ; invalid argument (verify-loadability 'load "testfile1.so" "testfile2.so" 'hello)) (error? ; invalid argument (verify-loadability 'load "testfile1.so" "testfile2.so" '(a . "testdir"))) (error? ; invalid argument (verify-loadability 'load '("a" . hello))) (error? ; invalid argument (verify-loadability 'load '("a" . ("src" . "obj")))) (error? ; invalid argument (verify-loadability 'load '("a" . (("src" "obj"))))) (error? ; invalid argument (verify-loadability 'load '("a" . ((("src" "obj")))))) (begin (define install (lambda (dir . fn*) (for-each (lambda (fn) (call-with-port (open-file-input-port fn) (lambda (ip) (call-with-port (open-file-output-port (format "~a/~a" dir (path-last fn))) (lambda (op) (put-bytevector op (get-bytevector-all ip))))))) fn*))) #t) (eq? (verify-loadability 'visit) (void)) (eq? (verify-loadability 'revisit) (void)) (eq? (verify-loadability 'load) (void)) (error? ; not found (verify-loadability 'load "probably not found")) (begin (mkfile "testfile-clA.ss" '(import (chezscheme) (testfile-clB) (testfile-clC)) '(printf "~a, ~a\n" b c)) (mkfile "testfile-clB.ss" '(library (testfile-clB) (export b) (import (chezscheme) (testfile-clB1)) (define-syntax go (lambda (x) (datum->syntax #'* (b1)))) (define b (go)))) (mkfile "testfile-clB1.ss" '(library (testfile-clB1) (export b1) (import (chezscheme)) (define b1 (lambda () "hello from B1")))) (mkfile "testfile-clC.ss" '(library (testfile-clC) (export c) (import (chezscheme) (testfile-clC1)) (define c (c1)))) (mkfile "testfile-clC1.ss" '(library (testfile-clC1) (export c1) (import (chezscheme)) (define-syntax c1 (syntax-rules () [(_) "hello from C1"])))) (rm-rf "testdir-obj1") (rm-rf "testdir-obj2") (mkdir "testdir-obj1") (mkdir "testdir-obj2") (separate-eval '(parameterize ([library-directories '(("." . "testdir-obj1"))] [compile-imported-libraries #t]) (compile-program "testfile-clA.ss" "testdir-obj1/testfile-clA.so"))) (separate-eval '(parameterize ([library-directories '(("." . "testdir-obj2"))] [compile-imported-libraries #t]) (compile-program "testfile-clA.ss" "testdir-obj2/testfile-clA.so"))) #t) (begin (rm-rf "testdir-dist1") (mkdir "testdir-dist1") (install "testdir-dist1" "testdir-obj1/testfile-clA.so" "testdir-obj1/testfile-clB.so" "testdir-obj1/testfile-clC.so") #t) (eqv? (separate-eval '(parameterize ([cd "testdir-dist1"]) (verify-loadability 'visit "testfile-clA.so") (verify-loadability 'revisit "testfile-clA.so") (verify-loadability 'load "testfile-clA.so"))) "") (equal? (separate-eval '(parameterize ([cd "testdir-dist1"]) (load-program "testfile-clA.so"))) "hello from B1, hello from C1\n") (error? ; missing B1 (separate-eval '(parameterize ([cd "testdir-dist1"]) (verify-loadability 'visit "testfile-clB.so")))) (error? ; missing B1 (separate-eval '(parameterize ([cd "testdir-dist1"]) (verify-loadability 'load "testfile-clB.so")))) (error? ; missing C1 (separate-eval '(parameterize ([cd "testdir-dist1"]) (verify-loadability 'visit "testfile-clC.so")))) (error? ; missing C1 (separate-eval '(parameterize ([cd "testdir-dist1"]) (verify-loadability 'load "testfile-clC.so")))) (begin (rm-rf "testdir-dist2") (mkdir "testdir-dist2") (install "testdir-dist2" "testdir-obj2/testfile-clA.so" "testdir-obj2/testfile-clB.so" "testdir-obj2/testfile-clC.so") #t) (equal? (separate-eval '(parameterize ([cd "testdir-dist2"]) (load-program "testfile-clA.so"))) "hello from B1, hello from C1\n") (error? ; mismatched compilation instance (separate-eval '(verify-loadability 'revisit '("testdir-dist1/testfile-clA.so" . "testdir-dist1") '("testdir-dist2/testfile-clA.so" . "testdir-dist2")))) (error? ; mismatched compilation instance (separate-eval '(verify-loadability 'load '("testdir-dist1/testfile-clA.so" . "testdir-dist1") '("testdir-dist2/testfile-clA.so" . "testdir-dist2")))) (begin (rm-rf "testdir-dist3") (mkdir "testdir-dist3") (install "testdir-dist3" "testdir-obj1/testfile-clA.so" "testdir-obj1/testfile-clB.so" "testdir-obj2/testfile-clC.so") #t) (error? ; mismatched compilation instance (separate-eval '(parameterize ([cd "testdir-dist3"]) (load-program "testfile-clA.so")))) (eqv? ; no compile-time requirements, so no problem (separate-eval '(parameterize ([cd "testdir-dist3"]) (verify-loadability 'visit "testfile-clA.so"))) "") (error? ; mismatched compilation instance (separate-eval '(parameterize ([cd "testdir-dist3"]) (verify-loadability 'revisit "testfile-clA.so")))) (error? ; mismatched compilation instance (separate-eval '(parameterize ([cd "testdir-dist3"]) (verify-loadability 'load "testfile-clA.so")))) (equal? (separate-eval '(parameterize ([cd "testdir-dist3"]) (unless (guard (c [else (printf "yes\n")]) (verify-loadability 'load "testfile-clA.so") #f) (errorf #f "oops"))) '(parameterize ([cd "testdir-dist1"]) (printf "~s\n" (verify-loadability 'load "testfile-clA.so"))) '(parameterize ([cd "testdir-dist2"]) (printf "~s\n" (verify-loadability 'load "testfile-clA.so"))) '(let* ([ls (library-list)] [f (lambda (x) (and (member x ls) #t))]) (printf "~s\n" (map f '((testfile-clB) (testfile-clB1) (testfile-clC) (testfile-clC1))))) '(parameterize ([cd "testdir-dist1"]) (load-program "testfile-clA.so")) '(let* ([ls (library-list)] [f (lambda (x) (and (member x ls) #t))]) (printf "~s\n" (map f '((testfile-clB) (testfile-clB1) (testfile-clC) (testfile-clC1)))))) "yes\n#\n#\n(#f #f #f #f)\nhello from B1, hello from C1\n(#t #f #t #f)\n") (equal? (separate-eval '(parameterize ([cd "testdir-dist3"]) (unless (guard (c [else (printf "yes\n")]) (verify-loadability 'load "testfile-clA.so") #f) (errorf #f "oops"))) '(parameterize ([cd "testdir-dist1"]) (printf "~s\n" (verify-loadability 'load "testfile-clA.so"))) '(parameterize ([cd "testdir-dist2"]) (printf "~s\n" (verify-loadability 'load "testfile-clA.so"))) '(let* ([ls (library-list)] [f (lambda (x) (and (member x ls) #t))]) (printf "~s\n" (map f '((testfile-clB) (testfile-clB1) (testfile-clC) (testfile-clC1))))) '(parameterize ([cd "testdir-dist2"]) (load-program "testfile-clA.so")) '(let* ([ls (library-list)] [f (lambda (x) (and (member x ls) #t))]) (printf "~s\n" (map f '((testfile-clB) (testfile-clB1) (testfile-clC) (testfile-clC1)))))) "yes\n#\n#\n(#f #f #f #f)\nhello from B1, hello from C1\n(#t #f #t #f)\n") (error? ; mismatched compilation instance (separate-eval '(parameterize ([library-directories '(("testdir-dist1" . "testdir-dist1"))]) (verify-loadability 'load "testdir-dist2/testfile-clA.so")))) (error? ; mismatched compilation instance (separate-eval '(parameterize ([library-directories '(("testdir-dist1" . "testdir-dist1"))]) (verify-loadability 'load "testdir-dist1/testfile-clA.so" "testdir-dist2/testfile-clA.so")))) (begin (mkfile "testfile-clPD.ss" '(import (chezscheme) (testfile-clD)) '(printf "~s\n" (make-Q))) (mkfile "testfile-clPE.ss" '(import (chezscheme) (testfile-clE)) '(printf "~s\n" (make-Q 73))) (mkfile "testfile-clD.ss" '(library (testfile-clD) (export make-Q Q? Q-x) (import (chezscheme) (testfile-clF)) (define-record-type Q (nongenerative Q) (fields x) (protocol (lambda (new) (lambda () (new f))))))) (mkfile "testfile-clE.ss" '(library (testfile-clE) (export make-Q Q? Q-x) (import (chezscheme) (testfile-clG)) (define-record-type Q (nongenerative Q) (fields x y) (protocol (lambda (new) (lambda (y) (new g y))))))) (mkfile "testfile-clF.ss" '(library (testfile-clF) (export f) (import (chezscheme)) (define f 77))) (mkfile "testfile-clG.ss" '(library (testfile-clG) (export g) (import (chezscheme)) (define g 123))) (rm-rf "testdir-obj") (mkdir "testdir-obj") (separate-eval '(parameterize ([library-directories '(("." . "testdir-obj"))] [compile-imported-libraries #t]) (compile-program "testfile-clPD.ss" "testdir-obj/testfile-clPD.so"))) (separate-eval '(parameterize ([library-directories '(("." . "testdir-obj"))] [compile-imported-libraries #t]) (compile-program "testfile-clPE.ss" "testdir-obj/testfile-clPE.so"))) #t) (begin (rm-rf "testdir-dist") (mkdir "testdir-dist") (install "testdir-dist" "testdir-obj/testfile-clPD.so" "testdir-obj/testfile-clD.so" "testdir-obj/testfile-clF.so") (install "testdir-dist" "testdir-obj/testfile-clPE.so" "testdir-obj/testfile-clE.so" "testdir-obj/testfile-clG.so") #t) (error? ; incompatible record-type Q (separate-eval '(cd "testdir-dist") '(load-program "testfile-clPD.so") '(load-program "testfile-clPE.so"))) (equal? (separate-eval '(cd "testdir-dist") '(verify-loadability 'visit "testfile-clPD.so" "testfile-clPE.so") '(verify-loadability 'visit "testfile-clD.so" "testfile-clE.so") '(verify-loadability 'visit "testfile-clF.so" "testfile-clG.so") '(verify-loadability 'revisit "testfile-clPD.so" "testfile-clPE.so") '(verify-loadability 'revisit "testfile-clD.so" "testfile-clE.so") '(verify-loadability 'revisit "testfile-clF.so" "testfile-clG.so") '(verify-loadability 'load "testfile-clPD.so" "testfile-clPE.so") '(verify-loadability 'load "testfile-clD.so" "testfile-clE.so") '(verify-loadability 'load "testfile-clF.so" "testfile-clG.so") '(verify-loadability 'load "testfile-clPD.so" "testfile-clPE.so" "testfile-clD.so" "testfile-clE.so" "testfile-clF.so" "testfile-clG.so") '(load-program "testfile-clPD.so") '(verify-loadability 'load "testfile-clPD.so" "testfile-clE.so")) "#[Q 77]\n") (equal? (separate-eval '(cd "testdir-dist") '(verify-loadability 'visit "testfile-clPD.so" "testfile-clE.so") '(verify-loadability 'visit "testfile-clD.so" "testfile-clE.so") '(verify-loadability 'visit "testfile-clF.so" "testfile-clG.so") '(verify-loadability 'revisit "testfile-clPD.so" "testfile-clE.so") '(verify-loadability 'revisit "testfile-clD.so" "testfile-clE.so") '(verify-loadability 'revisit "testfile-clF.so" "testfile-clG.so") '(verify-loadability 'load "testfile-clPD.so" "testfile-clE.so") '(verify-loadability 'load "testfile-clD.so" "testfile-clE.so") '(verify-loadability 'load "testfile-clF.so" "testfile-clG.so") '(verify-loadability 'load "testfile-clPD.so" "testfile-clPE.so" "testfile-clD.so" "testfile-clE.so" "testfile-clF.so" "testfile-clG.so") '(load-program "testfile-clPE.so") '(verify-loadability 'load "testfile-clPD.so" "testfile-clE.so")) "#[Q 123 73]\n") (begin (mkfile "testfile-clH0.ss" '(library (testfile-clH0) (export h0) (import (chezscheme)) (define h0 (lambda (x) (cons x 'a))))) (mkfile "testfile-clH1.ss" '(top-level-program (import (chezscheme) (testfile-clH0)) (printf "~s\n" (h0 73)))) (mkfile "testfile-clH2.ss" '(include "testfile-clH0.ss") '(top-level-program (import (chezscheme) (testfile-clH0)) (printf "~s\n" (h0 37)))) (rm-rf "testdir-obj") (mkdir "testdir-obj") (separate-eval '(parameterize ([library-directories '(("." . "testdir-obj"))] [compile-imported-libraries #t]) (compile-file "testfile-clH1.ss" "testdir-obj/testfile-clH1.so"))) (separate-eval '(parameterize ([library-directories '(("." . "testdir-obj"))] [compile-imported-libraries #t]) (compile-file "testfile-clH2.ss" "testdir-obj/testfile-clH2.so"))) #t) (equal? (separate-eval '(parameterize ([library-directories '(("testdir-obj" . "testdir-obj"))]) (revisit "testdir-obj/testfile-clH1.so"))) "(73 . a)\n") (equal? (separate-eval '(parameterize ([library-directories '(("testdir-obj" . "testdir-obj"))]) (revisit "testdir-obj/testfile-clH2.so"))) "(37 . a)\n") (eqv? (separate-eval '(let ([libdirs '(("testdir-obj" . "testdir-obj"))]) (verify-loadability 'revisit (cons "testdir-obj/testfile-clH1.so" libdirs) (cons "testdir-obj/testfile-clH2.so" libdirs)))) "") (error? ; mismatched compilation instance (separate-eval '(let ([libdirs '(("testdir-obj" . "testdir-obj"))]) (verify-loadability 'revisit (cons "testdir-obj/testfile-clH2.so" libdirs) (cons "testdir-obj/testfile-clH1.so" libdirs))))) ; make sure verify-loadability respects eval-when forms (begin (mkfile "testfile-clI0.ss" '(library (testfile-clI0) (export x) (import (chezscheme)) (define x 10) (printf "invoking I0\n"))) (mkfile "testfile-clI1.ss" '(eval-when (visit) (top-level-program (import (chezscheme) (testfile-clI0)) (printf "running I1, x = ~s\n" x)))) (separate-eval '(parameterize ([compile-imported-libraries #t]) (compile-file "testfile-clI1"))) #t) (equal? (separate-eval '(visit "testfile-clI1.so")) "invoking I0\nrunning I1, x = 10\n") (equal? (separate-eval '(revisit "testfile-clI1.so")) "") (equal? (separate-eval '(load "testfile-clI1.so")) "invoking I0\nrunning I1, x = 10\n") (eq? (verify-loadability 'visit "testfile-clI1.so") (void)) (eq? (verify-loadability 'revisit "testfile-clI1.so") (void)) (eq? (verify-loadability 'load "testfile-clI1.so") (void)) (delete-file "testfile-clI0.ss") (delete-file "testfile-clI0.so") (error? (verify-loadability 'visit "testfile-clI1.so")) (eq? (verify-loadability 'revisit "testfile-clI1.so") (void)) (error? (verify-loadability 'load "testfile-clI1.so")) ; make sure compile-whole-program preserves the information verify-loadability needs (begin (mkfile "testfile-clJ0.ss" '(library (testfile-clJ0) (export x0) (import (chezscheme)) (define x0 'eat) (printf "invoking J0\n"))) (mkfile "testfile-clJ1.ss" '(library (testfile-clJ1) (export x1) (import (chezscheme) (testfile-clJ0)) (define x1 (list x0 'oats)) (printf "invoking J1\n"))) (mkfile "testfile-clJ2.ss" '(library (testfile-clJ2) (export x2) (import (chezscheme) (testfile-clJ1)) (define x2 (cons 'mares x1)) (printf "invoking J2\n"))) (mkfile "testfile-clJ3.ss" '(import (chezscheme) (testfile-clJ2)) '(printf "running J3, x2 = ~s\n" x2)) (separate-eval '(parameterize ([compile-imported-libraries #t] [generate-wpo-files #t]) (compile-program "testfile-clJ3"))) #t) (equal? (separate-eval '(verify-loadability 'load "testfile-clJ3.so")) "") (equal? (separate-eval '(load-program "testfile-clJ3.so")) "invoking J0\ninvoking J1\ninvoking J2\nrunning J3, x2 = (mares eat oats)\n") (delete-file "testfile-clJ0.ss") (delete-file "testfile-clJ0.wpo") (delete-file "testfile-clJ2.ss") (delete-file "testfile-clJ2.wpo") ((lambda (x ls) (and (member x ls) #t)) (separate-eval '(compile-whole-program "testfile-clJ3.wpo" "testfile-clJ3-all.so")) '("((testfile-clJ0) (testfile-clJ2))\n" "((testfile-clJ2) (testfile-clJ0))\n")) (delete-file "testfile-clJ1.ss") (delete-file "testfile-clJ1.wpo") (delete-file "testfile-clJ1.so") (equal? (separate-eval '(verify-loadability 'load "testfile-clJ3-all.so")) "") (equal? (separate-eval '(load-program "testfile-clJ3-all.so")) "invoking J0\ninvoking J1\ninvoking J2\nrunning J3, x2 = (mares eat oats)\n") (eq? (rename-file "testfile-clJ0.so" "testfile-clJ0.sav") (void)) (error? ; missing testfile-clJ0.so (separate-eval '(verify-loadability 'load "testfile-clJ3-all.so"))) (error? ; missing testfile-clJ0.so (separate-eval '(load-program "testfile-clJ3-all.so"))) (eq? (rename-file "testfile-clJ0.sav" "testfile-clJ0.so") (void)) (delete-file "testfile-clJ2.so") (error? ; missing testfile-clJ2.so (separate-eval '(verify-loadability 'load "testfile-clJ3-all.so"))) (error? ; missing testfile-clJ2.so (separate-eval '(load-program "testfile-clJ3-all.so"))) (begin (mkfile "testfile-clK0.ss" '(library (testfile-clK0) (export x0) (import (chezscheme)) (define x0 "chocolate") (printf "invoking K0\n"))) (mkfile "testfile-clK1.ss" '(library (testfile-clK1) (export x1) (import (chezscheme) (testfile-clK0)) (define x1 (format "~a chip" x0)) (printf "invoking K1\n"))) (mkfile "testfile-clK2.ss" '(import (chezscheme) (testfile-clK1)) '(printf "running K2, x1 = ~s\n" x1)) (separate-eval '(parameterize ([compile-imported-libraries #t]) (compile-program "testfile-clK2"))) #t) (eq? (verify-loadability 'visit "testfile-clK1.so") (void)) (eq? (verify-loadability 'revisit "testfile-clK1.so") (void)) (eq? (verify-loadability 'load "testfile-clK1.so") (void)) (eq? (verify-loadability 'visit "testfile-clK1.so" "testfile-clK2.so") (void)) (eq? (verify-loadability 'revisit "testfile-clK1.so" "testfile-clK2.so") (void)) (eq? (verify-loadability 'load "testfile-clK1.so" "testfile-clK2.so") (void)) (eq? (verify-loadability 'visit "testfile-clK2.so" "testfile-clK1.so") (void)) (eq? (verify-loadability 'revisit "testfile-clK2.so" "testfile-clK1.so") (void)) (eq? (verify-loadability 'load "testfile-clK2.so" "testfile-clK1.so") (void)) (equal? (separate-eval '(visit "testfile-clK1.so") '(let () (import (testfile-clK1)) x1)) "invoking K0\ninvoking K1\n\"chocolate chip\"\n") (equal? (separate-eval '(revisit "testfile-clK2.so")) "invoking K0\ninvoking K1\nrunning K2, x1 = \"chocolate chip\"\n") (eq? (strip-fasl-file "testfile-clK0.so" "testfile-clK0.so" (fasl-strip-options compile-time-information)) (void)) (error? ; missing compile-time info for K0 (verify-loadability 'visit "testfile-clK1.so")) (eq? (verify-loadability 'revisit "testfile-clK1.so") (void)) (error? ; missing compile-time info for K0 (verify-loadability 'load "testfile-clK1.so")) (error? ; missing compile-time info (separate-eval '(visit "testfile-clK1.so") '(let () (import (testfile-clK1)) x1))) (equal? (separate-eval '(revisit "testfile-clK2.so")) "invoking K0\ninvoking K1\nrunning K2, x1 = \"chocolate chip\"\n") ) (mat concatenate-object-files (begin (define install (lambda (dir . fn*) (for-each (lambda (fn) (call-with-port (open-file-input-port fn) (lambda (ip) (call-with-port (open-file-output-port (format "~a/~a" dir (path-last fn))) (lambda (op) (put-bytevector op (get-bytevector-all ip))))))) fn*))) (define test-isolated-load (lambda (fn lib val) (rm-rf "testdir-isolated") (mkdir "testdir-isolated") (install "testdir-isolated" fn) (separate-eval `(cd "testdir-isolated") `(load ,fn) `(let () (import ,lib) ,val)))) #t) (begin (mkfile "testfile-catlibA.ss" '(library (testfile-catlibA) (export a) (import (chezscheme)) (define a 1))) (mkfile "testfile-catlibB.ss" '(library (testfile-catlibB) (export a b) (import (chezscheme) (testfile-catlibA)) (define b 2))) (mkfile "testfile-catlibC.ss" '(library (testfile-catlibC) (export c) (import (chezscheme) (testfile-catlibB)) (define c (+ a b)))) (separate-eval '(compile-library "testfile-catlibA.ss" "testfile-catlibA.so")) (separate-eval '(compile-library "testfile-catlibB.ss" "testfile-catlibB.so")) (separate-eval '(compile-library "testfile-catlibC.ss" "testfile-catlibC.so")) #t) (eqv? (separate-eval '(begin (concatenate-object-files "testfile-catlibAB.so" "testfile-catlibA.so" "testfile-catlibB.so") (concatenate-object-files "testfile-catlibBC.so" "testfile-catlibB.so" "testfile-catlibC.so") (concatenate-object-files "testfile-catlibABC.so" "testfile-catlibA.so" "testfile-catlibB.so" "testfile-catlibC.so"))) "") (equal? (test-isolated-load "testfile-catlibA.so" '(testfile-catlibA) 'a) "1\n") (error? ; can't find (testfile-catlibA) (test-isolated-load "testfile-catlibB.so" '(testfile-catlibB) 'b)) (error? ; can't find (testfile-catlibA) (test-isolated-load "testfile-catlibBC.so" '(testfile-catlibC) 'c)) (equal? (test-isolated-load "testfile-catlibABC.so" '(testfile-catlibA) 'a) "1\n") (equal? (test-isolated-load "testfile-catlibABC.so" '(testfile-catlibB) 'b) "2\n") (equal? (test-isolated-load "testfile-catlibABC.so" '(testfile-catlibC) 'c) "3\n") (equal? (test-isolated-load "testfile-catlibAB.so" '(testfile-catlibB) 'b) "2\n") (begin (mkfile "testfile-cof1A.ss" '(library (testfile-cof1A) (export a) (import (chezscheme)) (define-syntax a (identifier-syntax 45)))) (mkfile "testfile-cof1B.ss" '(library (testfile-cof1B) (export b) (import (chezscheme) (testfile-cof1A)) (define b (lambda () (* a 2))))) (mkfile "testfile-cof1P.ss" '(import (chezscheme) (testfile-cof1A) (testfile-cof1B)) '(printf "a = ~s, (b) = ~s\n" a (b))) (mkfile "testfile-cof1foo.ss" '(printf "hello from foo!\n")) (mkfile "testfile-cof1bar.ss" '(printf "hello from bar!\n")) (parameterize ([compile-imported-libraries #t]) (compile-program "testfile-cof1P")) (compile-file "testfile-cof1foo") (compile-file "testfile-cof1bar") (let () (define fake-concatenate-object-files (lambda (outfn infn . infn*) (call-with-port (open-file-output-port outfn (file-options #;compressed replace)) (lambda (op) (for-each (lambda (infn) (put-bytevector op (call-with-port (open-file-input-port infn (file-options #;compressed)) get-bytevector-all))) (cons infn infn*)))))) (fake-concatenate-object-files "testfile-cof1fooP.so" "testfile-cof1foo.so" "testfile-cof1P.so") (fake-concatenate-object-files "testfile-cof1barB.so" "testfile-cof1bar.so" "testfile-cof1B.so")) #t) ; using separate-eval since A and B already loaded in the compiling process: (equal? (separate-eval '(load "testfile-cof1fooP.so")) "hello from foo!\na = 45, (b) = 90\n") (equal? (separate-eval '(load "testfile-cof1barB.so") '(printf "~s\n" (and (member '(testfile-cof1B) (library-list)) 'yes))) "hello from bar!\nyes\n") (equal? (separate-eval '(verify-loadability 'visit "testfile-cof1barB.so")) "") (equal? (separate-eval '(verify-loadability 'revisit "testfile-cof1barB.so")) "") (delete-file "testfile-cof1A.so") ; NB: this should be an error, but isn't because we're using the fake concatenate-object-files (equal? (separate-eval '(verify-loadability 'visit "testfile-cof1barB.so")) "") ; requires testfile-cof1A.so (equal? (separate-eval '(verify-loadability 'revisit "testfile-cof1barB.so")) "") ; doesn't require testfile-cof1A.so (equal? (separate-eval '(verify-loadability 'visit "testfile-cof1fooP.so")) "") ; doesn't require testfile-cof1A.so (equal? (separate-eval '(verify-loadability 'revisit "testfile-cof1fooP.so")) "") ; doesn't require testfile-cof1A.so (delete-file "testfile-cof1B.so") (equal? (separate-eval '(verify-loadability 'visit "testfile-cof1fooP.so")) "") ; doesn't require testfile-cof1A.so or testfile-cof1B.so ; NB: this should be an error, but isn't because we're using the fake concatenate-object-files (equal? (separate-eval '(verify-loadability 'revisit "testfile-cof1fooP.so")) "") ; requires testfile-cof1B.so ; now with the real concatenate-object-files (begin (separate-eval '(parameterize ([compile-imported-libraries #t]) (compile-program "testfile-cof1P"))) (concatenate-object-files "testfile-cof1fooP.so" "testfile-cof1foo.so" "testfile-cof1P.so") (concatenate-object-files "testfile-cof1barB.so" "testfile-cof1bar.so" "testfile-cof1B.so") #t) ; using separate-eval since A and B already loaded in the compiling process: (equal? (separate-eval '(load "testfile-cof1fooP.so")) "hello from foo!\na = 45, (b) = 90\n") (equal? (separate-eval '(load "testfile-cof1barB.so") '(printf "~s\n" (and (member '(testfile-cof1B) (library-list)) 'yes))) "hello from bar!\nyes\n") (equal? (separate-eval '(verify-loadability 'visit "testfile-cof1barB.so")) "") (equal? (separate-eval '(verify-loadability 'revisit "testfile-cof1barB.so")) "") (delete-file "testfile-cof1A.so") (error? (separate-eval '(verify-loadability 'visit "testfile-cof1barB.so"))) ; requires testfile-cof1A.so (equal? (separate-eval '(verify-loadability 'revisit "testfile-cof1barB.so")) "") ; doesn't require testfile-cof1A.so (equal? (separate-eval '(verify-loadability 'visit "testfile-cof1fooP.so")) "") ; doesn't require testfile-cof1A.so (equal? (separate-eval '(verify-loadability 'revisit "testfile-cof1fooP.so")) "") ; doesn't require testfile-cof1A.so (delete-file "testfile-cof1B.so") (equal? (separate-eval '(verify-loadability 'visit "testfile-cof1fooP.so")) "") ; doesn't require testfile-cof1A.so or testfile-cof1B.so (error? (separate-eval '(verify-loadability 'revisit "testfile-cof1fooP.so"))) ; requires testfile-cof1B.so ) ;;; section 7.2: (mat top-level-value-functions (error? (top-level-bound? "hello")) (error? (top-level-bound?)) (error? (top-level-bound? 45 'hello)) (error? (top-level-bound? 'hello 'hello)) (error? (top-level-bound? (scheme-environment) (scheme-environment))) (error? (top-level-mutable? "hello")) (error? (top-level-mutable?)) (error? (top-level-mutable? 45 'hello)) (error? (top-level-mutable? 'hello 'hello)) (error? (top-level-mutable? (scheme-environment) (scheme-environment))) (error? (top-level-value "hello")) (error? (top-level-value)) (error? (top-level-value 'hello 'hello)) (error? (top-level-value (scheme-environment) (scheme-environment))) (error? (set-top-level-value! "hello" "hello")) (error? (set-top-level-value!)) (error? (set-top-level-value! 15)) (error? (set-top-level-value! 'hello 'hello 'hello)) (error? (set-top-level-value! (scheme-environment) (scheme-environment) (scheme-environment))) (error? (define-top-level-value "hello" "hello")) (error? (define-top-level-value)) (error? (define-top-level-value 15)) (error? (define-top-level-value 'hello 'hello 'hello)) (error? (define-top-level-value (scheme-environment) (scheme-environment) (scheme-environment))) (top-level-bound? 'cons (scheme-environment)) (not (top-level-mutable? 'cons (scheme-environment))) (eq? (top-level-bound? 'probably-not-bound (scheme-environment)) #f) (equal? (top-level-value 'top-level-value) top-level-value) (equal? (parameterize ([interaction-environment (copy-environment (scheme-environment) #t)]) (eval '(define cons *)) (eval '(list (cons 3 4) (fluid-let ([cons list]) (list (cons 1 2) ((top-level-value 'cons) 1 2) ((top-level-value 'cons (scheme-environment)) 1 2) (top-level-mutable? 'cons) (top-level-mutable? 'cons (scheme-environment)) (top-level-mutable? 'car) (top-level-mutable? 'car (scheme-environment))))))) '(12 ((1 2) (1 2) (1 . 2) #t #f #f #f))) (let ([abcde 4]) (and (not (top-level-bound? 'abcde)) (begin (define-top-level-value 'abcde 3) (eqv? (top-level-value 'abcde) 3)) (top-level-bound? 'abcde) (begin (set-top-level-value! 'abcde 9) (eqv? (top-level-value 'abcde) 9)) (eqv? abcde 4))) (eqv? abcde 9) (let ([x (gensym)]) (and (not (top-level-bound? x)) (begin (define-top-level-value x 'hi) (eq? (top-level-value x) 'hi)) (top-level-bound? x) (begin (set-top-level-value! x 'there) (eq? (top-level-value x) 'there)) (eq? (eval x) 'there))) (error? (top-level-value 'i-am-not-bound-i-hope)) (error? (top-level-value 'let)) (equal? (parameterize ([interaction-environment (copy-environment (scheme-environment) #t)]) (eval '(define cons (let () (import scheme) cons))) (eval '(fluid-let ([cons 'notcons]) (list (top-level-value 'cons) (parameterize ([optimize-level 0]) (eval 'cons)) (parameterize ([interaction-environment (scheme-environment)]) ((top-level-value 'cons) 3 4)))))) '(notcons notcons (3 . 4))) (error? (set-top-level-value! 'let 45)) (error? (parameterize ([interaction-environment (scheme-environment)]) (eval '(define let 45) (scheme-environment)))) (error? (parameterize ([interaction-environment (scheme-environment)]) (eval '(set! let 45) (scheme-environment)))) (error? (parameterize ([interaction-environment (scheme-environment)]) (define-top-level-value 'let 45))) (error? (parameterize ([interaction-environment (scheme-environment)]) (set-top-level-value! 'let 45))) (error? (define-top-level-value 'let 45 (scheme-environment))) (error? (set-top-level-value! 'let 45 (scheme-environment))) (error? (parameterize ([interaction-environment (scheme-environment)]) (eval '(define cons 45) (scheme-environment)))) (error? (parameterize ([interaction-environment (scheme-environment)]) (eval '(set! cons 45) (scheme-environment)))) (error? (parameterize ([interaction-environment (scheme-environment)]) (define-top-level-value 'cons 45))) (error? (parameterize ([interaction-environment (scheme-environment)]) (set-top-level-value! 'cons 45))) (error? (define-top-level-value 'cons 45 (scheme-environment))) (error? (set-top-level-value! 'cons 45 (scheme-environment))) (error? (parameterize ([interaction-environment (scheme-environment)]) (eval '(define foo 45) (scheme-environment)))) (error? (parameterize ([interaction-environment (scheme-environment)]) (eval '(set! foo 45) (scheme-environment)))) (error? (parameterize ([interaction-environment (scheme-environment)]) (define-top-level-value 'foo 45))) (error? (parameterize ([interaction-environment (scheme-environment)]) (set-top-level-value! 'foo 45))) (error? (define-top-level-value 'foo 45 (scheme-environment))) (error? (set-top-level-value! 'foo 45 (scheme-environment))) (begin (define-syntax $let (identifier-syntax let)) (equal? ($let ((x 3) (y 4)) (cons x y)) '(3 . 4))) (eqv? (define-top-level-value '$let 76) (void)) (eqv? (top-level-value '$let) 76) (eqv? $let 76) ; make sure implicit treatment of top-level identifiers as variables ; works when assignment occurs in loaded object file (equal? (begin (with-output-to-file "testfile.ss" (lambda () (pretty-print '(set! $fribblefratz 17))) 'replace) (compile-file "testfile") (load "testfile.so") (list (top-level-bound? '$fribblefratz) (top-level-value '$fribblefratz))) '(#t 17)) (eqv? $fribblefratz 17) (equal? (begin (with-output-to-file "testfile.ss" (lambda () (pretty-print '(set! $notfribblefratz -17))) 'replace) ; compile in a separate Scheme process (if (windows?) (system (format "echo (compile-file \"testfile\") | ~a" (patch-exec-path *scheme*))) (system (format "echo '(compile-file \"testfile\")' | ~a" *scheme*))) (load "testfile.so") (list (top-level-bound? '$notfribblefratz) (top-level-value '$notfribblefratz))) '(#t -17)) (eqv? $notfribblefratz -17) ) ;;; section 7.3: (mat new-cafe (procedure? new-cafe) (equal? (guard (c [else #f]) (let ([ip (open-string-input-port "(+ 3 4)")]) (let-values ([(op get) (open-string-output-port)]) (parameterize ([console-input-port ip] [console-output-port op] [console-error-port op] [#%$cafe 0] [waiter-prompt-string "Huh?"]) (new-cafe)) (get)))) "Huh? 7\nHuh? \n") (equal? (guard (c [else #f]) (let ([ip (open-string-input-port "(if)")]) (let-values ([(op get) (open-string-output-port)]) (parameterize ([console-input-port ip] [console-output-port op] [console-error-port op] [#%$cafe 0] [waiter-prompt-string "Huh?"]) (new-cafe)) (get)))) "Huh? \nException: invalid syntax (if)\nHuh? \n") (equal? (separate-eval `(let ([ip (open-string-input-port " (base-exception-handler (lambda (c) (fprintf (console-output-port) \"~%>>> \") (display-condition c (console-output-port)) (fprintf (console-output-port) \" <<<~%\") (reset))) (if)")]) (let-values ([(op get) (open-string-output-port)]) (parameterize ([console-input-port ip] [console-output-port op] [console-error-port op] [#%$cafe 0] [waiter-prompt-string "Huh?"]) (new-cafe)) (get)))) "\"Huh? Huh? \\n>>> Exception: invalid syntax (if) <<<\\nHuh? \\n\"\n") ) (mat reset (procedure? (reset-handler)) (eqv? (call/cc (lambda (k) (parameterize ([reset-handler (lambda () (k 17))]) (reset)))) 17) (error? ; unexpected return from handler (guard (c [else (raise-continuable c)]) (parameterize ([reset-handler values]) (reset)))) ) (mat exit (procedure? (exit-handler)) (eqv? (call/cc (lambda (k) (parameterize ([exit-handler (lambda () (k 17))]) (exit)))) 17) (eqv? (call/cc (lambda (k) (parameterize ([exit-handler (lambda (q) (k 17))]) (exit -1)))) 17) (error? ; unexpected return from handler (parameterize ([exit-handler values]) (exit))) (error? ; unexpected return from handler (parameterize ([exit-handler values]) (exit 5))) (begin (define (exit-code expr) (if (windows?) (system (format "echo ~s | ~a -q" expr (patch-exec-path *scheme*))) (system (format "echo '~s' | ~a -q" expr *scheme*)))) #t) (eqv? (exit-code '(exit)) 0) (eqv? (exit-code '(exit 15)) 15) (eqv? (exit-code '(exit 0)) 0) (eqv? (exit-code '(exit 24 7)) 24) (eqv? (exit-code '(exit 0 1 2)) 0) (eqv? (exit-code '(exit 3.14)) 1) (eqv? (exit-code '(exit 9.8 3.14)) 1) (begin (with-output-to-file "testfile-exit.ss" (lambda () (for-each pretty-print '((import (scheme)) (apply exit (map string->number (command-line-arguments)))))) 'replace) #t) (eqv? (system (format "~a --script testfile-exit.ss" (patch-exec-path *scheme*))) 0) (eqv? (system (format "~a --script testfile-exit.ss 5" (patch-exec-path *scheme*))) 5) (eqv? (system (format "~a --script testfile-exit.ss 0 1 2" (patch-exec-path *scheme*))) 0) (eqv? (system (format "~a --script testfile-exit.ss 3 4 5" (patch-exec-path *scheme*))) 3) (eqv? (system (format "~a --program testfile-exit.ss" (patch-exec-path *scheme*))) 0) (eqv? (system (format "~a --program testfile-exit.ss 2" (patch-exec-path *scheme*))) 2) (eqv? (system (format "~a --program testfile-exit.ss 0 1 2" (patch-exec-path *scheme*))) 0) (eqv? (system (format "~a --program testfile-exit.ss 6 7 8" (patch-exec-path *scheme*))) 6) ) (mat abort (procedure? (abort-handler)) (eqv? (call/cc (lambda (k) (parameterize ([abort-handler (lambda () (k 17))]) (abort)))) 17) (error? ; unexpected return from handler (parameterize ([abort-handler values]) (abort))) ) (mat command-line (equal? (command-line) '("")) (equal? (r6rs:command-line) (command-line)) (parameterize ([command-line '("cp" "x" "y")]) (and (equal? (command-line) '("cp" "x" "y")) (equal? (r6rs:command-line) '("cp" "x" "y")))) ) (mat command-line-arguments (null? (command-line-arguments)) (parameterize ([command-line-arguments '("x" "y")]) (equal? (command-line-arguments) '("x" "y"))) ) ;;; section 7.4: (mat transcript-on/transcript-off ; check output (begin (delete-file "testscript") (printf "***** expect transcript output:~%") (parameterize ([console-input-port (open-input-string "(transcript-off)\n")]) (transcript-on "testscript") (let repl () (display "OK, " (console-output-port)) (let ([x (read (console-input-port))]) (unless (eof-object? x) (let ([x (eval x)]) (pretty-print x (console-output-port))) (repl))))) (not (eof-object? (with-input-from-file "testscript" read-char)))) ) ;;; section 7.5: (mat collect (error? ; invalid generation (collect-maximum-generation -1)) (error? ; invalid generation (collect-maximum-generation 10000)) (error? ; invalid generation (collect-maximum-generation 'static)) (error? ; invalid generation (release-minimum-generation -1)) (error? ; invalid generation (release-minimum-generation (+ (collect-maximum-generation) 1))) (error? ; invalid generation (release-minimum-generation 'static)) (let ([g (+ (collect-maximum-generation) 1)]) (guard (c [(and (message-condition? c) (equal? (condition-message c) "invalid generation ~s") (irritants-condition? c) (equal? (condition-irritants c) (list g)))]) (collect g) #f)) (let ([g (+ (collect-maximum-generation) 1)]) (guard (c [(and (message-condition? c) (equal? (condition-message c) "invalid target generation ~s for generation ~s") (irritants-condition? c) (equal? (condition-irritants c) (list g 0)))]) (collect 0 g) #f)) (error? (collect 0 -1)) (error? (collect -1 0)) (error? (collect 1 0)) (error? (collect 'static)) (with-interrupts-disabled (collect (collect-maximum-generation)) (let ([b1 (bytes-allocated)]) (let loop ([n 1000] [x '()]) (or (= n 0) (loop (- n 1) (cons x x)))) (let ([b2 (bytes-allocated)]) (collect (collect-maximum-generation)) (let ([b3 (bytes-allocated)]) (and (> b2 b1) (< b3 b2)))))) (error? ; invalid generation (collect 'static 1 'static)) (error? ; invalid generation (collect 'static 1 'static)) (error? ; invalid generation (parameterize ([collect-maximum-generation 4]) (collect 17 1 17))) (error? ; invalid generation (collect -1 1 'static)) (error? ; invalid maximum target generation (parameterize ([collect-maximum-generation 4]) (collect 3 1 2))) (error? ; invalid maximum target generation (parameterize ([collect-maximum-generation 4]) (collect 3 1 'dynamic))) (error? ; invalid minimum target generation (parameterize ([collect-maximum-generation 4]) (collect 0 0 3))) (error? ; invalid minimum target generation (parameterize ([collect-maximum-generation 4]) (collect 0 'static 3))) (error? ; invalid minimum target generation (parameterize ([collect-maximum-generation 4]) (collect 0 2 1))) (error? ; invalid minimum target generation (parameterize ([collect-maximum-generation 4]) (collect 0 2 0))) (error? ; invalid minimum target generation (parameterize ([collect-maximum-generation 4]) (collect (collect-maximum-generation) 0 'static))) (error? ; invalid minimum target generation (parameterize ([collect-maximum-generation 4]) (collect (collect-maximum-generation) -1 'static))) (parameterize ([collect-maximum-generation (max (collect-maximum-generation) 2)]) (with-interrupts-disabled (collect (collect-maximum-generation)) (let ([b0-0 (bytes-allocated 0)] [b1-0 (bytes-allocated 1)] [bm-0 (bytes-allocated (collect-maximum-generation))]) (let* ([v (make-vector 2000)] [n (compute-size v)]) (let ([b0-1 (bytes-allocated 0)] [b1-1 (bytes-allocated 1)] [bm-1 (bytes-allocated (collect-maximum-generation))]) (unless (>= (- b0-1 b0-0) n) (errorf 'oops1 "b0-0 = ~s, b0-1 = ~s, b0-2 = ~s" b0-0 b0-1 b0-2)) (unless (< (- b1-1 b1-0) n) (errorf 'oops2 "b1-0 = ~s, b1-1 = ~s, b1-2 = ~s" b1-0 b1-1 b1-2)) (unless (< (- bm-1 bm-0) n) (errorf 'oops3 "bm-0 = ~s, bm-1 = ~s, bm-2 = ~s" bm-0 bm-1 bm-2)) (collect (collect-maximum-generation) 1 (collect-maximum-generation)) (let ([b0-2 (bytes-allocated 0)] [b1-2 (bytes-allocated 1)] [bm-2 (bytes-allocated (collect-maximum-generation))]) (unless (< (- b0-2 b0-0) n) (errorf 'oops4 "b0-0 = ~s, b0-1 = ~s, b0-2 = ~s" b0-0 b0-1 b0-2)) (unless (>= (- b1-2 b1-0) n) (errorf 'oops5 "b1-0 = ~s, b1-1 = ~s, b1-2 = ~s" b1-0 b1-1 b1-2)) (unless (< (- bm-2 bm-0) n) (errorf 'oops6 "bm-0 = ~s, bm-1 = ~s, bm-2 = ~s" bm-0 bm-1 bm-2)) (parameterize ([print-vector-length #t]) (pretty-print v)) #t)))))) (parameterize ([collect-maximum-generation 4] [collect-generation-radix 4] [collect-trip-bytes (expt 2 20)]) (collect (collect-maximum-generation)) (let ([b0 (maximum-memory-bytes)]) (define tail-spin (lambda (n) (do ([i 1 (fx+ i 1)] [next (cons 0 '()) (cdr next)]) ((fx= i n)) (set-cdr! next (cons i '()))))) (tail-spin 50000000) (let ([b1 (maximum-memory-bytes)]) (or (< (- b1 b0) (expt 2 24)) (errorf #f "b0 = ~s, b1 = ~s, b1-b0 = ~s" b0 b1 (- b1 b0)))))) ) (mat object-counts ; basic structural checks (let ([hc (object-counts)]) (begin (assert (list? hc)) (for-each (lambda (a) (assert (pair? a))) hc) (for-each (lambda (a) (assert (or (symbol? (car a)) (record-type-descriptor? (car a))))) hc) (for-each (lambda (a) (assert (list? (cdr a)))) hc) (for-each (lambda (a) (for-each (lambda (a) (and (or (and (fixnum? (car a)) (<= 0 (car a) (collect-maximum-generation))) (eq? (car a) 'static)) (and (fixnum? (cadr a)) (>= (cadr a) 0)) (and (fixnum? (cddr a)) (>= (cddr a) (cadr a))))) (cdr a))) hc) (assert (assq 'pair hc)) (assert (assq 'procedure hc)) (assert (assq 'symbol hc)) (assert (assp record-type-descriptor? hc)) #t)) ; a few idiot checks including verification of proper behavior when changing collect-maximum-generation (parameterize ([enable-object-counts #t] [collect-maximum-generation (collect-maximum-generation)]) (pair? (with-interrupts-disabled (let ([cmg (collect-maximum-generation)]) (collect-maximum-generation 4) (collect 4 4) (let () (define (locate type gen ls) (cond [(assq type ls) => (lambda (a) (cond [(assv gen (cdr a)) => cadr] [else #f]))] [else #f])) (define-record-type flub (fields x)) (define q0 (make-flub 0)) (define b0 (box 0)) (collect 0 0) (let ([hc (object-counts)]) (assert (locate 'box 0 hc)) (assert (locate (record-type-descriptor flub) 0 hc)) (collect-maximum-generation 7) (let ([hc (object-counts)]) (assert (locate 'box 0 hc)) (assert (locate (record-type-descriptor flub) 0 hc)) (collect 7 7) (let () (define q1 (make-flub q0)) (define b1 (box b0)) (collect 6 6) (let () (define q2 (make-flub q1)) (define b2 (box b1)) (collect 5 5) (let ([hc (object-counts)]) (assert (locate 'box 5 hc)) (assert (locate 'box 6 hc)) (assert (locate 'box 7 hc)) (assert (locate (record-type-descriptor flub) 5 hc)) (assert (locate (record-type-descriptor flub) 6 hc)) (assert (locate (record-type-descriptor flub) 7 hc)) (collect-maximum-generation 5) (let ([hc (object-counts)]) (assert (locate 'box 5 hc)) (assert (not (locate 'box 6 hc))) (assert (not (locate 'box 7 hc))) (assert (locate (record-type-descriptor flub) 5 hc)) (assert (not (locate (record-type-descriptor flub) 6 hc))) (assert (not (locate (record-type-descriptor flub) 7 hc))) (collect 5 5) (let ([hc (object-counts)]) (assert (locate 'box 5 hc)) (assert (not (locate 'box 6 hc))) (assert (not (locate 'box 7 hc))) (assert (locate (record-type-descriptor flub) 5 hc)) (assert (not (locate (record-type-descriptor flub) 6 hc))) (assert (not (locate (record-type-descriptor flub) 7 hc))) (collect-maximum-generation cmg) (collect cmg cmg) (cons q2 b2))))))))))))) ; make sure we can handle turning enable-object-counts on and off (equal? (parameterize ([collect-request-handler void]) (define-record-type frob (fields x)) (define x (list (make-frob 3))) (parameterize ([enable-object-counts #t]) (collect 0 0)) (parameterize ([enable-object-counts #f]) (collect 0 1)) (do ([n 100000 (fx- n 1)]) ((fx= n 0)) (set! x (cons n x))) (parameterize ([enable-object-counts #t]) (collect 1 1)) (cons (length x) (cadr (assq 1 (cdr (assq (record-type-descriptor frob) (object-counts))))))) `(100001 . 1)) (let ([a (assq 'reloc-table (object-counts))]) (or (not a) (not (assq 'static (cdr a))))) ) (mat collect-rendezvous (begin (define (check-working-gc collect) (with-interrupts-disabled (let ([p (weak-cons (gensym) #f)]) (collect) (eq? (car p) #!bwp)))) (and (check-working-gc collect) (check-working-gc collect-rendezvous))) (or (not (threaded?)) (let ([m (make-mutex)] [c (make-condition)] [done? #f]) (fork-thread (lambda () (let loop () (mutex-acquire m) (cond [done? (condition-signal c) (mutex-release m)] [else (mutex-release m) (loop)])))) (and (check-working-gc collect-rendezvous) ;; End thread: (begin (mutex-acquire m) (set! done? #t) (condition-wait c m) (mutex-release m) ;; Make sure the thread is really done (let loop () (unless (= 1 (#%$top-level-value '$active-threads)) (loop))) ;; Plain `collect` should work again: (check-working-gc collect))))) ) ;;; section 7.6: (mat time (begin (printf "***** expect time output (nonzero allocation):~%") (time (let loop ([n 1000] [x '()]) (or (= n 0) (loop (- n 1) (cons x x)))))) (begin (printf "***** expect time output (nonzero cpu & real time):~%") (time (letrec ([tak (lambda (x y z) (if (>= y x) z (tak (tak (1- x) y z) (tak (1- y) z x) (tak (1- z) x y))))]) (tak 18 12 6))) #t) (begin (printf "***** expect time output (>= 2 collections):~%") (time (begin (collect) (collect))) #t) ) (mat sstats (begin (define exact-integer? (lambda (x) (and (exact? x) (integer? x)))) (define exact-nonnegative-integer? (lambda (x) (and (exact-integer? x) (nonnegative? x)))) (define sstats-time? (lambda (t type) (and (time? t) (eq? (time-type t) type)))) #t) (error? ; invalid cpu time (make-sstats 0 (make-time 'time-monotonic 0 0) 0 0 (make-time 'time-collector-cpu 0 0) (make-time 'time-collector-real 0 0) 0)) (error? ; invalid real time (make-sstats (make-time 'time-duration 0 0) 0 0 0 (make-time 'time-collector-cpu 0 0) (make-time 'time-collector-real 0 0) 0)) (error? ; invalid bytes (make-sstats (make-time 'time-duration 0 0) (make-time 'time-monotonic 0 0) 0.0 0 (make-time 'time-collector-cpu 0 0) (make-time 'time-collector-real 0 0) 0)) (error? ; invalid gc-count (make-sstats (make-time 'time-duration 0 0) (make-time 'time-monotonic 0 0) 0 "oops" (make-time 'time-collector-cpu 0 0) (make-time 'time-collector-real 0 0) 0)) (error? ; invalid gc-cpu (make-sstats (make-time 'time-duration 0 0) (make-time 'time-monotonic 0 0) 0 0 0 (make-time 'time-collector-real 0 0) 0)) (error? ; invalid gc-real (make-sstats (make-time 'time-duration 0 0) (make-time 'time-monotonic 0 0) 0 0 (make-time 'time-collector-cpu 0 0) 0 0)) (error? ; invalid gc-bytes (make-sstats (make-time 'time-duration 0 0) (make-time 'time-monotonic 0 0) 0 0 (make-time 'time-collector-cpu 0 0) (make-time 'time-collector-real 0 0) 0.0)) (begin (define sstats (make-sstats (make-time 'time-process 0 0) (make-time 'time-monotonic 0 0) 0 0 (make-time 'time-collector-cpu 0 0) (make-time 'time-collector-real 0 0) 0)) #t) (sstats? sstats) (error? ; not an sstats record (sstats-cpu 'it)) (error? ; not an sstats record (sstats-real 'is)) (error? ; not an sstats record (sstats-bytes 'fun)) (error? ; not an sstats record (sstats-gc-count 'to)) (error? ; not an sstats record (sstats-gc-cpu 'write)) (error? ; not an sstats record (sstats-gc-real 'mats)) (error? ; not an sstats record (sstats-gc-bytes '(not really))) (sstats-time? (sstats-cpu sstats) 'time-process) (sstats-time? (sstats-real sstats) 'time-monotonic) (eqv? (sstats-bytes sstats) 0) (eqv? (sstats-gc-count sstats) 0) (sstats-time? (sstats-gc-cpu sstats) 'time-collector-cpu) (sstats-time? (sstats-gc-real sstats) 'time-collector-real) (eqv? (sstats-gc-bytes sstats) 0) (error? ; not an sstats record (set-sstats-cpu! 'it (make-time 'time-duration 1 0))) (error? ; not an sstats record (set-sstats-real! 'is (make-time 'time-duration 1 0))) (error? ; not an sstats record (set-sstats-bytes! 'fun 11)) (error? ; not an sstats record (set-sstats-gc-count! 'to 13)) (error? ; not an sstats record (set-sstats-gc-cpu! 'write (make-time 'time-duration 1 0))) (error? ; not an sstats record (set-sstats-gc-real! 'mats (make-time 'time-duration 1 0))) (error? ; not an sstats record (set-sstats-gc-bytes! '(not really) 17)) (error? ; 12 is not a time (set-sstats-cpu! sstats 12)) (error? ; 12 is not a time (set-sstats-real! sstats 12)) (error? ; 12 is not a time (set-sstats-gc-cpu! sstats 12)) (error? ; 12 is not a time (set-sstats-gc-real! sstats 12)) (error? ; #[time whatsit] is not a time (set-sstats-gc-real! sstats (make-assertion-violation))) (begin (set-sstats-cpu! sstats (make-time 'time-utc 12 3)) (set-sstats-cpu! sstats (make-time 'time-monotonic 12 3)) (set-sstats-cpu! sstats (make-time 'time-duration 12 3)) (set-sstats-cpu! sstats (make-time 'time-thread 12 3)) (set-sstats-cpu! sstats (make-time 'time-collector-cpu 12 3)) (set-sstats-cpu! sstats (make-time 'time-collector-real 12 3)) (set-sstats-real! sstats (make-time 'time-utc 12 3)) (set-sstats-real! sstats (make-time 'time-duration 12 3)) (set-sstats-real! sstats (make-time 'time-process 12 3)) (set-sstats-real! sstats (make-time 'time-thread 12 3)) (set-sstats-real! sstats (make-time 'time-collector-cpu 12 3)) (set-sstats-real! sstats (make-time 'time-collector-real 12 3)) (set-sstats-gc-cpu! sstats (make-time 'time-utc 12 3)) (set-sstats-gc-cpu! sstats (make-time 'time-monotonic 12 3)) (set-sstats-gc-cpu! sstats (make-time 'time-duration 12 3)) (set-sstats-gc-cpu! sstats (make-time 'time-process 12 3)) (set-sstats-gc-cpu! sstats (make-time 'time-thread 12 3)) (set-sstats-gc-cpu! sstats (make-time 'time-collector-real 12 3)) (set-sstats-gc-real! sstats (make-time 'time-utc 12 3)) (set-sstats-gc-real! sstats (make-time 'time-monotonic 12 3)) (set-sstats-gc-real! sstats (make-time 'time-duration 12 3)) (set-sstats-gc-real! sstats (make-time 'time-process 12 3)) (set-sstats-gc-real! sstats (make-time 'time-thread 12 3)) (set-sstats-gc-real! sstats (make-time 'time-collector-cpu 12 3)) #t) (eq? (set-sstats-cpu! sstats (make-time 'time-process 12 3)) (void)) (eq? (set-sstats-real! sstats (make-time 'time-monotonic 12 3)) (void)) (eq? (set-sstats-gc-cpu! sstats (make-time 'time-collector-cpu 12 3)) (void)) (eq? (set-sstats-gc-real! sstats (make-time 'time-collector-real 12 3)) (void)) (error? (set-sstats-bytes! sstats 12.3)) (error? (set-sstats-bytes! sstats 12.0)) (error? (set-sstats-gc-count! sstats 3+4i)) (error? (set-sstats-gc-count! sstats #f)) (error? (set-sstats-gc-bytes! sstats 8/3)) (error? (set-sstats-gc-bytes! sstats 'twelve)) (eq? (set-sstats-bytes! sstats 12) (void)) (eq? (set-sstats-gc-count! sstats 3) (void)) (eq? (set-sstats-gc-bytes! sstats 8) (void)) (begin (define sstats-diff (sstats-difference (make-sstats (make-time 'time-process 83 5) (make-time 'time-monotonic 12 1) 5 23 (make-time 'time-collector-cpu (expt 2 8) 0) (make-time 'time-collector-real 735 1000007) 29) (make-sstats (make-time 'time-process 3 0) (make-time 'time-monotonic 10333221 2) 20 3 (make-time 'time-collector-cpu 0 0) (make-time 'time-collector-real 0 0) 4))) #t) (sstats? sstats-diff) (sstats-time? (sstats-cpu sstats-diff) 'time-duration) (time=? (sstats-cpu sstats-diff) (make-time 'time-duration 80 5)) (sstats-time? (sstats-real sstats-diff) 'time-duration) (time=? (sstats-real sstats-diff) (make-time 'time-duration 989666791 -2)) (eqv? (sstats-bytes sstats-diff) -15) (eqv? (sstats-gc-count sstats-diff) 20) (sstats-time? (sstats-gc-cpu sstats-diff) 'time-duration) (time=? (sstats-gc-cpu sstats-diff) (make-time 'time-duration (expt 2 8) 0)) (sstats-time? (sstats-gc-real sstats-diff) 'time-duration) (time=? (sstats-gc-real sstats-diff) (make-time 'time-duration 735 1000007)) (eqv? (sstats-gc-bytes sstats-diff) 25) (let ([sstats (statistics)]) (and (sstats? sstats) (sstats-time? (sstats-cpu sstats) 'time-thread) (sstats-time? (sstats-real sstats) 'time-monotonic) (exact-nonnegative-integer? (sstats-bytes sstats)) (exact-nonnegative-integer? (sstats-gc-count sstats)) (sstats-time? (sstats-gc-cpu sstats) 'time-collector-cpu) (sstats-time? (sstats-gc-real sstats) 'time-collector-real) (exact-nonnegative-integer? (sstats-gc-bytes sstats)))) (let ([sstats (sstats-difference (statistics) (statistics))]) (and (sstats? sstats) (sstats-time? (sstats-cpu sstats) 'time-duration) (sstats-time? (sstats-real sstats) 'time-duration) (exact-integer? (sstats-bytes sstats)) (exact-integer? (sstats-gc-count sstats)) (sstats-time? (sstats-gc-cpu sstats) 'time-duration) (sstats-time? (sstats-gc-real sstats) 'time-duration) (exact-integer? (sstats-gc-bytes sstats)))) ) (mat display-statistics ; check output (let ([s (with-output-to-string display-statistics)]) (and (string? s) (> (string-length s) 50))) ) (mat cpu-time (> (cpu-time) 0) (let ([x (cpu-time)]) (<= x (cpu-time))) ) (mat real-time (> (real-time) 0) (let ([x (real-time)]) (<= x (real-time))) ) (mat bytes-allocated (error? (bytes-allocated 'yuk)) (error? (bytes-allocated -1)) (error? (bytes-allocated (+ (collect-maximum-generation) 1))) (error? (bytes-allocated (+ (most-positive-fixnum) 1))) (error? (bytes-allocated #f)) (error? (bytes-allocated (+ (collect-maximum-generation) 1) 'new)) (error? (bytes-allocated (+ (collect-maximum-generation) 1) #f)) (error? (bytes-allocated 0 'gnu)) (error? (bytes-allocated #f 'gnu)) (error? (bytes-allocated 'static 'gnu)) (> (bytes-allocated) 0) (andmap (lambda (g) (>= (bytes-allocated g) 0)) (iota (+ (collect-maximum-generation) 1))) (>= (bytes-allocated 'static) 0) (let ([x (bytes-allocated)]) (<= x (bytes-allocated))) (>= (initial-bytes-allocated) 0) (>= (collections) 0) (>= (bytes-deallocated) 0) (let ([b (bytes-deallocated)] [c (collections)]) (let ([x (make-list 10 'a)]) (pretty-print x) (collect) (and (> (collections) c) (> (bytes-deallocated) b)))) (>= (bytes-allocated #f #f) 0) (andmap (lambda (space) (>= (bytes-allocated #f space) 0)) (#%$spaces)) (let () (define fudge 2000) (define ~= (lambda (x y) (<= (abs (- x y)) fudge))) (define all-gen (append (iota (+ (collect-maximum-generation) 1)) '(static))) (for-each (lambda (space) (critical-section (let ([n1 (bytes-allocated #f space)] [n2 (fold-left (lambda (bytes gen) (+ bytes (bytes-allocated gen space))) 0 all-gen)]) (unless (~= n1 n2) (errorf #f "discrepancy for space ~s: ~d vs ~d" space n1 n2))))) (#%$spaces)) (for-each (lambda (gen) (critical-section (let ([n1 (bytes-allocated gen #f)] [n2 (fold-left (lambda (bytes space) (+ bytes (bytes-allocated gen space))) 0 (#%$spaces))]) (unless (~= n1 n2) (errorf #f "discrepancy for generation ~s: ~d vs ~d" gen n1 n2))))) all-gen) (critical-section (let ([n1 (bytes-allocated #f #f)] [n2 (fold-left (lambda (bytes gen) (fold-left (lambda (bytes space) (+ bytes (bytes-allocated gen space))) bytes (#%$spaces))) 0 all-gen)]) (unless (~= n1 n2) (errorf #f "discrepancy in bytes-allocated: ~d vs ~d" n1 n2)))) #t) ) (mat memory-bytes (critical-section (let ([x (maximum-memory-bytes)]) (<= (current-memory-bytes) x))) (critical-section (let ([x (maximum-memory-bytes)]) (reset-maximum-memory-bytes!) (let ([y (maximum-memory-bytes)]) (<= y x)))) ) (mat date-and-time (let ([s (date-and-time)]) (printf "***** check date-and-time: ~s~%" s) (string? s)) ) ;;; section 7-7: (mat trace-lambda ; check output (letrec ([fact (trace-lambda fact (x) (if (= x 0) 1 (* x (fact (- x 1)))))]) (printf "***** expect trace of (fact 3):~%") (eqv? (fact 3) 6)) ) (mat trace-let ; check output (begin (printf "***** expect trace of (fib 3):~%") (eqv? (trace-let fib ([x 3]) (if (< x 2) 1 (+ (fib (- x 1)) (fib (- x 2))))) 3)) ) (mat trace/untrace (begin (set! lslen (lambda (ls) (if (null? ls) 0 (+ (lslen (cdr ls)) 1)))) (and (equal? (trace lslen) '(lslen)) (equal? (trace) '(lslen)) (begin (printf "***** expect trace of (lslen '(a b c)):~%") (eqv? (lslen '(a b c)) 3)) (equal? (untrace lslen) '(lslen)) (equal? (trace) '()) (equal? (trace lslen) '(lslen)) (equal? (trace lslen) '(lslen)) (begin (set! lslen (lambda (x) x)) (printf "***** do *not* expect output:~%") (eqv? (lslen 'a) 'a)) (equal? (trace lslen) '(lslen)) (begin (printf "***** expect trace of (lslen 'a):~%") (eqv? (lslen 'a) 'a)) (equal? (untrace) '(lslen)) (equal? (trace) '()) (begin (printf "***** do *not* expect output:~%") (eqv? (lslen 'a) 'a)))) ) ;;; section 7-8: (mat error (error? (errorf 'a "hit me!")) (error? (let f ([n 10]) (if (= n 0) (errorf 'f "n is ~s" n) (f (- n 1))))) ) (mat keyboard-interrupt-handler ; must be tested by hand (procedure? (keyboard-interrupt-handler)) ) (mat collect-request-handler (procedure? (collect-request-handler)) (call/cc (lambda (k) (parameterize ([collect-request-handler (lambda () (collect) (k #t))]) (let f ([x '()]) (f (list-copy (cons 'a x))))))) ) (mat timer-interrupt-handler ; tested in mat set-timer below (procedure? (timer-interrupt-handler)) ) ;;; section 7-9: (mat set-timer (let ([count1 0]) (timer-interrupt-handler (lambda () (set! count1 (+ count1 1)))) (set-timer (+ 10 (random 10))) (let loop2 ([count2 1]) (cond [(= count2 100)] [(= count1 count2) (set-timer (+ 10 (random 10))) (loop2 (+ count2 1))] [else (loop2 count2)]))) ) (mat disable-interrupts-enable-interrupts (and (= (disable-interrupts) 1) (= (disable-interrupts) 2) (= (enable-interrupts) 1) (= (enable-interrupts) 0)) (call/cc (lambda (k) (timer-interrupt-handler (lambda () (k #t))) (disable-interrupts) (parameterize ([timer-interrupt-handler (lambda () (k #f))]) (set-timer 1) (let loop ([n 1000]) (or (= n 0) (loop (- n 1))))) (enable-interrupts) (let loop ([n 1000]) (or (= n 0) (loop (- n 1)))) #f)) ) (mat with-interrupts-disabled (call/cc (lambda (k) (timer-interrupt-handler (lambda () (k #t))) (with-interrupts-disabled (parameterize ([timer-interrupt-handler (lambda () (k #f))]) (set-timer 1) (let loop ([n 1000]) (or (= n 0) (loop (- n 1)))))) (let loop ([n 1000]) (or (= n 0) (loop (- n 1)))) #f)) ; test old name (call/cc (lambda (k) (timer-interrupt-handler (lambda () (k #t))) (critical-section (parameterize ([timer-interrupt-handler (lambda () (k #f))]) (set-timer 1) (let loop ([n 1000]) (or (= n 0) (loop (- n 1)))))) (let loop ([n 1000]) (or (= n 0) (loop (- n 1)))) #f)) )