handle compiled library code in boot files once base boot is loaded

original commit: 23788415327a5396d14e452fca410ba68431098b
This commit is contained in:
Oscar Waddell 2018-04-09 17:01:02 -04:00
parent 7f308c1006
commit 8220ce2b32
7 changed files with 99 additions and 30 deletions

2
LOG
View File

@ -919,3 +919,5 @@
8.ms 8.ms
- Added -Wno-implicit-fallthrough flag to macOS C makefiles. - Added -Wno-implicit-fallthrough flag to macOS C makefiles.
c/Mf-a6osx, c/Mf-i3osx, c/Mf-ta6osx, c/Mf-ti3osx c/Mf-a6osx, c/Mf-i3osx, c/Mf-ta6osx, c/Mf-ti3osx
- handle compiled library code in boot files once base boot is loaded
globals.h, scheme.c, 7.ss, 7.ms, primdata.ss

View File

@ -73,6 +73,9 @@ EXTERN struct {
ptr heap_reserve_ratio_id; ptr heap_reserve_ratio_id;
IBOOL retain_static_relocation; IBOOL retain_static_relocation;
IBOOL enable_object_counts; IBOOL enable_object_counts;
ptr scheme_version_id;
ptr make_load_binary_id;
ptr load_binary;
/* foreign.c */ /* foreign.c */
ptr foreign_static; ptr foreign_static;

View File

@ -126,6 +126,13 @@ static void main_init() {
S_protect(&S_G.heap_reserve_ratio_id); S_protect(&S_G.heap_reserve_ratio_id);
S_G.heap_reserve_ratio_id = S_intern((const unsigned char *)"$heap-reserve-ratio"); S_G.heap_reserve_ratio_id = S_intern((const unsigned char *)"$heap-reserve-ratio");
SETSYMVAL(S_G.heap_reserve_ratio_id, Sflonum(default_heap_reserve_ratio)); SETSYMVAL(S_G.heap_reserve_ratio_id, Sflonum(default_heap_reserve_ratio));
S_protect(&S_G.scheme_version_id);
S_G.scheme_version_id = S_intern((const unsigned char *)"$scheme-version");
S_protect(&S_G.make_load_binary_id);
S_G.make_load_binary_id = S_intern((const unsigned char *)"$make-load-binary");
S_protect(&S_G.load_binary);
S_G.load_binary = Sfalse;
} }
static ptr fixtest = FIX(-1); static ptr fixtest = FIX(-1);
@ -817,6 +824,16 @@ static void handle_visit_revisit(tc, p) ptr tc; ptr p; {
} }
} }
static int set_load_binary(iptr n) {
if (SYMVAL(S_G.scheme_version_id) == sunbound) return 0; // set by back.ss
ptr make_load_binary = SYMVAL(S_G.make_load_binary_id);
if (Sprocedurep(make_load_binary)) {
S_G.load_binary = Scall3(make_load_binary, Sstring(bd[n].path), Sstring_to_symbol("load"), Sfalse);
return 1;
}
return 0;
}
static void load(tc, n, base) ptr tc; iptr n; IBOOL base; { static void load(tc, n, base) ptr tc; iptr n; IBOOL base; {
ptr x; iptr i; ptr x; iptr i;
@ -849,6 +866,10 @@ static void load(tc, n, base) ptr tc; iptr n; IBOOL base; {
if (Sprocedurep(x)) { if (Sprocedurep(x)) {
S_initframe(tc, 0); S_initframe(tc, 0);
x = boot_call(tc, x, 0); x = boot_call(tc, x, 0);
} else if (Sprocedurep(S_G.load_binary) || set_load_binary(n)) {
S_initframe(tc, 1);
S_put_arg(tc, 1, x);
x = boot_call(tc, S_G.load_binary, 1);
} else if (Svectorp(x)) { } else if (Svectorp(x)) {
iptr j, n; iptr j, n;
n = Svector_length(x); n = Svector_length(x);
@ -872,6 +893,7 @@ static void load(tc, n, base) ptr tc; iptr n; IBOOL base; {
i += 1; i += 1;
} }
S_G.load_binary = Sfalse;
gzclose(bd[n].file); gzclose(bd[n].file);
} }

View File

@ -931,6 +931,31 @@
(unless (eof-object? err) (error 'bootfile-test1 err)) (unless (eof-object? err) (error 'bootfile-test1 err))
out))) out)))
"hello 1\nhello 2\nhello 3\nhello 4\nhello 5\n") "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"
(if (windows?)
(list->string (subst #\\ #\/ (string->list *scheme*)))
*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? (equal?
(begin (begin
(unless (or (embedded?) (equal? *scheme* (format "../bin/~a/scheme~a" (machine-type) (if (windows?) ".exe" "")))) (unless (or (embedded?) (equal? *scheme* (format "../bin/~a/scheme~a" (machine-type) (if (windows?) ".exe" ""))))

View File

@ -1566,6 +1566,12 @@ in fasl files does not generally make sense.
%----------------------------------------------------------------------------- %-----------------------------------------------------------------------------
\section{Bug Fixes}\label{section:bugfixes} \section{Bug Fixes}\label{section:bugfixes}
\subsection{Boot files containing compiled library code fail to load}
Compiled library code may now appear within fasl objects loaded during
the boot process, provided that they are appended to the end of the base boot
file or appear within a later boot file.
\subsection{Misleading cyclic dependency error (9.5)} \subsection{Misleading cyclic dependency error (9.5)}
The library system no longer reports a cyclic dependency error The library system no longer reports a cyclic dependency error

70
s/7.ss
View File

@ -185,36 +185,42 @@
(let () (let ()
(define do-load-binary (define do-load-binary
(lambda (who fn ip situation for-import?) (lambda (who fn ip situation for-import?)
(module (Lexpand? visit-stuff? visit-stuff-inner revisit-stuff? revisit-stuff-inner (let ([load-binary (make-load-binary who fn situation for-import?)])
recompile-info? library/ct-info? library/rt-info? program-info?) (let loop ()
(import (nanopass)) (let ([x (fasl-read ip)])
(include "base-lang.ss") (cond
(include "expand-lang.ss")) [(eof-object? x) (close-port ip)]
(define unexpected-value! [else (load-binary x) (loop)]))))))
(lambda (x)
($oops who "unexpected value ~s read from ~a" x fn))) (define (make-load-binary who fn situation for-import?)
(let loop () (module (Lexpand? visit-stuff? visit-stuff-inner revisit-stuff? revisit-stuff-inner
(let ([x (fasl-read ip)]) recompile-info? library/ct-info? library/rt-info? program-info?)
(define run-inner (import (nanopass))
(lambda (x) (include "base-lang.ss")
(cond (include "expand-lang.ss"))
[(procedure? x) (x)] (define unexpected-value!
[(library/rt-info? x) ($install-library/rt-desc x for-import? fn)] (lambda (x)
[(library/ct-info? x) ($install-library/ct-desc x for-import? fn)] ($oops who "unexpected value ~s read from ~a" x fn)))
[(program-info? x) ($install-program-desc x)] (define run-inner
[else (unexpected-value! x)]))) (lambda (x)
(define run-outer (cond
(lambda (x) [(procedure? x) (x)]
(cond [(library/rt-info? x) ($install-library/rt-desc x for-import? fn)]
[(recompile-info? x) (void)] [(library/ct-info? x) ($install-library/ct-desc x for-import? fn)]
[(revisit-stuff? x) (when (memq situation '(load revisit)) (run-inner (revisit-stuff-inner x)))] [(program-info? x) ($install-program-desc x)]
[(visit-stuff? x) (when (memq situation '(load visit)) (run-inner (visit-stuff-inner x)))] [else (unexpected-value! x)])))
[else (run-inner x)]))) (define run-outer
(cond (lambda (x)
[(eof-object? x) (close-port ip)] (cond
[(vector? x) (vector-for-each run-outer x) (loop)] [(recompile-info? x) (void)]
[(Lexpand? x) ($interpret-backend x situation for-import? fn) (loop)] [(revisit-stuff? x) (when (memq situation '(load revisit)) (run-inner (revisit-stuff-inner x)))]
[else (run-outer x) (loop)]))))) [(visit-stuff? x) (when (memq situation '(load visit)) (run-inner (visit-stuff-inner x)))]
[else (run-inner x)])))
(lambda (x)
(cond
[(vector? x) (vector-for-each run-outer x)]
[(Lexpand? x) ($interpret-backend x situation for-import? fn)]
[else (run-outer x)])))
(define (do-load who fn situation for-import? ksrc) (define (do-load who fn situation for-import? ksrc)
(let ([ip ($open-file-input-port who fn)]) (let ([ip ($open-file-input-port who fn)])
@ -246,6 +252,10 @@
(set! ip (transcoded-port ip (current-transcoder))) (set! ip (transcoded-port ip (current-transcoder)))
(ksrc ip sfd ($make-read ip sfd fp))))))))) (ksrc ip sfd ($make-read ip sfd fp)))))))))
(set! $make-load-binary
(lambda (fn situation for-import?)
(make-load-binary '$make-load-binary fn situation for-import?)))
(set-who! load-program (set-who! load-program
(rec load-program (rec load-program
(case-lambda (case-lambda

View File

@ -2072,6 +2072,7 @@
($make-fptr [flags pure mifoldable discard true]) ($make-fptr [flags pure mifoldable discard true])
($make-graph-env [flags]) ($make-graph-env [flags])
($make-library-requirements-options [flags pure discard true]) ($make-library-requirements-options [flags pure discard true])
($make-load-binary [flags])
($make-object-finder [flags]) ($make-object-finder [flags])
($make-promise [flags alloc]) ($make-promise [flags alloc])
($make-read [flags]) ($make-read [flags])