Base now works, but was broken before

This commit is contained in:
Jay McCarthy 2013-10-15 07:51:14 -06:00
parent a460ab960c
commit e6e95f1029
4 changed files with 52 additions and 35 deletions

View File

@ -9,7 +9,7 @@
"nodep.rkt" "nodep.rkt"
"update-toplevels.rkt") "update-toplevels.rkt")
(define MODULE-TOPLEVEL-OFFSETS (make-hash)) (define MODULE-TOPLEVEL-OFFSETS (make-hasheq))
(define current-get-modvar-rewrite (make-parameter #f)) (define current-get-modvar-rewrite (make-parameter #f))
(define (merge-compilation-top get-modvar-rewrite top) (define (merge-compilation-top get-modvar-rewrite top)
@ -61,16 +61,20 @@
(append root-toplevels mod-toplevels) (append root-toplevels mod-toplevels)
(append root-stxs mod-stxs))])])) (append root-stxs mod-stxs))])]))
(struct toplevel-offset-rewriter (rewrite-fun meta) #:transparent)
(define (compute-new-modvar mv rw) (define (compute-new-modvar mv rw)
(match mv (match mv
[(struct module-variable (modidx sym pos phase constantness)) [(struct module-variable (modidx sym pos phase constantness))
(match rw (match rw
[(struct modvar-rewrite (self-modidx provide->toplevel)) [(struct modvar-rewrite (self-modidx provide->toplevel))
(log-debug (format "Rewriting ~a of ~S" pos (mpi->path* modidx))) (log-debug (format "Rewriting ~a of ~S" pos (mpi->path* modidx)))
((hash-ref MODULE-TOPLEVEL-OFFSETS self-modidx (match-define (toplevel-offset-rewriter rewrite-fun meta)
(hash-ref MODULE-TOPLEVEL-OFFSETS self-modidx
(lambda () (lambda ()
(error 'compute-new-modvar "toplevel offset not yet computed: ~S" self-modidx))) (error 'compute-new-modvar "toplevel offset not yet computed: ~S" self-modidx))))
(provide->toplevel sym pos))])])) (log-debug (format "Rewriting ~a of ~S from ~S" pos (mpi->path* modidx) meta))
(rewrite-fun (provide->toplevel sym pos))])]))
(define (filter-rewritable-module-variable? toplevel-offset mod-toplevels) (define (filter-rewritable-module-variable? toplevel-offset mod-toplevels)
(define-values (define-values
@ -119,7 +123,8 @@
(define topsyntax-offset (length (prefix-stxs top-prefix))) (define topsyntax-offset (length (prefix-stxs top-prefix)))
(define lift-offset (prefix-num-lifts top-prefix)) (define lift-offset (prefix-num-lifts top-prefix))
(define mod-toplevels (prefix-toplevels mod-prefix)) (define mod-toplevels (prefix-toplevels mod-prefix))
(define-values (new-mod-toplevels toplevel-remap) (filter-rewritable-module-variable? toplevel-offset mod-toplevels)) (define-values (new-mod-toplevels toplevel-remap)
(filter-rewritable-module-variable? toplevel-offset mod-toplevels))
(define num-mod-toplevels (define num-mod-toplevels
(length toplevel-remap)) (length toplevel-remap))
(define mod-stxs (define mod-stxs
@ -129,9 +134,16 @@
(define new-mod-prefix (define new-mod-prefix
(struct-copy prefix mod-prefix (struct-copy prefix mod-prefix
[toplevels new-mod-toplevels])) [toplevels new-mod-toplevels]))
(define offset-meta (vector name srcname self-modidx))
(log-debug "Setting toplevel offsets rewriter for ~S and it is currently ~S"
offset-meta
(hash-ref MODULE-TOPLEVEL-OFFSETS self-modidx #f))
(hash-set! MODULE-TOPLEVEL-OFFSETS self-modidx (hash-set! MODULE-TOPLEVEL-OFFSETS self-modidx
(toplevel-offset-rewriter
(lambda (n) (lambda (n)
(list-ref toplevel-remap n))) (log-debug "Finding offset ~a in ~S of ~S" n toplevel-remap offset-meta)
(list-ref toplevel-remap n))
offset-meta))
(unless (= (length toplevel-remap) (unless (= (length toplevel-remap)
(length mod-toplevels)) (length mod-toplevels))
(error 'merge-module "Not remapping everything: ~S ~S" (error 'merge-module "Not remapping everything: ~S ~S"

View File

@ -128,10 +128,13 @@
(when (symbol? tl) (when (symbol? tl)
(hash-set! provide-ht (intern tl) i))) (hash-set! provide-ht (intern tl) i)))
(lambda (sym pos) (lambda (sym pos)
(log-debug (format "Looking up ~S@~a" sym pos)) (log-debug (format "Looking up ~S@~a in ~S" sym pos prefix))
(define res
(hash-ref provide-ht (intern sym) (hash-ref provide-ht (intern sym)
(lambda () (lambda ()
(error 'provide->toplevel "Cannot find ~S in ~S" sym prefix))))) (error 'provide->toplevel "Cannot find ~S in ~S" sym prefix))))
(log-debug (format "Looked up ~S@~a and got ~v" sym pos res))
res))
(define (nodep-module mod-form phase) (define (nodep-module mod-form phase)
(match mod-form (match mod-form

View File

@ -13,7 +13,7 @@
(values (get-output-string o) (get-output-string e))) (values (get-output-string o) (get-output-string e)))
(define (test-on-program filename) (define (test-on-program filename)
; run modular program, capture output ;; run modular program, capture output
(define-values (modular-output modular-error) (define-values (modular-output modular-error)
(capture-output (find-exe) filename)) (capture-output (find-exe) filename))
@ -24,15 +24,15 @@
(find-system-path 'temp-dir) (find-system-path 'temp-dir)
(path-add-suffix filename #"_merged.zo"))))) (path-add-suffix filename #"_merged.zo")))))
; demodularize ;; demodularize
(parameterize ([current-input-port (open-input-string "")]) (parameterize ([current-input-port (open-input-string "")])
(system* (find-exe) "-l-" "raco" "demod" "-o" demod-filename filename)) (system* (find-exe) "-l-" "raco" "demod" "-o" demod-filename filename))
; run whole program ;; run whole program
(define-values (whole-output whole-error) (define-values (whole-output whole-error)
(capture-output (find-exe) demod-filename)) (capture-output (find-exe) demod-filename))
; compare output ;; compare output
(test (test
#:failure-prefix (format "~a stdout" filename) #:failure-prefix (format "~a stdout" filename)
whole-output => modular-output whole-output => modular-output

View File

@ -0,0 +1,2 @@
#lang racket/base
5