fix module-code caching

Fixes a problem with c4508ad0d9, which disabled module-code
caching too often. A symptom of the disabled cache was that
running "math/scribblings/math.scrbl" would use twice
as much memory.
This commit is contained in:
Matthew Flatt 2014-09-03 11:52:08 +02:00
parent 65453037d5
commit b942a21846
2 changed files with 63 additions and 22 deletions

View File

@ -1163,17 +1163,7 @@
;; Check that module caching doesn't cause submodules ;; Check that module caching doesn't cause submodules
;; to be loaded/declared too early ;; to be loaded/declared too early
(let () (define (install-module-hashes! s start len c)
(define dir (find-system-path 'temp-dir))
(define tmx (build-path dir "tmx.rkt"))
(define e (compile '(module tmx racket/base
(module s racket/base
(provide x)
(define x 1)))))
(make-directory* (build-path dir "compiled"))
(define zo-path (build-path dir "compiled" "tmx_rkt.zo"))
(define (install-module-hashes! s start len c)
(define vlen (bytes-ref s (+ start 2))) (define vlen (bytes-ref s (+ start 2)))
(define mode (integer->char (bytes-ref s (+ start 3 vlen)))) (define mode (integer->char (bytes-ref s (+ start 3 vlen))))
(case mode (case mode
@ -1194,6 +1184,16 @@
(void)] (void)]
[else (error "unknown")])) [else (error "unknown")]))
(let ()
(define dir (find-system-path 'temp-dir))
(define tmx (build-path dir "tmx.rkt"))
(define e (compile '(module tmx racket/base
(module s racket/base
(provide x)
(define x 1)))))
(make-directory* (build-path dir "compiled"))
(define zo-path (build-path dir "compiled" "tmx_rkt.zo"))
(define bstr (define bstr
(let ([b (open-output-bytes)]) (let ([b (open-output-bytes)])
(write e b) (write e b)
@ -1216,6 +1216,45 @@
(test 1 dynamic-require `(submod ,tmx s) 'x)) (test 1 dynamic-require `(submod ,tmx s) 'x))
(delete-file zo-path)) (delete-file zo-path))
;; Check that module-code caching works
(let ()
(define dir (find-system-path 'temp-dir))
(define tmx (build-path dir "tmx2.rkt"))
(define e (compile '(module tmx2 racket/kernel
(#%provide x)
(define-values (x) 1))))
(make-directory* (build-path dir "compiled"))
(define zo-path (build-path dir "compiled" "tmx2_rkt.zo"))
(define bstr
(let ([b (open-output-bytes)])
(write e b)
(let* ([s (get-output-bytes b)])
(install-module-hashes! s 0 (bytes-length s) 100)
s)))
(call-with-output-file zo-path
#:exists 'truncate
(lambda (o)
(write-bytes bstr o)))
(parameterize ([current-namespace (make-base-namespace)]
[current-module-declare-name (make-resolved-module-path tmx)]
[current-load-relative-directory dir])
(eval (parameterize ([read-accept-compiled #t])
(read (open-input-bytes bstr)))))
;; Mangle the bytecode file; cached variant should be used:
(call-with-output-file zo-path
#:exists 'update
(lambda (o)
(file-position o (- (file-size zo-path) 100))
(write-bytes (make-bytes 100 (char->integer #\!)) o)))
(test 2 add1
(parameterize ([current-namespace (make-base-namespace)])
(dynamic-require tmx 'x)))
(delete-file zo-path))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(report-errs) (report-errs)

View File

@ -6497,7 +6497,9 @@ static Scheme_Object *do_module_execute(Scheme_Object *data, Scheme_Env *genv,
m = MALLOC_ONE_TAGGED(Scheme_Module); m = MALLOC_ONE_TAGGED(Scheme_Module);
memcpy(m, data, sizeof(Scheme_Module)); memcpy(m, data, sizeof(Scheme_Module));
if (set_cache && m->code_key && !m->pre_submodules && !m->post_submodules) { if (set_cache && m->code_key
&& (!m->pre_submodules || SCHEME_NULLP(m->pre_submodules))
&& (!m->post_submodules || SCHEME_NULLP(m->post_submodules))) {
if (!scheme_module_code_cache) { if (!scheme_module_code_cache) {
REGISTER_SO(scheme_module_code_cache); REGISTER_SO(scheme_module_code_cache);
scheme_module_code_cache = scheme_make_weak_equal_table(); scheme_module_code_cache = scheme_make_weak_equal_table();